Flask + gunicorn 代理设置?

Flask + gunicorn proxy setup?

我尝试将 Flask、gunicorn 和 nginx 连接在一起,但结果是 400 Bad request 和 500 Errors。 希望有人能帮忙。

nginx 配置文件

server {
    listen 8000;
    server_name 127.0.0.1;

    location /Hello {
        uwsgi_pass 127.0.0.1:8081;
    }
}

wsgi.py 片段:

from app import app

app.run(host="127.0.0.1", port=8081)

app.py

app = Flask(__name__)
app.secret_key = "Not A Secret Anymore By Now"

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


#if __name__ == "__main__":
#  app.run(host='0.0.0.0', port=8000)

运行 命令

export FLASK_APP=app
export FLASK_ENV=development
gunicorn --bind 0.0.0.0:8081 wsgi:app

测试用例

  1. curl http://localhost/ >>> returns nginx 主页
  2. curl http:///localhost/Hello >>> returns 404 未找到
  3. curl http://localhost:8000/ >>> returns nginx 主页
  4. curl http://localhost:8000/Hello >>> returns 502 Bad Gateway
  5. curl http://localhost:8081 >>> return 连接被拒绝

我试图让测试用例工作,但不知道为什么会出现错误,(nginx 已重新启动)。

谢谢。

这里有几个问题...

你的视图函数结束时没有 return 语句,这可能是第一个 500 错误的原因。更好用:

@app.route('/Hello')
def hello():
  print("Hello")
  return 'success'

此外,由于您遇到的 uwsgi.py 是空的,因此没有可导入的应用程序对象。最好将 gunicorn 命令指向有效的应用程序对象:

gunicorn --bind 0.0.0.0:8081 app:app

此外,nginx 位置块希望请求转到 http://example.com/Hello/Hello。所以最好像下面这样制作位置块。 (还要确保端口与您提供给 gunicorn 的 --bind 标志的端口相同)。

location / {
    proxy_pass http://127.0.0.1:8081;
}

这里我也根据 gunicorn deployment (with nginx) docs.

使用了 proxy_pass

现在请求应该可以工作了:

# Direct to app server...
curl -i  http://localhost:8081/Hello
HTTP/1.1 200 OK
Server: gunicorn/20.0.4
# ...
success

还有:

# Via nginx:
curl -i http://localhost/Hello
HTTP/1.1 200 OK
Server: nginx
...
success

注意 运行 所有接口 (0.0.0.0) 上的 gunicorn 意味着如果没有防火墙阻止这种情况,外部请求可以直接到达应用程序服务器(绕过 nginx)。可能值得将 gunicorn 绑定到本地接口:--bind 127.0.0.1:8081.

通常也要小心,在您自己配置此类内容时,有很多方法可以确保安全 slip-ups。祝你好运。