如何使用unix socket将url参数传递给Nginx proxy_pass后面的Flask

时间:2018-05-22 02:43:42

标签: python nginx flask unix-socket

我有一个带有bjoern的Flask应用程序作为python服务器。我有一个示例网址是:

http://example.com/store/junihh
http://example.com/store/junihh/product-name

“junihh”和“product-name”是我需要传递给python的参数。

在阅读有关TCP / IP调用的性能后,我尝试使用unix socket。但现在我在浏览器上收到502错误。

这是我的conf的片段:

upstream backend {
    # server localhost:1234;
    # server unix:/run/app_stores.sock weight=10 max_fails=3 fail_timeout=30s;
    server unix:/run/app_stores.sock;
}

server {
    listen                      80 default_server;
    listen                      [::]:80 default_server;
    server_name                 example.com www.example.com; 
    root                        /path/to/my/public;

    location ~ ^/store/(.*)$ {
        include                 /etc/nginx/conf.d/jh-proxy-pass.conf;
        include                 /etc/nginx/conf.d/jh-custom-headers.conf;

        proxy_pass              http://backend/$1;
    }
}

如何使用unix socket通过Nginx proxy_pass将url参数传递给Flask?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是我的conf,它可以工作。 502是因为它无法找到上游服务器的路由(即将http://127.0.0.1:5000/ $ 1更改为http://localhost:5000/ $ 1)将导致502.

nginx.conf

http {
    server {
        listen       80; 
        server_name  localhost;

        location ~ ^/store/(.*)$ {
            proxy_pass http://127.0.0.1:5000/$1;
        }   
    }   
}

flask app.py

#!/usr/bin/env python3

from flask import Flask

app = Flask(__name__)

@app.route('/')
def world():
    return 'world'

@app.route('/<name>/<pro>')
def shop(name, pro):
    return 'name: ' + name + ', prod: ' + pro

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

更新

或者您可以像这样使用unix socket,但是在 uwsgi 上继续。

nginx.conf

http {
    server {
        listen       80; 

        location /store {
            rewrite /store/(.+) $1 break;
            include uwsgi_params;
            uwsgi_pass unix:/tmp/store.sock;
        }   
    }   
}

flask app.py

如上所述,不要改变

uwsgi config

[uwsgi]
module=app:app
plugins=python3
master=true
processes=1
socket=/tmp/store.sock

uid=nobody
gid=nobody

vaccum=true
die-on-term=true

另存为config.ini,然后运行uwsgi config.ini

在nginx重新加载后,您可以访问您的页面; - )