我真的在这里挣扎。我有一个简单的Python Flask REST API,我已经开发了。 API在我的本地开发环境(Mac OS X)中运行良好,并且在我的EC2实例上通过控制台直接执行。
我想将此服务转移到生产环境中,因此希望将其托管在EC2实例上运行的Apache后面。这是我不断碰壁的地方,我似乎无法通过配置和错误。我在网上研究了几篇文章和问题,似乎没有人能够帮助我。
我希望有人可以向我提供有关如何在Amazon Linux EC2实例上运行的Apache后面部署我的服务的分步说明。
以下是我采取的步骤:
现在我知道我的实例正在运行,我想创建两个文件夹,我可以测试并运行我的Python Flask代码。我按如下方式这样做:
现在这是我被绊倒的地方。我的目标是能够点击 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)
答案 0 :(得分:5)
事实证明,在我的deploy.wsgi文件中,我引用的是 lib64 ,而不仅仅是 lib 。所有站点包都存在于 lib 中。
更改它并重新启动Apache后,我能够从URL成功点击我的服务。