使用了Gunicorn或者uWSGI,为什么还需要Nginx?
时间:2021-07-01 10:21:17
帮助过:30人阅读
请问如果在只使用一台机器的情况下,为什么在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 还有很多方便的路由功能,适合在前端挡一挡。