1. 程式人生 > >python web的伺服器結構和gunicorn配置

python web的伺服器結構和gunicorn配置

一、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