题主可以了解一下什么是server,进一步了解什么是WSGI和uWSGI,为了更清楚,再了解一下什么是CGI FASTCGI。为了更清楚,可以看一下其他语言 比如 php做服务端怎么部署。

利用异步,提高性能。题主可以了解下guncorn的依赖gevent和greenlet,如果能顺便看看epoll那是再好不过啦

Nginx、Gunicorn在服务器中分别起什么作用?
Gunicorn 前面一定要套一个 Nginx 吗?
通过上面资料的学习,大概可以整理出来为什么要在gunicorn可以用的基础上再额外增加一个Nginx:
Nginx是专业高性能经历过市场大风大浪检测而生存下来的,无论是在 1 高并发,2 负载均衡,3 静态资源缓存等等,都胜过Gunicorn;
而Gunicorn更加擅长对进程的管理,搭配Supervisor彰显其无敌的能力。
通过Nginx + Flask + Gunicorn + Supervisor 部署出来的系统:高可用+高性能

作者:灵剑链接:https://www.zhihu.com/question/38528616/answer/116118895来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
嗯,怎么说呢,大部分人在gunicorn前面部署一层nginx的时候也的确没有想过为什么,他们只是觉得这样显得他们比较专业,而且幻想着加了一层nginx反向代理之后性能会有提升,恕我直言,请你们带上脑子,一个单纯的串联结构怎么可能提升性能?请好好想一想这个问题好吗?在前面增加一层nginx的情况主要是:

  1. 负载均衡。tornado之类的框架只支持单核,所以多进程部署需要反向负载均衡。gunicorn本身就是多进程其实不需要
  2. 静态文件支持,经过配置之后,nginx可以直接处理静态文件请求而不用经过Python服务器,Python服务器也可以返回特殊的http头将请求rewrite到静态文件。我说的是经过配置之后,你配置了吗?
  3. 抗并发压力。虽然不能提升qps,但是多一层前端,的确可以吸收一些瞬时的并发请求,让nginx先保持住连接,然后后端慢慢消化,但说实话这种情况下服务体验已经很糟糕了。但的确比服务挂掉强一些。
  4. rewrite之类的其他功能。配置了才有,配了吗?
  5. 怕gunicorn的http解析有bug。这个姑且算有点道理,不过加一层负载均衡不一定能解决问题。

主要来说加一层可以给你一些你很可能不会去配置的额外的功能,这样多少会给运维人员一些安慰,反正也不会有什么性能损耗,也就是说不太会有坏处,所以大家都假装自己很懂地加了一层反向负载均衡。其实不见得就没有坏处,比如说可能会获取不到对端IP地址(变成127.0.0.1了),或者可能会被X-Forwarded-For欺骗。
不过另一个角度来说,如果你的业务早晚会上规模,早晚有一天会用上反向负载均衡,提前配一个也对,不过应该用两台服务器,配在不同服务器上。内部服务的情况下如果压力不太大,很多其实都是gunicorn裸跑的,Python不是PHP,不用非得加个前端。

因此将Gunicorn置于nginx后面,可以有效提高Gunicorn的处理能力。
nginx可以缓冲请求和响应。如果让Gunicorn直接提供服务,浏览器发起一个请求,鉴于浏览器和网络情况都是未知的,http请求的发起过程可能比较慢,而Gunicorn只能等待请求发起完成后,才去真正处理请求,处理完成后,等客户端完全接收请求后,才继续下一个。
nginx缓存客户端发起的请求,直到收完整个请求,转发给Gunicorn,等Gunicorn处理完成后,拿到响应,再发给客户端,这个流程是nginx擅长处理,而Gunicorn不擅长处理的。
作者:范孝鹏链接:https://www.zhihu.com/question/38528616/answer/117946381来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一 为什么用 gunicorn

gunicorn和uWSGI是实现了WSGI协议的web服务器

  • uWSGI:是一个全功能的HTTP服务器,实现了WSGI协议、uwsgi协议、http协议等。
  • 用于接受http请求并转换为WSGI协议,以供实现了WSGI协议的flask使用,并且gunicorn得益于gevent等技术,大幅度提高了性能,在生产环境以替代框架自带的WSGI server。
  • tornado之类的框架只支持单核,gunicorn可以提供多进程支持,提升多核服务器的处理性能。

django、flask 都有自带的http server,仅仅是方便我们开发的时候调试代码而已
这些开源框架的维护者不可能投入大量精力来优化自带的wsgi服务器,
他们需要把更多的精力投入到框架自身的优化中,
因为服务器方面已经有Gunicorn/uWSGI、nginx等优秀的开源解决方案
假设我们用自带的来部署到线上,会有什么问题呢?
性能很差,差到不好意思出门见人(如果你的网站就几十个人访问,那性能应该问题不大)
最后
我个人建议的方案是 flask+Gunicorn+gevent+nginx (具体如何搭配工作,你可以Google搜索一下)

二. 为什么还要加一成nginx?

  1. nginx也是一种web服务器,但功能和gunicorn/uWSGI有些差别

nginx没有实现WSGI协议,如果是nginx+flask的组合的话就必须使用框架自带的WSGI server,性能渣。

静态文件支持,经过配置之后,nginx可以直接处理静态文件请求而不用经过应用服务器,避免占用宝贵的运算资源;还能缓存静态资源,使访问静态资源的速度提高。

抗并发压力。可以吸收一些瞬时的高并发请求,让nginx先保持住连接(缓存http请求),然后后端慢慢消化。如果让Gunicorn直接提供服务,浏览器发起一个请求,鉴于浏览器和网络情况都是未知的,http请求的发起过程可能比较慢,而Gunicorn只能等待请求发起完成后,才去真正处理请求,处理完成后,等客户端完全接收请求后,才继续下一个。

HTTP 请求缓存头处理得也比 gunicorn和uWSGI 完善。

多台服务器时,可以提供负载均衡和反向代理。

大意如图:
为什么 django_flask gunicorn nginx - 图1
————————————————

版权声明:本文为CSDN博主「Aifore」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/aifore/article/details/86703685