使用了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 如何實現?

TAG:Python | 後端技術 | Nginx | uwsgi | Gunicorn |