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

问题描述:

我在这里真的很苦恼。我有一个我开发的简单的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

原来,在我deploy.wsgi文件我引用lib64的,而不是仅仅LIB。所有的网站包存在于lib

更改并重新启动Apache之后,我可以通过URL成功地启动我的服务。

+0

你的这篇文章帮了我很多。非常感谢.. – Arun