對於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,官網文檔地址: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

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

長按圖片掃描二維碼
