全名 Green Unicorn,是一個基於Python的WSGI HTTP伺服器,被設計用於運行 Python 網站為,為Flask等框架提供了可靠的支援。Gunicorn 是一個簡單、高效且與多數 Python 網框架兼容的 WSGI 伺服器,適合部署在生產環境中。
Gunicorn 的特點
與其他 WSGI 伺服器的比較
與 uWSGI、mod_wsgi 等其他 WSGI 伺服器相比,Gunicorn 更加輕量且配置簡單。
Gunicorn 的優勢
安裝 Gunicorn
環境需求 : Gunicorn 支持 Python 2.7、3.4 及以上版本。
可以直接使用 pip 安裝 pip install gunicorn
啟動基本命令,指定應用程序,假設應用程式在 myapp.py 中,並包含 WSGI 應用 app。gunicorn myapp:app
Port --bind or -bgunicorn -b 0.0.0.0:8000 myapp:app
工作進程數量 --workers or -wgunicorn -w 3 myapp:app
配置文件
可以將配置選項寫入文件中,例如 gunicorn.conf.py,並使用 -c or --config 參數加載:
以下列出常用的設定,詳細可以參考官網 document
# 是否開啟除錯模式,當程式碼有變動,會自動重啟
debug = True
# 訪問地址
bind = "0.0.0.0:6000"
# 工作進程數
workers = 2
# 工作線程數
threads = 2
# 超時時間
timeout = 600
# 輸出日誌級別
loglevel = 'debug'
# 存放日誌路徑
pidfile = "log/gunicorn.pid"
# 存放訪問日誌路徑
accesslog = "log/access.log"
# 存放錯誤日誌路徑
errorlog = "log/debug.log"
# gunicorn + apscheduler 場景下,解決多 worker 運行定時任務重複執行的問題
preload_app = True
gunicorn -c gunicorn.conf.py myapp:app
工作模式
gunicorn 有分成幾種工作模式,可以依據需求挑選不同工作模式
命令行-k STRING或者--worker-class STRING
一共有五種工作模式,sync、eventlet、gevent、tornado、gthread
默認的工作模式是sync。
詳細語法內容可以參考 官網document
每個應用模式情景可以參考 官網document-Design
工作模式類別指令如下: gunicorn --worker-class sync myapp:app
:
描述:同步工作進程,每次處理一個請求。
適用場景:適合大多數常規工作負載。
gunicorn --worker-class eventlet myapp:app
:
描述:基於 Eventlet 的異步工作進程。
適用場景:需要 Eventlet >= 0.24.1,用於高併發的應用。
gunicorn --worker-class gevent myapp:app
:
描述:基於 Gevent 的異步工作進程。
適用場景:需要 Gevent >= 1.4,用於高併發的應用。
gunicorn --worker-class tornado myapp:app
:
描述:基於 Tornado 的工作進程。
適用場景:需要 Tornado >= 0.2,適合使用 Tornado 開發的應用。
gunicorn --worker-class gthread myapp:app
:
描述:基於線程的工作進程。
適用場景:適合需要同時處理多個請求的場景,Python 2 需要 futures package。
大致可以簡單分為以下種類,以滿足不同應用場景的需求:
Sync Workers:
描述:同步工作進程,每次處理一個請求。
特點:簡單易用,但不支持持久連接。適合簡單的、低併發的應用。
Async Workers:
描述:異步工作進程,基於 Greenlets (Eventlet 和 Gevent) 實現。
特點:適合高併發場景,可以處理長時間的請求如外部 API 調用或流式請求。
Gthread Workers:
描述:基於線程的工作進程,接受連接後將其添加到線程池中處理。
特點:適合需要同時處理多個請求的場景,能有效利用多核 CPU。
Tornado Workers:
描述:基於 Tornado 框架的工作進程。
特點:適合使用 Tornado 開發的應用,但不推薦用於 WSGI 應用。
AsyncIO Workers:
描述:基於 Python 3 的 AsyncIO 實現。
特點:適合需要使用 aiohttp 的應用,能充分利用 AsyncIO 的優勢。
性能調適
工作進程的數量設定
一般建議設定為 (2 x 核心數量) + 1
。過多的工作進程會導致系統資源過度消耗,降低整體吞吐量。gunicorn --workers=4 myapp:app
超時設置
適當的超時設置可以避免工作進程長時間處於無響應狀態,提升伺服器穩定性。gunicorn --timeout=30 myapp:app
一個簡單的 Flask 應用部署示例
假設應用程式在 app.py 中:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, World!"
啟動 Gunicorn:gunicorn app:app --bind 0.0.0.0:5005
就可以看到flask服務以gunicron啟動。