回答
收藏
分享
举报
为什么nginx可以直接部署,还要uWSGI,gunicorn等中间件?
提问于2020-05-08 16:41

浏览 1.8k

已修改于2023-03-16 02:09



写下您的回答
发表回答
全部回答(3)

按点赞数排序

按时间排序

1. 理论上 nginx 可以通过一些手段不用 gunicorn 这玩意。

2. 计算机世界里面的多一层的解决方案,都是是为了好管理,是为了职责清晰。

3. 某个场景下可以,不代表这个场景下这么做就好。比如,你可以去搬砖,但你没必要去搬砖,甚至说,你搬砖水平不如专业搬砖的。

举几个例子

1. 僧多粥少。nginx 可以上万并发,而正常的 python server 根本不够这么多并发。那么很简单,把nginx作为负载均衡,雨露均沾的分配请求到这些web服务器上。如果直接部署。则是把这些东西耦合在一起。没法scale。

2. 让专业的去做专业的事情。gunicorn有很多worker的姿势,比如支持 sync worker,gevent worker,比如tornado worker。nginx 如果全都支持,那岂不是要累死nginx团队?

3. 精准控制,比如gunicorn的sync worker是支持prefork,这也就意味着可以在收到足够多的请求的时候,预先帮你提升worker数量,来处理。比如,gunicorn 进程的用户可能和nginx不一样,具备更高的权限,你用nginx处理,是不是就有点简单粗暴了呢?再比如,我要针对wsgi做一些监控。这怎么处理?

赞同

5

回复举报

回答于2020-05-08 17:18



回复火男
回复
双人Yu回复了
大佬,怎么利用ngnix 和gunicorn帮flask实现上万qps?nginx在连接释放间隔和新建连接数达到均衡?

0

回复举报

回答于2020-06-10 11:12



回复双人Yu
回复

原因是为了提升性能:

1、python代码接收、解析HTTP协议的性能很差,所以虽然python server都提供有http server功能,但文档上都写得明白:仅用于debug,千万不要在生产环境中使用,一旦使用,你可能连一百个RPS都达不到。

2、为了解决上述问题,搞出一个WSGI网关API,python server提供几个API,用于等待HTTP请求接收完后被调用,且函数会同步地返回HTTP响应。

3、谁来调用WSGI接口呢?自然就有了gunicorn和uWSGI进程,它们负责接收HTTP请求。当然,它们既可以在TCP协议上接收,但更多时候,只是通过unix socket来传输HTTP消息,因为这样绕过了TCP/IP协议栈,性能更高。

4、gunicorn和uWSGI主要用来将HTTP消息适配到WSGI接口,它们本身并不擅长向浏览器提供HTTP服务,从功能、性能上它们都远不如Nginx。

5、gunicorn和uWSGI的差别,在于gunicorn还在使用HTTP/1.1协议,这个协议的编解码效率很低,而uWSGI自定义了一个uwsgi协议,它向二进制序列化更进了一步,性能也更好。

赞同

2

回复举报

回答于2020-06-03 07:54



回复陶辉
回复

为楼上两位点赞

赞同

0

回复举报

回答于2020-08-24 10:44



回复阿尔巴
回复
提问者
TiAna
这家伙很懒还未留下介绍~
0
文章
1
问答
2
粉丝
相关问答

应该是还没有开放。敬请等待。

点赞 0
浏览 1.3k
可以和tomcat配合一起使用作为反向代理进行负载均衡配置
点赞 0
浏览 788