首页 文章

如何将Python Flask应用程序部署到在Amazon Linux EC2实例上运行的Apache(Httpd)

提问于
浏览
4

我真的在这里挣扎 . 我有一个简单的Python Flask REST API,我已经开发了 . API在我的本地开发环境(Mac OS X)中运行良好,并且在我的EC2实例上通过控制台直接执行 .

我想将此服务转移到 生产环境 中,因此希望将其托管在EC2实例上运行的Apache之后 . 这是我不断碰壁的地方,我似乎无法通过配置和错误 . 我在网上研究了几篇文章和问题,似乎没有人能够帮助我 .

我希望有人在这里可以为我提供有关如何在Amazon Linux EC2实例上运行的Apache后面部署我的服务的分步指导 .

以下是我采取的步骤:

  • 推出了基本的Amazon Linux EC2实例 .

  • 对实例应用更新, sudo yum update

  • 安装Apache和WSIG, sudo yum install httpd24 mod24_wsgi

  • 启动Apache, sudo service httpd start

  • 配置Apache自动启动, sudo chkconfig httpd on

  • 点击我的EC2框的DNS进行测试 . 我成功获得了Amazon Linux AMI测试页面 .

  • 如下调整/ var / www的权限

  • sudo groupadd www

  • sudo usermod -a -G www ec2-user

  • 登录/关闭并确认会员资格, groups

  • 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 / rest-dev /

  • / var / www / rest-prod /

  • 我在每个文件夹中设置了一个虚拟环境并安装了Flask .

  • virtualenv env

  • env/bin/pip install 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 ......我应该吗?可能还有其他一些我缺少的东西 .

Can someone please help me by providing me the necessary steps in detail to correct my mistakes?

提前谢谢了!

当我查看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)

1 回答

  • 5

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

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

相关问题