使用了Gunicorn或者uWSGI,为什么还需要Nginx?
在只使用一台机器的情况下,为什么在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 做负载均衡那就几乎是必须了。项目用的是前后端分离,一边是webpack + vuex 一边是django,如果不用nginx的话,每次更新前端代码,都需要把生成的静态文件放到static,然后重启uwsgi服务,如果加了一层nginx,就可以前后端分开来部署,每次前端代码更新的时候,只要重启前端服务就可以了,甚至前端服务可以单独拿出来做cdn分发。
使用nginx转发还是很方便的。曾经一个服务器同时跑了apache, tomcat, node3个服务。但是想做到不跨域,用url来做分发。这时候就用到nginx了。
如果仅仅是一个提供API接口的后端的话,我觉得可以直接用uwsgi。
- Nginx更安全
- Nginx能更好地处理静态资源(通过一些http request header)
- Nginx也可以缓存一些动态内容
- Nginx可以更好地配合CDN
- Nginx可以进行多台机器的负载均衡
- 不需要在wsgi server那边处理keep alive
- 让Nginx来处理slow client
- 还有一个更隐蔽的区别是,像uWSGI支持的是wsgi协议,Nginx支持的是http协议,它们之间是有区别的。