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

时间:2016-02-13 21:17:59

标签: python apache amazon-ec2 flask mod-wsgi

我真的在这里挣扎。我有一个简单的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 install httpd24 mod24_wsgi
  4. 启动Apache, sudo service httpd start
  5. 将Apache配置为自动启动, sudo chkconfig httpd
  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
    • 查找/ var / www -type d -exec sudo chmod 2775 {} \;
    • 查找/ var / www -type f -exec sudo chmod 0664 {} \;
  8. 通过点击我的EC2框的DNS进行测试 - 到目前为止仍然很好。
  9. 现在我知道我的实例正在运行,我想创建两个文件夹,我可以测试并运行我的Python Flask代码。我按如下方式这样做:

    1. 我创建了两个文件夹,一个用于开发,另一个用于生产。
      • 的/ var / WWW /休息-dev的/
      • 的/ var / WWW /休息-PROD /
    2. 我在每个文件夹中设置了一个虚拟环境并安装了Flask。
      • virtualenv env
      • env / bin / pip install Flask
      • 然后我在每个文件夹中放置了我的服务副本。
      • 然后我在app.py上设置权限, chmod a + x app.py
      • 我可以成功执行./app.py并通过点击DNS名称+端口5000来测试服务。它可以工作。
    3. 现在这是我被绊倒的地方。我的目标是能够点击 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)
      

1 个答案:

答案 0 :(得分:5)

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

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