Flask/Django 生产部署:Gunicorn vs Nginx,Windows 与 Linux 实战指引

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。
python 复制代码
# run_waitress.py
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 做负载均衡。
powershell 复制代码
# 启动 4 个实例:5001..5004
1..4 | % { Start-Process python -ArgumentList "run_waitress.py --port $([int](5000+$_))" }
  • Nginx(Windows)示例:
nginx 复制代码
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;
    }
}
  • Caddy(更易用):

    :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(最常用)

  • 启动(Flask 工厂函数):
bash 复制代码
pip install gunicorn
gunicorn 'app:create_app()' -b unix:/run/cbs/app.sock -w 4 --threads 2 --timeout 60 --access-logfile - --error-logfile -
# 或 -b 127.0.0.1:5000;workers≈2*CPU+1,I/O 多可加 --threads 或 -k gevent
  • systemd:
ini 复制代码
[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
  • Nginx:
nginx 复制代码
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?
    • WSL2/Docker 跑 Linux 栈。

  • 小结
    • Windows:Waitress 多实例 + Nginx/Caddy/IIS;Gunicorn 走 WSL2/Docker。
    • Linux:Nginx + Gunicorn,多 worker 或多 master 皆可;用 systemd 管理与平滑重载。
    • 关键:网关层与应用层分工明确,按并发特性选择 worker/threads,统一处理真实 IP。
相关推荐
q_35488851531 天前
计算机毕业设计:Python当当网图书大数据分析平台 Django框架 爬虫 Pandas 可视化 大数据 大模型 书籍(建议收藏)✅
大数据·爬虫·python·机器学习·数据分析·django·课程设计
q_35488851531 天前
计算机毕业设计源码:Python动漫智能推荐与可视化分析系统 Django框架 协同过滤推荐算法 可视化 数据分析 大数据 大模型(建议收藏)✅
python·scrapy·数据分析·django·课程设计·旅游·推荐算法
B站计算机毕业设计之家1 天前
Python 基于协同过滤的动漫推荐与数据分析平台 Django框架 协同过滤推荐算法 可视化 数据分析 大数据 大模型 计算机毕业设计(建议收藏)✅
大数据·python·scrapy·数据分析·django·课程设计·推荐算法
AC赳赳老秦1 天前
使用OpenClaw tavily-search技能高效撰写工作报告:以人工智能在医疗行业的应用为例
运维·人工智能·python·flask·自动化·deepseek·openclaw
B站计算机毕业设计之家1 天前
计算机毕业设计源码:Python图书数据智能采集与可视化大屏 当当网 Django框架 爬虫 Pandas 可视化 大数据 大模型 书籍(建议收藏)✅
爬虫·python·机器学习·信息可视化·django·pandas·课程设计
小陈工2 天前
FastAPI性能优化实战:从每秒100请求到1000的踩坑记录
python·性能优化·django·flask·numpy·pandas·fastapi
vx-程序开发2 天前
springboot在线装修管理系统-计算机毕业设计源码56278
java·c语言·spring boot·python·spring·django·php
工业互联网专业2 天前
基于Python的黑龙江旅游景点数据分析系统的实现_flask+spider
python·flask·vue·毕业设计·源码·课程设计·spider
大叔_爱编程2 天前
基于协同过滤算法的理财产品推荐系统-flask
python·flask·vue·毕业设计·源码·课程设计·协同过滤
阿梦Anmory2 天前
保姆级教程:Flask应用实现后台常驻运行(Linux服务器)
linux·服务器·flask