当我在gunicorn上运行Flask应用程序时设置app.wsgi_app = ProxyFix(app.wsgi_app)会发生什么?

时间:2013-12-14 14:14:05

标签: python flask wsgi gunicorn werkzeug

我使用Flask构建了一个基本的Web应用程序,并且能够使用其本机http服务器从虚拟机运行它。我很快意识到,通过这个设置,请求被阻止(我无法对资源进行并发请求;任何新请求都要等到早期请求完成),并决定尝试使用gunicorn运行应用程序来解决此问题。我跟着documentation,特别是用这一行运行:

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app 

然而,它无法启动这样做,并抱怨没有WSGI应用程序。在互联网上,我发现有很多人发布了以下示例:

from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)

我补充说,它解决了我的问题。我很困惑,因为这显然是为了解决在HTTP代理后面服务的问题,但是增加的gunicorn会强加一个HTTP代理吗?或者我总是落后于代理,而Flask的内置服务器并不重要?

此外,Werkzeug's documentation on Fixers警告“出于安全原因,请勿在非代理设置中使用此中间件。”考虑到修复显然是必要的,我可以假设我正在进行代理设置吗?

2 个答案:

答案 0 :(得分:3)

您需要显示定义Flask应用程序“app”的代码。

“app”在哪里定义?您是从其他文件导入的吗?

我试图重现这个问题:

$ cat myproject.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "ok"

$ bin/gunicorn -w 4 -b 127.0.0.1:4000 myproject:app &
[1] 27435

2014-03-04 12:18:36 [27435] [INFO] Starting gunicorn 18.0
2014-03-04 12:18:36 [27435] [INFO] Listening at: http://127.0.0.1:4000 (27435)
2014-03-04 12:18:36 [27435] [INFO] Using worker: sync
2014-03-04 12:18:36 [27441] [INFO] Booting worker with pid: 27441
2014-03-04 12:18:36 [27442] [INFO] Booting worker with pid: 27442
2014-03-04 12:18:36 [27445] [INFO] Booting worker with pid: 27445
2014-03-04 12:18:36 [27448] [INFO] Booting worker with pid: 27448

$ curl http://127.0.0.1:4000/
ok

正如你所看到它运作正常。在这种情况下,你肯定不需要ProxyFix。

答案 1 :(得分:0)

聚会晚了一点,但是here是有关ProxyFix的文档。

释义:在HTTP代理后面使用gunicorn部署服务器,您将需要重写一些标头,以便应用程序可以工作。 而且Werkzeug附带了一个可解决一些常见设置的修复程序。