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
测试用例
- curl http://localhost/ >>> returns nginx 主页
- curl http:///localhost/Hello >>> returns 404 未找到
- curl http://localhost:8000/ >>> returns nginx 主页
- curl http://localhost:8000/Hello >>> returns 502 Bad Gateway
- 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。祝你好运。
我尝试将 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
测试用例
- curl http://localhost/ >>> returns nginx 主页
- curl http:///localhost/Hello >>> returns 404 未找到
- curl http://localhost:8000/ >>> returns nginx 主页
- curl http://localhost:8000/Hello >>> returns 502 Bad Gateway
- 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。祝你好运。