我试图将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
测试用例
- 卷曲http://localhost/>gt>返回nginx主页
- 卷曲http://localhost/Hello>gt>return 404未找到
- 卷曲http://localhost:8000/>gt>返回nginx主页
- 卷曲http://localhost:8000/Hello>gt>返回502坏网关
- 卷曲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
。
此外,一般情况下也要小心,在自己配置这样的东西时,有很多方法会造成安全失误。祝你好运