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

Ash*_*ple 18 python wsgi werkzeug flask gunicorn

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

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app 
Run Code Online (Sandbox Code Playgroud)

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

from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)
Run Code Online (Sandbox Code Playgroud)

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

此外,Werkzeug关于Fixers的文档警告"出于安全原因,不要在非代理设置中使用此中间件." 考虑到修复显然是必要的,我可以假设我正在进行代理设置吗?

tgd*_*gdn 6

虽然有点晚了,但这里 (Flask v1)是文档中关于 ProxyFix 的内容。

v2 的文档

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


Ste*_*lla 5

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

“应用程序”在哪里定义?你是从另一个文件导入的吗?

这是我重现该问题的尝试:

$ 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
Run Code Online (Sandbox Code Playgroud)

如您所见,它运行良好。在这种情况下,您绝对不需要 ProxyFix。