Python NGINX+;烧瓶,没有枪吗?

Python NGINX+;烧瓶,没有枪吗?,python,nginx,flask,server,wsgi,Python,Nginx,Flask,Server,Wsgi,我对此并不熟悉,但通过比较gunicorn代码和flask/werkzeug,我无法理解在nginx和flask之间插入gunicorn的真正好处。我想听听专家的意见 就我目前所了解的情况而言,这归结为将gunicorn与werkzeug的开发服务器进行比较。简而言之,我无法理解为什么werkzeug的服务器被称为开发服务器,而gunicorn被认为是产品就绪的。我能想到的选择gunicorn而不是werkzeug的理由是: 表演。Gunicorn基于预工作模型,而werkzeug可以为每个请求

我对此并不熟悉,但通过比较gunicorn代码和flask/werkzeug,我无法理解在nginx和flask之间插入gunicorn的真正好处。我想听听专家的意见

就我目前所了解的情况而言,这归结为将gunicorn与werkzeug的开发服务器进行比较。简而言之,我无法理解为什么werkzeug的服务器被称为开发服务器,而gunicorn被认为是产品就绪的。我能想到的选择gunicorn而不是werkzeug的理由是:

  • 表演。Gunicorn基于预工作模型,而werkzeug可以为每个请求动态派生线程或进程。但是史蒂文斯在他的UNP书中有一个比较,prefork在他的测试中并不是一个明显的赢家。在linux上剥离线程(而不是进程)应该相当便宜,不需要处理预分叉的进程池。因此,对于CPU绑定的服务,python GIL使werkzeug的线程模型不那么吸引人,但是对于IO绑定的服务,werkzeug应该足够好吗
  • Gunicorn支持gevent/eventlet/tornado,而werkzeug不支持。但是由于asyncio在Python3中已成为本机线程,这些绿色线程库似乎不再那么重要了
  • 保安?我也不是这方面的专家,但nginx似乎已经是一个很好的防守球员了?此外,与werkzeug的开发服务器相比,gunicorn在这方面似乎没有提供额外的保护
  • SSL。Flask和werkzeug服务器似乎无法处理此问题。但是nginx已经可以处理这个问题了,所以flask不需要
  • Unix套接字。Werkzeug的服务器似乎无法处理unix套接字。因此,如果nginx需要使用unix套接字将流量转发到后端,或者因为这是唯一的方法,或者因为这是最有效的方法,那么这似乎是gunicorn的一个很好的理由
  • 上述理由有效吗?其他原因是什么


    顺便说一句,我已经读过了,但他们似乎还没有完全回答我的问题。

    Werkzeug可以使用多个流程,但会根据每个请求启动一个新流程。如果你正在组装一个彻底污染环境的东西,以至于在每次请求后都必须丢弃该进程,但这不是部署应用程序的最有利于性能的方法,那么这就太好了

    gunicorn(或uwsgi,我更喜欢)提供的流程管理比Werkzeug提供的要灵活得多


    不过,你可能会被说服,通过组合一个简单的应用程序,使用werkzeug为一个实验设置4个过程,使用gunicorn或uwsgi为另一个实验设置4个过程,然后在向其发送流量时测量其性能。

    我要添加一个理由0:该程序告诉你不要在每次启动时都在生产中使用它。顺便说一句,Django项目在他们非常相似的开发服务器上给出了一个明确的定义。在这一点上完全是WKD。我认为dev服务器可能是一种热重新加载类型——更改一个文件,服务器重新加载它,而无需停止并重新启动。在开发中很好,但lotsa移动部件在产品中可能不太好,甚至可能有安全隐患。好问题,但是。。。不要。另外,Nginx配置可能有点麻烦,但wsgi(w Django)根本不是复杂性的一部分——它只是一个你要路由到的端口。我同意,就连flask的网站也推荐gunicorn/waitress。我只是好奇到底是什么让werkzeug的开发服务器比prod env的其他两个服务器差那么多,所以这是一个性能问题?您是否假设服务器的工作负载受CPU限制,或者不受CPU限制?我的假设(可能有点离谱)是,您正在从理论上处理问题,一点扎根的实验可能会让您走得更远、更快。@DaveW.Smith我想试试这个,但是你能推荐一种“增加流量”的方法并测量性能差异吗?我过去用过,但我不知道当前的选项是什么。