2016-02-13 65 views
2

我在這裏真的很苦惱。我有一個我開發的簡單的Python Flask REST API。 API在我的本地開發環境(Mac OS X)中正常運行,並通過EC2實例上的控制檯直接執行。如何將Python Flask應用程序部署到在Amazon Linux EC2實例上運行的Apache(Httpd)

我想將此服務轉換爲生產,並且希望將其託管在EC2實例上運行的Apache後面。這是我一直打牆的地方,我似乎無法擺脫配置和錯誤。我在網上搜索了幾篇文章,並在這裏提出了一些問題,似乎沒有人能夠幫助我。

我希望這裏有人能夠向我提供關於如何將服務部署到在Amazon Linux EC2實例上運行的Apache後面的分步指導。

下面是我所採取的措施:推出一個基本的Linux亞馬遜EC2實例

  1. 將更新應用到該實例,須藤yum的更新
  2. 安裝Apache和WSIG,須藤yum的安裝httpd24 mod24_wsgi
  3. 啓動Apache,須藤服務的httpd啓動
  4. 配置Apache自動啓動, sudo chkconfig httpd on
  5. 通過點擊我的EC2框的DNS進行測試。我成功獲取了Amazon Linux AMI測試頁面。
  6. 調節上/無功/網絡權限如下
    • 須藤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 {} \;
  7. 通過點擊我的EC2框的DNS進行測試 - 目前爲止仍然不錯。

現在,我知道我的實例正在運行,我想創建兩個文件夾,我可以測試並運行我的Python Flask代碼。我這樣做如下:

  1. 我創建兩個文件夾,一個用於開發和一個用於生產。
    • 在/ var/WWW /休息-dev /目錄
    • 在/ var/WWW /休息-PROD/
  2. 我設置在每個文件夾的虛擬環境,並安裝瓶。
    • 的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) 
+0

[WSGIDaemonProcess](https://github.com/GrahamDumpleton/mod_wsgi-docs/blob/master/configuration-directives/WSGIDaemonProcess.rst)指令中的'user'和'group'設置僅適用於apache以root身份啓動,它可能不在這裏。這意味着所有文件和目錄(包括virtualenv目錄!)都需要由apache用戶訪問。你確定他們是? – mata

+0

我不知道。如有需要,我如何分辨和更改? – K997

+0

你可以'su'給apache用戶,看看你是否可以訪問它('sudo su apache -s/bin/bash')。如果沒有,你可以使目錄具有世界可讀性('chmod a + rX venvdir')或由apache-group和組可讀('chmod g + rX -R venvdir')擁有... – mata

回答

3

原來,在我deploy.wsgi文件我引用lib64的,而不是僅僅LIB。所有的網站包存在於lib

更改並重新啓動Apache之後,我可以通過URL成功地啓動我的服務。

+0

你的這篇文章幫了我很多。非常感謝.. – Arun

相關問題