请问如果在只使用一台机器的情况下,为什么在Gunicorn或者uWSGI前面还要加一层Nginx?哪些情景下这样做能提高性能?
回复内容:
一种情况,本地有多个 web 服务,有 Python、php、java 编写的,都想监听 80 端口,这个时候就必须有一个负责转发的服务了。
如果本机确定只跑这一个服务,但是 uwsgi 和 gevent 对于静态资源处理的并不是很好,一是性能问题,二是各种 HTTP 请求缓存头,处理的也没有 Nginx 完善。
然后还有一些安全问题,Nginx 作为专业服务器,暴露在公网相对比较安全(虽然有著名的心血漏洞),uwsgi 和 gevent 的话,漏洞恐怕只比 Nginx 多而不是少。
再来就是支持的协议,uwsgi 和 gunicon 早期是不支持 https 的,只能提供 http 给浏览器访问。虽然现在这两者都支持了,但是以后的 spdy 和http2,恐怕也是 nginx 跟进更快一些。
还有一些运维优势,比如服务器被人 CC,这是一种非常常见的情况,nginx 可以比较方便的把一些 IP 加入黑名单,直接改配置文件就好了。要是 uwsgi 或者 gunicorn,恐怕还要修改自己应用的代码,把 IP 过滤写进去。
题主说只考虑单台机器的情况,但是如果不考虑的话,那一个 nginx 做负载均衡那就几乎是必须了。
自问自答一下。
首先匿名用户回答的已经很全面了,谢谢。
我查了一下资料,查到了一个很好的回答。django - Why do I need nginx when I have uWSGI
根据以上内容,自己归纳如下:
- Nginx更安全
- Nginx能更好地处理静态资源(通过一些http request header)
- Nginx也可以缓存一些动态内容
- Nginx可以更好地配合CDN
- Nginx可以进行多台机器的负载均衡
- 不需要在wsgi server那边处理keep alive
- 让Nginx来处理slow client
- 还有一个更隐蔽的区别是,像uWSGI支持的是wsgi协议,Nginx支持的是http协议,它们之间是有区别的。
一句话来说,如果访问量不大,其实也没必要加个Nginx,uWSGI或者Gunicorn足以胜任。
1. nginx 相对 uwsgi (Gunicorn) 处理静态文件更有优势, 性能更好。
如果没有静态文件, 或静态文件另有服务器处理, 个人感觉可以不需要nginx。
Gunicorn直接暴露出来十分危险,还是挡一层吧。另外 Nginx 还有很多方便的路由功能,适合在前端挡一挡。
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn