【发布时间】:2018-02-11 23:18:12
【问题描述】:
注意:该问题已作为重复关闭,但它不是(两个问题都没有)。 我专门描述了一个在 web 模式下的应用程序,然后在 WSGI 模式下 - 我毫不怀疑何时使用(两个链接的问题都解决了这一点)。我还解释说我很清楚 Web 服务器的用途。 接受的答案很好地总结了这一点,并回答了 Web 服务器是否是运行 prod flask 应用程序的要求(不是)的问题。
我有一个flask 应用程序。开发版with all its limitations是
import flask
app = flask.Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
app.run()
当我想将其移至生产环境时,我使用gevent、per the deployment documentation:
import gevent.monkey
gevent.monkey.patch_all()
import flask
import gevent.wsgi
app = flask.Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
gevent.wsgi.WSGIServer(('127.0.0.1', 5000), app).serve_forever()
这两种情况都有效,第一种情况偶尔会出现问题(由于其性质,这并不意外)。
然后,我在这里和那里阅读的很多信息都提到flask 应用程序的生产部署的第三个组件是 Web 服务器(Apache、nginx)。它对支持 WSGI 的烧瓶应用程序的实际用途是什么?
具体来说,我想了解它是否对flask应用的性能/稳定性有实际影响。
我知道网络服务器的各种用途(身份验证、反向代理、白名单、重写、负载管理等)。我的问题特别是关于网络服务器为 flask WSGI 应用程序(如果有的话)提供了什么。
【问题讨论】:
-
使用 Flask,您可以构建您的 Web 应用程序。 WSGI 是应用程序遵循的由 WSGI 服务器托管的接口。 gevent 是一个可以托管您的应用程序的 WSGI 服务器。通常,您会在其前面放置一个完整的 Web 服务器(nginx 或 apache)作为 反向代理,以获得现代 Web 服务器提供的全部功能,而无需中间 WSGI 服务器自己提供这些功能.这让一切变得更简单、更容易推理。
-
@poke:获得现代 Web 服务器提供的全部功能,而无需中间 WSGI 服务器自己提供这些功能。 你指的是我的一些功能吗?问题中提到?换句话说,如果我希望我的网络服务器回复
Hello World(当然是它所在的服务器的容量 - 但如果没有使用速率限制或类似的东西,网络服务器不会改进它)@987654329 @server 是正确的选择吗?我试图了解选择是否是二进制:dev server for dev,geventfor prod,然后可能是一些额外的 -
@poke (cont'd) ... Web 服务器的舒适特性(
gevent只是 WSGI 服务器的一个示例) -
开发服务器仅限于单个进程,因此不太适合生产。这就是您使用 WSGI 服务器来托管您的应用程序的原因;然后它会做任何必要的事情来正确运行你的应用程序。 WSGI 服务器仍然相当简单;您将另一台 Web 服务器作为反向代理放在前面,以访问使 Web 服务器真正强大的功能(例如负载平衡、缓存、SSL 终止)
-
@poke:好的,这很清楚(并且与我的想法一致)。如果您不介意在答案中复制/粘贴您的 cmets,我将很乐意接受。谢谢。
标签: python python-3.x flask gevent