一個高性能跨平台基於Python的Waitress WSGI Server的介紹!
對於Python來說,它有很多web框架,常見的有jango、Flask、Tornado 、sanic等,比如Odoo、Superset都基於Flask框架進行開發的開源平台,具有強大的功能。在Linux下,默認使用的WSGI Server一般為Gunicorn, 它是一個比較出名的 Web 伺服器。在常規的 Django 和 Flask 應用部署中,都有大量的站點使用 Gunicorn。但它只支援Linux,不支援Windows,但有沒有類似Gunicorn的產品,但同時支援跨平台?答案是肯定的,那就是Waitress。一個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,官網文檔地址://docs.pylonsproject.org/projects/waitress/en/latest/,源程式碼託管網址://github.com/Pylons/waitress。
安裝Waitress只需一個命令行:pip install waitress
運行Waitress有兩種方式,一種是程式碼方式,優點靈活性會更好,可以擴展一些增強功能,比如與其他庫的交互,日誌記錄等,另一種方式waitress-serve命令行方式。本文重點介紹一下waitress-serve命令行方式,該命令行有很多參數,官方文檔://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

長按圖片掃描二維碼
也可以關注我的今日頭條號:

長按圖片掃描二維碼

