一個高效能跨平臺基於Python的Waitress WSGI Server的介紹!

軟體人生發表於2022-01-10

對於Python來說,它有很多web框架,常見的有jango、Flask、Tornado 、sanic等,比如Odoo、Superset都基於Flask框架進行開發的開源平臺,具有強大的功能。在Linux下,預設使用的WSGI Server一般為Gunicorn, 它是一個比較出名的 Web 伺服器。在常規的 Django 和 Flask 應用部署中,都有大量的站點使用 Gunicorn。但它只支援Linux,不支援Windows,但有沒有類似Gunicorn的產品,但同時支援跨平臺?答案是肯定的,那就是Waitress。一個Web框架如何被客戶端訪問,如下圖:

一個高效能跨平臺基於Python的Waitress WSGI Server的介紹!
              Web框架被客戶端訪問過程

Web服務閘道器介面(Web Server Gateway Interface,簡稱“WSGI”)是一種在Web伺服器 和Python Web應用程式或框架之間的標準介面。通過標準化Web伺服器和Python web應用程式 或框架之間的行為和通訊,WSGI使得編寫可移植的的Python web程式碼變為可能,使其能夠部署在任何符合WSGI的web伺服器上。獨立WSGI伺服器相比傳統web伺服器,使用更少的資源,並提供最高的效能

Waitress是一個具備生產級品質並有高效能的純python編寫獨立的WSGI伺服器,它只依賴python標準庫,不依賴任何第三方庫。同時它可以在多平臺下執行,比如windows、linux、unix等,支援http/1.0和http/1.1。最新版本是2.0.0,Python >=3.6.0,官網文件地址:https://docs.pylonsproject.org/projects/waitress/en/latest/,原始碼託管網址:https://github.com/Pylons/waitress。

安裝Waitress只需一個命令列:pip install waitress

執行Waitress有兩種方式,一種是程式碼方式,優點靈活性會更好,可以擴充套件一些增強功能,比如與其他庫的互動,日誌記錄等,另一種方式waitress-serve命令列方式。本文重點介紹一下waitress-serve命令列方式,該命令列有很多引數,官方文件:https://docs.pylonsproject.org/projects/waitress/en/stable/runner.html,具體如下:

waitress-serve [OPTS] MODULE:OBJECT
常用選項:

--help
顯示此資訊。
--call
呼叫給定的物件以獲取WSGI應用程式。
--host=ADDR
要偵聽的主機名或IP地址,預設值為“ 0.0.0.0”,表示“此主機上的所有IP地址”。
--port=PORT
要偵聽的TCP埠,預設為“ 8080”
--listen=host:port
告訴waitress 監聽的IP埠。

例子:

--listen = 127.0.0.1:8080 --listen = [:: 1]:8080 --listen = *:8080
可以多次使用此選項以偵聽multipe套接字。還支援主機名的萬用字元,該萬用字元將繫結到IPv4 / IPv6,具體取決於它們是啟用還是禁用。

--[no-]ipv4
啟用/禁用IPv4支援。

在偵聽萬用字元地址/埠組合時,這會影響萬用字元匹配。

--[no-]ipv6
啟用/禁用IPv6支援。

在偵聽萬用字元地址/埠組合時,這會影響萬用字元匹配。

--unix-socket=PATH
Unix套接字的路徑。如果指定了套接字路徑,則會建立一個Unix域套接字,而不是通常的inet域套接字。

在Windows上不可用。

--unix-socket-perms=PERMS
用於Unix域套接字的八進位制許可權,預設值為'600'。
--url-scheme=STR
預設wsgi.url_scheme值,預設為“ http”。
--url-prefix=STR
該SCRIPT_NAMEWSGI環境價值。將其設定為除空字串之外的任何SCRIPT_NAME值,將使WSGI值成為傳遞的值減去您新增的任何斜槓,並且將導致 PATH_INFO帶有該值字首的所有請求的字首均被刪除。預設為空字串。
--ident=STR
響應中“伺服器”標頭中使用的伺服器身份。預設值為“waitress”。
調整選項:

--threads=INT
用於處理應用程式邏輯的執行緒數,預設為4。
--backlog=INT
伺服器的連線積壓。預設值為1024。
--recv-bytes=INT
呼叫時要請求的位元組數socket.recv()。預設值為8192。
--send-bytes=INT
要傳送到socket.send()的位元組數。預設值為1。9000的倍數應避免部分填充TCP資料包。

從1.3版開始不推薦使用。

--outbuf-overflow=INT
如果掛起的輸出大於此大小,則應建立一個臨時檔案。預設值為1048576(1MB)。
--outbuf-high-watermark=INT
當掛起的輸出大於此值時,app_iter將暫停,並在將足夠的資料寫入套接字以使其降至此閾值以下時將恢復。預設值為16777216(16MB)。
--inbuf-overflow=INT
如果掛起的輸入大於此值,則應建立一個臨時檔案。預設值為524288(512KB)。
--connection-limit=INT
如果已經啟用了太多頻道,請停止建立新頻道。預設值為100。
--cleanup-interval=INT
清理無效通道之間的最短間隔時間。預設值為30。請參見 --channel-timeout。
--channel-timeout=INT
保持不活動連線開啟的最大秒數。預設值為120。“不活動”定義為“未從客戶端收到任何資料,也未向客戶端傳送任何資料”。
--[no-]log-socket-errors
切換是否應記錄客戶端過早斷開連線的回溯。預設情況下為開。
--max-request-header-size=INT
合併所有請求標頭的最大大小。預設值為262144(256KB)。
--max-request-body-size=INT
請求正文的最大大小。預設值為1073741824(1GB)。
--[no-]expose-tracebacks
切換是否向客戶端公開未處理異常的回溯。預設情況下關閉。
--asyncore-loop-timeout=INT
以秒為單位的超時值傳遞到asyncore.loop()。預設值為1。
--asyncore-use-poll
use_poll引數傳遞給asyncore.loop()。幫助克服開啟檔案描述符的限制。預設值為False。

更多技術溝通交流,可關注我的微訊號:odoodev

 長按圖片掃描二維碼

 

也可以關注我的今日頭條號:

 

  長按圖片掃描二維碼

相關文章