guicorn 是什麼?
在回答問題以前咱們先來看看
web服務器的典型過程[1]
1. 創建連接:若是沒有鏈接,要創建鏈接
2. 接收請求:對客戶端發來的請求進行解析。
3. 處理請求:轉發給預約義的處理器。
4. 訪問資源、處理資源:
訪問資源 處理器根據請求訪問資源,資源可能存在於數據庫中或文件系統中等。
處理資源 返回數據,一般根據取出的數據對模板進行渲染(填充模板的過程)而後將渲染了的內容返回
5. 構建響應:構建http響應報文,包括響應狀態碼,響應頭和響應實體。響應實體中包含了數據。
6. 發送響應:將響應發送給客戶端,能夠作 關閉鏈接
7. 日誌記錄
頁面、數據的生成,session的管理, url dispatch等。也就是說,這些web應用框架主要在作第3 第4件事情。
那麼1. 2. 5. 中這些相對底層的事情——對http 協議的處理是誰來作的呢?是http服務器。
那麼http服務器如何與web 應用
之間框架溝通呢?這就須要
WSGI了。
WSGI 相似一種協議,定義了http服務器 和 web 應用 之間的
互相溝通的方式。
第2步到第3步,http 請求從http服務器給了web應用,中間須要經過WSGI的溝通,
一樣,由第4步到第5步,web應用將響應給了http服務器,中間也須要經過WSGI溝通。
顯然,它的
好處是 web應用框架與 http服務器的解耦。
另外,經過提供統一的接口,使得程序員沒必要關心http協議的底層處理細節,而專一於 業務邏輯上的開發。
回到問題,guicorn是什麼呢?
它實現了WSGI,同時它仍是http服務器。
由於gunicorn實現了WSGI, flask 在 gunicorn 上能跑,在其餘實現了WSGI的服務器上 也能愉快地運行。
爲啥要用它呢?
django 是有
本身的wsgi的,把gunicorn作django的WSGI服務器,能夠很靈活地配置worker數量,以提升併發量;
當web應用長時間未響應,會重啓worker進程,有『臨時』起死回生的功效;其餘特性。
以上講了gunicorn的做用,下面就順便講一下gunicorn的配置吧:)
gunicorn的配置
bind 綁定的ip以及端口號。部署後可經過訪問該ip及端口號可訪問web服務。
可是一般會在gunicorn前加 nginx 作爲反向代理。
workers 對應 處理進程的數目。是重要的配置。
經過命令 ps aux | grep 'gunicorn' 能夠看到進程的數目與配置文件中的數目相符。
timeout 超時參數,若是web應用服務器超過了此時間仍未響應那麼將重啓worker,顯然,重啓期間 服務不可用。
假如web應用服務器在重啓前 阻塞住了,那麼重啓以後阻塞
可能 消失,此時服務可用。但若是阻塞緣由
沒有消除,
那麼web應用服務器 遲早仍是會阻塞,阻塞時間太長了,引發worker再次重啓。這就是所謂的
『臨時』起死回生。
daemon 是否爲守護進程。
pythonpath python路徑。
preload_app 配成 True 可在worker 進程fork前加載代碼,推薦一試。
講完了gunicorn的配置,再講講guicorn的
部署吧!
啓動gunicorn
舉例html
/home/venv/bin/python /home/venv/bin/gunicorn -c start_gunicorn.py wsgi:app
其中 -c 指定配置文件python
wsgi.py文件中寫web 應用程序,請注意下wsgi文件的路徑。nginx
博主不太懂的地方,在於奇怪的冒號。冒號左邊的部分表示定義程序的包或者模塊,冒號右邊的部分表示包中程序實例的名字
[2]
題外話
web後端 最最簡單粗暴的理解:拿到請求,查查數據庫,扔回給客戶端 (博主遁走
觀點
1. guicorn = WSGI服務器 + http服務器。
2. 對django來說,它是一個更好的WSGI服務器(
能起多個worker 等),另外 它還能處理http請求。
參考
[2] http://www.jianshu.com/p/7bc34e56fa39
若是講的不許,
歡迎拍磚
;)
2016年5月5號