Flask/Django 生產部署:Gunicorn vs Nginx,Windows 與 Linux 實戰指引
TL;DR
- Gunicorn:Python WSGI 應用服務器,運行 Flask/Django(Linux 用)。
- Nginx:反向代理/網關(TLS、靜態、限流、緩存、IP 過濾),不運行 Python。
- Windows:不要用 Gunicorn,用 Waitress;如需 Gunicorn,用 WSL2/Docker。
- Linux:標準做法 Nginx → Gunicorn(多 worker)→ 應用。
1. 角色與分工
- Gunicorn(應用服務器):多進程/線程、連接處理、超時、重啟、日志;負責把 Python 應用跑起來。
- Nginx(反向代理/網關):TLS、靜態文件、緩沖/抗慢連接、壓縮、緩存、限流、負載均衡、黑白名單。
- 常見拓撲:互聯網 → Nginx → Gunicorn → Flask/Django。
2. Windows 部署(Gunicorn 不支持)
2.1 單機/內網(最簡)
- 用 Waitress(WSGI) 直接運行 Flask/Django。
from app import create_app
from waitress import serve
app = create_app()
if __name__ == '__main__':serve(app, host='0.0.0.0', port=5000, threads=8)
2.2 多實例 + 負載(推薦)
- 啟多個 Waitress 實例(不同端口),前置 Nginx/Caddy/IIS 做負載均衡。
1..4 | % { Start-Process python -ArgumentList "run_waitress.py --port $([int](5000+$_))" }
upstream backend {server 127.0.0.1:5001;server 127.0.0.1:5002;server 127.0.0.1:5003;server 127.0.0.1:5004;keepalive 64;
}
server {listen 80;location / {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $host;proxy_pass http://backend;}
}
:80 {reverse_proxy 127.0.0.1:5001 127.0.0.1:5002 127.0.0.1:5003 127.0.0.1:5004
}
- 守護與自啟動:用 NSSM 把每個實例注冊為 Windows 服務。
2.3 想用 Gunicorn?
- 在 WSL2 或 Docker 內運行 Linux 棧:Nginx + Gunicorn + 應用;Windows 側通過端口映射訪問。
3. Linux 部署(標準做法)
3.1 單服務多 worker(最常用)
pip install gunicorn
gunicorn 'app:create_app()' -b unix:/run/cbs/app.sock -w 4 --threads 2 --timeout 60 --access-logfile - --error-logfile -
[Unit]
Description=CBS via Gunicorn
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/srv/cbs
ExecStart=/srv/cbs/venv/bin/gunicorn 'app:create_app()' --bind unix:/run/cbs/app.sock --workers 4 --threads 2 --timeout 60 --access-logfile - --error-logfile -
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
[Install]
WantedBy=multi-user.target
upstream backend { server unix:/run/cbs/app.sock; keepalive 64; }
server {listen 80;location / {proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $host;proxy_http_version 1.1;proxy_set_header Connection "";proxy_pass http://backend;}
}
- 平滑重載:
systemctl reload cbs.service
或向 master 發送 HUP
。
3.2 多 Gunicorn master + 負載(更強隔離)
- 啟兩個 socket,Nginx upstream 負載;便于滾動升級與故障隔離。
3.3 Django 說明
- 啟動目標改為
myproject.wsgi:application
;靜態資源 collectstatic
后由 Nginx 下發。
4. 調優與實踐要點
- 分工:靜態、TLS、緩沖、限流交給 Nginx;業務交給應用服務器。
- 并發模型:CPU 密集——多 worker;I/O 多——加
--threads
或 -k gevent
。 - 超時:Gunicorn
--timeout
與 Nginx proxy_read_timeout
對齊。 - 預加載:
--preload
+ CoW 可省內存(確認初始化無副作用)。 - 真實 IP:只信任邊界代理注入的
X-Forwarded-For/X-Real-IP
。 - 守護:Windows 用 NSSM;Linux 用 systemd;容器用 Compose/K8s。
5. FAQ
- 后端“用 Gunicorn 代理還是 Nginx 代理”?
- 說法不準確:Gunicorn 運行應用,Nginx 才是代理。生產推薦二者搭配。
- Windows 一定要 Nginx 嗎?
- 不是必須;內網可直連 Waitress。需要 TLS/限流/負載時再加 Nginx/Caddy/IIS。
- 非得用 Gunicorn 又是 Windows?
- 小結
- Windows:Waitress 多實例 + Nginx/Caddy/IIS;Gunicorn 走 WSL2/Docker。
- Linux:Nginx + Gunicorn,多 worker 或多 master 皆可;用 systemd 管理與平滑重載。
- 關鍵:網關層與應用層分工明確,按并發特性選擇 worker/threads,統一處理真實 IP。