我在這裏真的很苦惱。我有一個我開發的簡單的Python Flask REST API。 API在我的本地開發環境(Mac OS X)中正常運行,並通過EC2實例上的控制檯直接執行。如何將Python Flask應用程序部署到在Amazon Linux EC2實例上運行的Apache(Httpd)
我想將此服務轉換爲生產,並且希望將其託管在EC2實例上運行的Apache後面。這是我一直打牆的地方,我似乎無法擺脫配置和錯誤。我在網上搜索了幾篇文章,並在這裏提出了一些問題,似乎沒有人能夠幫助我。
我希望這裏有人能夠向我提供關於如何將服務部署到在Amazon Linux EC2實例上運行的Apache後面的分步指導。
下面是我所採取的措施:推出一個基本的Linux亞馬遜EC2實例
- 。
- 將更新應用到該實例,須藤yum的更新
- 安裝Apache和WSIG,須藤yum的安裝httpd24 mod24_wsgi
- 啓動Apache,須藤服務的httpd啓動
- 配置Apache自動啓動, sudo chkconfig httpd on
- 通過點擊我的EC2框的DNS進行測試。我成功獲取了Amazon Linux AMI測試頁面。
- 調節上/無功/網絡權限如下
- 須藤GROUPADD WWW
- 須藤usermod命令-a -G WWW EC2用戶
- 登錄/電源並確認會員資格,基
- sudo chown -R root:www/var/www
- sudo chmod 2775/var/www
- find/var/www -type d -exec sudo chmod 2775 {} \;
- find/var/www -type f -exec sudo chmod 0664 {} \;
- 通過點擊我的EC2框的DNS進行測試 - 目前爲止仍然不錯。
現在,我知道我的實例正在運行,我想創建兩個文件夾,我可以測試並運行我的Python Flask代碼。我這樣做如下:
- 我創建兩個文件夾,一個用於開發和一個用於生產。
- 在/ var/WWW /休息-dev /目錄
- 在/ var/WWW /休息-PROD/
- 我設置在每個文件夾的虛擬環境,並安裝瓶。
- 的virtualenv ENV
- ENV /斌/ PIP安裝瓶
- 然後我把我的服務的副本,每個文件夾中。
- 然後我設置app.py權限,CHMOD一個+ X app.py
- 我能成功地執行./app.py並通過敲擊DNS名稱+端口5000。它的工作原理測試服務。
現在,這是我被絆倒的地方。我的目標是能夠打到api.example.com並讓我的服務的根加載。在下面的示例代碼中,「Hello,World!」應該簡單地顯示。
我按照這裏找到的教程沒有運氣。
http://peatiscoding.me/geek-stuff/mod_wsgi-apache-virtualenv/
http://webpy.org/cookbook/mod_wsgi-apache
http://www.jakowicz.com/flask-apache-wsgi/
上述中的任何條款的執行任何的步驟後,我得到一個HTTP錯誤頁面,並沒有加載了,包括默認亞馬遜的Linux AMI試驗頁。以下是我更改的代碼和配置。我沒有改變我的httpd.conf ...我應該嗎?可能還有其他一些我錯過的東西。
有人可以幫我提供詳細的必要步驟來糾正我的錯誤嗎?
非常感謝提前!
當我查看httpd的error_log裏,它列出了這樣的錯誤:
mod_wsgi (pid=8270): Target WSGI script '/var/www/rest-dev/deploy.wsgi' cannot be loaded as Python module.
mod_wsgi (pid=8270): Exception occurred processing WSGI script '/var/www/rest-dev/deploy.wsgi'.
Traceback (most recent call last):
File "/var/www/rest-dev/deploy.wsgi", line 16, in <module>
from app import app as application
File "/var/www/rest-dev/app.py", line 2, in <module>
from flask import Flask
ImportError: No module named flask
這裏是我的deploy.wsgi文件,位於其餘-dev的文件夾:
import os
import sys
import site
# Add virtualenv site packages
site.addsitedir(os.path.join(os.path.dirname(__file__), 'env/local/lib64/python2.7/site-packages'))
# Path of execution
sys.path.append('/var/www/rest-dev')
# Fired up virtualenv before include application
activate_env = os.path.expanduser(os.path.join(os.path.dirname(__file__), 'env/bin/activate_this.py'))
execfile(activate_env, dict(__file__=activate_env))
# import my_flask_app as application
from app import app as application
這是我的vhost.conf文件位於/etc/httpd/conf.d/中
<VirtualHost *:80>
ServerName api.example.com
WSGIDaemonProcess webtool user=ec2-user group=www threads=5 home=/var/www/rest-dev/
WSGIScriptAlias//var/www/rest-dev/deploy.wsgi
<directory /var/www/rest-dev>
WSGIProcessGroup webtool
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Order deny,allow
Allow from all
</directory>
</VirtualHost>
這是我app.py參考例如服務代碼:
#!env/bin/python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return "Hello, World!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
[WSGIDaemonProcess](https://github.com/GrahamDumpleton/mod_wsgi-docs/blob/master/configuration-directives/WSGIDaemonProcess.rst)指令中的'user'和'group'設置僅適用於apache以root身份啓動,它可能不在這裏。這意味着所有文件和目錄(包括virtualenv目錄!)都需要由apache用戶訪問。你確定他們是? – mata
我不知道。如有需要,我如何分辨和更改? – K997
你可以'su'給apache用戶,看看你是否可以訪問它('sudo su apache -s/bin/bash')。如果沒有,你可以使目錄具有世界可讀性('chmod a + rX venvdir')或由apache-group和組可讀('chmod g + rX -R venvdir')擁有... – mata