如何将 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 运行ning 后面托管它。这是我一直碰壁的地方,我似乎无法克服配置和错误。我在网上研究了几篇文章并在这里提出问题,none 似乎可以帮助我。

我希望这里有人可以向我提供有关如何在 Amazon Linux EC2 实例上的 Apache 运行ning 后面将我的服务部署到生产中的分步指导。

以下是我采取的步骤:

  1. 启动了一个基本的 Amazon Linux EC2 实例。
  2. 对实例应用更新,sudo yum update
  3. 安装 Apache 和 WSIG,sudo yum install httpd24 mod24_wsgi
  4. 启动Apache,sudo service httpd start
  5. 配置Apache自动启动,sudo chkconfig httpd on
  6. 通过访问我的 EC2 机器的 DNS 进行测试。我成功获取亚马逊 Linux AMI 测试页
  7. 对/var/www的权限调整如下
    • sudo groupadd www
    • sudo usermod -a -G www ec2-user
    • Logon/off 并确认成员资格,群组
    • sudo chown -R root:www /var/www
    • sudo chmod 2775 /var/www
    • 找到/var/www -type d -exec sudo chmod 2775 {} \;
    • 找到/var/www -type f -exec sudo chmod 0664 {} \;
  8. 通过访问我的 EC2 机器的 DNS 进行测试 - 到目前为止仍然很好。

既然我知道我的实例是 运行ning,我想创建两个文件夹,我可以在其中测试和 运行 我的 Python Flask 代码。我这样做如下:

  1. 我创建了两个文件夹,一个用于开发,一个用于生产。
    • /var/www/rest-dev/
    • /var/www/rest-prod/
  2. 我在每个文件夹中设置了一个虚拟环境并安装了 Flask。
    • virtualenv 环境
    • 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

这是我的 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)

事实证明,在我的 deploy.wsgi 文件中,我引用了 lib64 而不仅仅是 lib。所有站点包都存在于 lib 中。

更改它并重新启动 Apache 后,我能够从 URL 成功访问我的服务。