使用 nginx 和 gunicorn 运行烧瓶应用程序

Posted

技术标签:

【中文标题】使用 nginx 和 gunicorn 运行烧瓶应用程序【英文标题】:Running a flask app with nginx and gunicorn 【发布时间】:2012-11-19 13:16:50 【问题描述】:

我是新手,只使用 nginx 来提供静态文件。我现在已经安装了烧瓶和 gunicorn。如果我运行gunicorn -b 127.0.0.2:8000 hello:app 然后从服务器中获取它,它运行良好。但是,如果我尝试从浏览器访问它,它会返回 404 错误(我在托管位于根目录的 wordpress 站点的服务器上运行它)。

烧瓶应用:

from flask import Flask
from werkzeug.contrib.fixers import ProxyFix
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello world!"

app.wsgi_app = ProxyFix(app.wsgi_app)

if __name__ == '__main__':
    app.run()

以及我的 nginx 配置的相关部分:

location /flask 
                 proxy_set_header       Host            $http_host;
                 proxy_set_header       X-Real-IP       $remote_addr;
                 proxy_set_header       X-Forwarded-For $proxy_add_x_forwarded_\
for;
                 proxy_pass             http://127.0.0.2:8000;
                 proxy_redirect         off;
    

我希望这是所有相关信息。如果没有,请告诉。谢谢!

【问题讨论】:

应该是from werkzeug.middleware.proxy_fix import ProxyFix 【参考方案1】:

这就是我在 Nginx 中提供烧瓶应用程序的方式:

使用套接字运行 gunicorn 守护进程:

  sudo gunicorn app:app --bind unix:/tmp/gunicorn_flask.sock -w 4 -D

相关的nginx配置:

    upstream flask_server 
        # swap the commented lines below to switch between socket and port
        server unix:/tmp/gunicorn_flask.sock fail_timeout=0;
        #server 127.0.0.1:5000 fail_timeout=0;
    
    server 
        listen 80;
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
    

    server 
        listen 80;
        client_max_body_size 4G;
        server_name example.com;

        keepalive_timeout 5;

        # path for static files
        location  /static 
            alias /path/to/static;
            autoindex on;
            expires max;
        

        location / 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;

            if (!-f $request_filename) 
                proxy_pass http://flask_server;
                break;
            
        
    


【讨论】:

切换了配置,仍然返回 404 Not Found 错误:/ 我弄清楚了它是什么——我在 nginx 配置中的 /flask2 中找到了我的位置,然后在我的烧瓶应用程序 @app.route('/') 中,它应该也是 /flask2跨度> 另外,我从来不需要做 app.wsgi_app = ProxyFix(app.wsgi_app)。这样做的目的是什么? 您不需要这样做,但它会从您的 nginx 配置(proxt_set_header X-Forwarded-For)设置来自 X-Forwarded-Host 的主机和来自 X-Forwarded-For 的远程地址 nginx 配置在哪里?

以上是关于使用 nginx 和 gunicorn 运行烧瓶应用程序的主要内容,如果未能解决你的问题,请参考以下文章

无法在 gunicorn wsgi 服务器上运行烧瓶应用程序

在烧瓶/gunicorn 中初始化应用程序的位置

为啥 nginx 不会用 django 和 gunicorn 显示静态内容?

如何在 docker 上运行 gunicorn

Bad Gateway 502 - 在 centos 7 上使用 gunicorn nginx 部署 Flask (python 3.5.2)

Gunicorn - 如果客户端关闭他们的连接,如何杀死工人?