使用了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 做負載均衡那就幾乎是必須了。自問自答一下。
首先匿名用戶回答的已經很全面了,謝謝。
我查了一下資料,查到了一個很好的回答。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足以勝任。
使用nginx轉發還是很方便的。曾經一個伺服器同時跑了apache, tomcat, node3個服務。但是想做到不跨域,用url來做分發。這時候就用到nginx了。如果僅僅是一個提供API介面的後端的話,我覺得可以直接用uwsgi。
Gunicorn直接暴露出來十分危險,還是擋一層吧。另外 Nginx 還有很多方便的路由功能,適合在前端擋一擋。
1. nginx 相對 uwsgi (Gunicorn) 處理靜態文件更有優勢, 性能更好。
如果沒有靜態文件, 或靜態文件另有伺服器處理, 個人感覺可以不需要nginx。推薦閱讀:
※uWSGI 伺服器的 uwsgi 協議究竟用在何處?
※如何做到R和python的完美配合?
※財務一名,已經工作兩年,現在想轉數據分析師,有沒有r語言和python學習的教程?
※Python小白想爬取網路數據?
※「男友讓我打十萬個「對不起」,漢字標上多少遍。」這個問題用 R 如何實現?