python web的伺服器結構和gunicorn配置
阿新 • • 發佈:2018-11-12
一、python web服務結構
python web下的大致結構可表示為:
web伺服器:
web伺服器是指駐留在因特網上某種型別計算機的程式。嚴格意義上web伺服器只負責處理http協議,用於處理靜態頁面的內容。而動態內容需要通過wsgi介面交給應用伺服器去解決。
web框架:
作用是方便我們開發web應用程式,http請求的動態資料是由web框架層來提供的。
常見的有flask、Django等。Tornado不光是一個web框架,還實現了wsgi容器的功能。
wsgi容器:
WSGI不是一個庫,也不是一個伺服器程式,他只是一個協議,或者說是一份標準,用來描述Server與Framework之間的通訊介面。這樣,一些符合WSGI標準的Framework如Flask、Django、web.py等等就可以與同樣符合WSGI標準的Server庫進行無縫對接。WSGI描述了Server與Framework之間通訊的規範,簡單來說,WSGI規範了以下幾項內容:
- WSGI協議主要包括server和application兩部分,server負責接受客戶端請求並進行解析,然後將其傳入application,客戶端處理請求並將響應頭和正文返回伺服器(嚴格說來,還有一個模組叫做中介軟體middleware,但中介軟體也同樣使用上述兩種介面進行通訊)
- 從application的角度來說,它應當是一個可呼叫的物件(實現了__call__ 函式的方法或者類),它接受兩個引數:environ和start_response,其主要作用就是根據server傳入的environ字典來生成一個“可迭代的”http報文並返回給server
- 從server的角度來說,其主要工作是解析http請求,生成一個environ字典並將其傳遞給可呼叫的application物件;另外,server還要實現一個start_response函式,其作用是生成響應頭,start_response作為引數傳入application中並被其呼叫。
資料流向:
二、WSGI容器——Gunicorn
常用的WSGI容器有Gunicorn和uWSGI,但Gunicorn直接用命令啟動,可以不編寫配置檔案。
1、安裝gunicorn:
pip install gunicorn
2、啟動:
gunicorn [options] module_name:variable_name
module_name
對應python檔案,variable_name
對應web應用例項。
以最簡單的flask應用為例:
#main.py from flask import Flask app = Flask(__name__) @app.route('/') def index(): return 'hello world' if __name__ == '__main__': app.run()
3、gunicorn的引數詳解
-c CONFIG : CONFIG,配置檔案的路徑,通過配置檔案啟動;生產環境使用;
-b ADDRESS : ADDRESS,ip加埠,繫結執行的主機;
-w INT, --workers INT:用於處理工作程序的數量,為正整數,預設為1;
-k STRTING, --worker-class STRTING:要使用的工作模式,預設為sync非同步,可以下載eventlet和gevent並指定
--threads INT:處理請求的工作執行緒數,使用指定數量的執行緒執行每個worker。為正整數,預設為1。
--worker-connections INT:最大客戶端併發數量,預設情況下這個值為1000。
--backlog int:未決連線的最大數量,即等待服務的客戶的數量。預設2048個,一般不修改;
-p FILE, --pid FILE:設定pid檔案的檔名,如果不設定將不會建立pid檔案
--access-logfile FILE : 要寫入的訪問日誌目錄
--access-logformat STRING:要寫入的訪問日誌格式
--error-logfile FILE, --log-file FILE : 要寫入錯誤日誌的檔案目錄。
--log-level LEVEL : 錯誤日誌輸出等級。
--limit-request-line INT : HTTP請求頭的行數的最大大小,此引數用於限制HTTP請求行的允許大小,預設情況下,這個值為4094。值是0~8190的數字。
--limit-request-fields INT : 限制HTTP請求中請求頭欄位的數量。此欄位用於限制請求頭欄位的數量以防止DDOS攻擊,預設情況下,這個值為100,這個值不能超過32768
--limit-request-field-size INT : 限制HTTP請求中請求頭的大小,預設情況下這個值為8190位元組。值是一個整數或者0,當該值為0時,表示將對請求頭大小不做限制
-t INT, --timeout INT:超過這麼多秒後工作將被殺掉,並重新啟動。一般設定為30秒;
--daemon: 是否以守護程序啟動,預設false;
--chdir: 在載入應用程式之前切換目錄;
--graceful-timeout INT:預設情況下,這個值為30,在超時(從接收到重啟訊號開始)之後仍然活著的工作將被強行殺死;一般使用預設;
--keep-alive INT:在keep-alive連線上等待請求的秒數,預設情況下值為2。一般設定在1~5秒之間。
--reload:預設為False。此設定用於開發,每當應用程式發生更改時,都會導致工作重新啟動。
--spew:列印伺服器執行過的每一條語句,預設False。此選擇為原子性的,即要麼全部列印,要麼全部不列印;
--check-config :顯示現在的配置,預設值為False,即顯示。
-e ENV, --env ENV: 設定環境變數;
4、以配置檔案啟動。
gunicorn.py示例:
# gunicorn.py
# 並行工作程序數
workers = 4
# 指定每個工作者的執行緒數
threads = 2
# 監聽內網埠5000
bind = '127.0.0.1:5000'
# 設定守護程序,將程序交給supervisor管理
daemon = 'false'
# 工作模式協程
worker_class = 'gevent'
# 設定最大併發量
worker_connections = 2000
# 設定程序檔案目錄
pidfile = '/var/run/gunicorn.pid'
# 設定訪問日誌和錯誤資訊日誌路徑
accesslog = '/var/log/gunicorn_acess.log'
errorlog = '/var/log/gunicorn_error.log'
# 設定日誌記錄水平
loglevel = 'warning'
啟動:
gunicorn -c gunicorn.conf app:app