【问题标题】:Deploying Flask app on EC2 for localhost access在 EC2 上部署 Flask 应用程序以进行 localhost 访问
【发布时间】:2013-12-26 18:40:36
【问题描述】:

我已经完成了一个简单的 Flask 应用程序,我正在尝试使用 Apache2 在 AWS EC2 实例上托管该应用程序。我一直在关注this tutorial

我在开发过程中所做的唯一更改(当我运行应用程序然后尝试通过 localhost 访问它时,应用程序运行完全正常)是:

1) Moved all the code in to /var/www
2) Changed it so that 
        if __name__=='__main__':
            app.run(debug = False) #Now False instead of True
3) Added a app.wsgi file
4) Added file my_app to /etc/apache2/sites-available
5) Ran these commands:
    $ sudo a2dissite default
    $ sudo a2ensite sitename.com
    $ sudo /etc/init.d/apache2 restart

这里是 app.wsgi 文件:

import sys 
sys.path.insert(0, '/var/www/my_app')

from app import app as application

这是/etc/apache2/sites-available中的my_app文件:

<VirtualHost *:5000>
         WSGIDaemonProcess app 
     WSGIScriptAlias / /var/www/my_app/app.wsgi

     <Directory /var/www/my_app>
            WSGIProcessGroup app 
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from 127.0.0.1
     </Directory>
</VirtualHost>

从上面的文件可以看出,我只希望烧瓶应用在 localhost 上可用。

当我运行 apache 并尝试访问位于 my_site.com:5000 的网站时,我收到“无法连接错误”。我真的不知道为什么。任何帮助,将不胜感激。

另外,如果需要的话,这里是我的 Flask 应用程序本身的目录结构:

/var/www/my_app/
    app/
        __init__.py
        static/
            css/
                bootstrap.css
            favicon.ico
            js/
                bootstrap.js
        templates/
            base.html
            index.html
            search.html
        views.py
    app.wsgi
    flask/           #my virtualenv
        #Your typical virutalenv structure
    flask_util_js.py   #File that is a FLask entension for client-side generation of URLs
    requirements.txt
    run.py
    virtualenv.py    #Creates virutalenv flask

更新:

所以,我觉得我设置代码的方式存在问题。所以我把run.py__init__.pyviews.py中的所有东西都拿走了,然后做了一个大的main.py。我已将app.wsgi 更新为如下所示:

app.wsgi

import sys 

activate_this = '/home/achumbley/flask/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

sys.path.insert(0, '/home/achumbley/new_flask_app')

from main import app as application

现在,我的/etc/apache2/sites-available/new_flask_app 看起来像:

<VirtualHost *>
  ServerName dev.east.appliedminds.com

  WSGIDaemonProcess app 
  WSGIScriptAlias / /var/www/app.wsgi

 <Directory /home/achumbley/new_flask_app>
   WSGIProcessGroup main
   WSGIScriptReloading On
   WSGIApplicationGroup %{GLOBAL}
   Order deny,allow
   Allow from all
 </Directory>

最后,他是我最新的目录结构:

/home/my_username/new_flask_app/
    logging.log
    flask_util_js.py
    main.py
    static/
    templates/

还是不行。但是,我可能不明白如何运行整个事情。我应该运行python main.py 对吗?它应该是自动的,至少我是这么认为的。

【问题讨论】:

    标签: python apache amazon-ec2 flask


    【解决方案1】:

    将所有代码移入 /var/www

    这是错误的。您需要将代码发布在不可通过网络访问的目录中。仅将您的静态文件发布到/var/www

    请参阅official deployment guide,了解如何使用 Apache 和 mod_wsgi 进行设置。如果你有问题,你可以考虑this AMI image,它安装了flask、nginx和uwsgi。

    nginx+uwsgi栈也是detailed in the documentation

    以下是您需要遵循的步骤(简化):

    假设你的应用是:

    my_app/
       static/
          logo.gif
          style.css
       templates/
          index.html
       main.py
    

    然后按照以下说明操作:

    1. 将所有代码上传到/home/youruser/
    2. 上传app.wsgi文件到/var/www/
    3. 上传静态目录内容到/var/www/static
    4. app.wsgi 文件中:

      import sys
      sys.path.append(0, '/home/youruser/my_app')
      
      from main import app as application
      

    【讨论】:

    • 好的,所以我将代码移回了那里,并在 app.wsgi 文件中使用了应用程序的绝对路径。重启了apache,还是不行。它现在应该工作吗?此外,我还看到了很多其他示例,它们显示了位于 /var/www 中的整个应用程序,您确定不允许在其中包含代码吗?
    • 是的,绝对确定。 app 目录中没有 app,这就是它不起作用的原因。导入行应引用具有 if __name__ == '__main__' 行的模块。
    • 哎呀,所以我已经完全重构了我的代码,以便所有内容都包含在示例中的 main.py 中。我认为我做的一切都是正确的。但它仍然无法为我的应用服务...更新问题
    【解决方案2】:

    你在 apache 上启用了 mod_wsgi 吗?

    a2enmod wsgi 
    service apache2 restart
    

    我也会尝试一个简单的“hello world”示例,这将是 /home/ubuntu/new_flask_app 下 main.py 的内容:

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        return 'Hello World!'
    
    if __name__ == '__main__':
        app.run()
    

    这是我的工作示例的烧瓶 apache 配置示例:

    <VirtualHost *:80>
        ServerAdmin webmaster@localhost
    
        ServerName app.com
    
        WSGIDaemonProcess new_flash_app user=ubuntu group=ubuntu threads=5
        WSGIScriptAlias / /var/www/app/app.wsgi
    
        <Directory /var/www/app>
            WSGIProcessGroup new_flash_app
            WSGIApplicationGroup %{GLOBAL}
            Order deny,allow
            Allow from all
        </Directory>
    
    </VirtualHost>
    

    这将是 app.wsi 的内容

    import sys
    
    activate_this = '/home/ubuntu/flask/bin/activate_this.py'
    execfile(activate_this, dict(__file__=activate_this))
    
    sys.path.insert(0, '/home/ubuntu/new_flask_app')
    
    from main import app as application
    

    顺便说一句,您的 wsgi 和 main.py(或应用程序文件)不需要在同一目录中,只需确保配置指向正确的文件即可。

    你可以像这样测试你的服务器:

    $ telnet localhost 80
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    GET /
    Hello World!Connection closed by foreign host.
    $
    

    我还会检查 apache 日志/var/log/apache2/error.log

    您也可以像 (Burhan Khalid) 提到的那样尝试 nginx。

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多