簡體   English   中英

如何將Python Flask應用程序部署到在Amazon Linux EC2實例上運行的Apache(Httpd)

[英]How to deploy Python Flask app to Apache (Httpd) running on Amazon Linux EC2 instance

我真的在這里掙扎。 我有一個簡單的Python Flask REST API,我已經開發了。 API在我的本地開發環境(Mac OS X)中運行良好,並且在我的EC2實例上通過控制台直接執行。

我想將此服務轉移到生產中,因此希望將其托管在EC2實例上運行的Apache之后。 這是我不斷碰壁的地方,我似乎無法通過配置和錯誤。 我在網上研究了幾篇文章和問題,似乎沒有人能夠幫助我。

我希望有人在這里可以為我提供有關如何在Amazon Linux EC2實例上運行的Apache后面部署我的服務的分步指導。

以下是我采取的步驟:

  1. 推出了基本的Amazon Linux EC2實例。
  2. 將更新應用於實例sudo yum update
  3. 安裝Apache和WSIG, sudo yum安裝httpd24 mod24_wsgi
  4. 啟動Apache, sudo服務httpd啟動
  5. 配置Apache自動啟動, sudo chkconfig httpd on
  6. 點擊我的EC2框的DNS進行測試。 我成功獲得了Amazon Linux AMI測試頁面。
  7. 調整/ var / www的權限如下
    • sudo groupadd www
    • sudo usermod -a -G www ec2-user
    • 登錄/關閉並確認會員資格, 群組
    • 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 {} \\;
  8. 通過點擊我的EC2框的DNS進行測試 - 到目前為止仍然很好。

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

  1. 我創建了兩個文件夾,一個用於開發,一個用於生產。
    • 在/ var / WWW /休息-dev /目錄
    • 在/ var / WWW /休息-PROD /
  2. 我在每個文件夾中設置了一個虛擬環境並安裝了Flask。
    • virtualenv env
    • env / bin / pip安裝Flask
    • 然后我在每個文件夾中放置我的服務副本。
    • 然后我在app.py上設置權限, chmod a + 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錯誤頁面,並且不再加載任何內容,包括默認的Amazon 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文件,位於rest-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

這是我在/etc/httpd/conf.d/中的vhost.conf文件

<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)

事實證明,在我的deploy.wsgi文件中,我引用的是lib64,而不僅僅是lib 所有站點包都存在於lib中

更改它並重新啟動Apache后,我能夠從URL成功訪問我的服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM