我使用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警告“出于安全原因,请勿在非代理设置中使用此中间件。”考虑到修复显然是必要的,我可以假设我正在进行代理设置吗?
答案 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附带了一个可解决一些常见设置的修复程序。