Flask+gunicorn代理设置



我试图将Flask、gunicorn和nginx连接在一起,但最终导致400个错误请求和500个错误。希望任何人都能帮忙。

nginx conf

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)

运行cmd

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

测试用例

  1. 卷曲http://localhost/>gt>返回nginx主页
  2. 卷曲http://localhost/Hello>gt>return 404未找到
  3. 卷曲http://localhost:8000/>gt>返回nginx主页
  4. 卷曲http://localhost:8000/Hello>gt>返回502坏网关
  5. 卷曲http://localhost:8081>gt>return连接被拒绝

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

谢谢。

这里有几个问题。。。

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

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

另外,正如您所说的uwsgi.py是emtpy,那里没有可导入的应用程序对象。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部署(使用nginx(文档使用了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

此外,一般情况下也要小心,在自己配置这样的东西时,有很多方法会造成安全失误。祝你好运

最新更新