nginx + gunicorn/uwsgi 部署的核心是分工协作:nginx 处理 http、静态文件、ssl 和反向代理,gunicorn/uwsgi 作为 wsgi 服务器专注运行 python 应用;flask/django 自带服务器仅限调试,缺乏并发、进程管理、安全防护等生产能力。

用 Nginx 配合 uWSGI 或 Gunicorn 部署 Python Web 应用,核心在于分工明确:Nginx 负责处理 HTTP 请求、静态文件、SSL 终止和反向代理;uWSGI 或 Gunicorn 则作为 WSGI 服务器,专注运行 Python 应用逻辑。两者不是互斥选项,而是根据项目规模、团队习惯和运维成熟度来选——Gunicorn 更轻量易上手,uWSGI 功能更全但配置稍复杂。
为什么不能直接用 Flask/Django 自带服务器?
Flask 的 app.run() 和 Django 的 runserver 是开发调试工具,不具备生产级能力:
- 单进程、无并发处理能力,抗不住真实请求压力
- 无自动重启、内存泄漏防护、日志轮转等运维机制
- 缺少请求超时、连接限制、安全头设置等基础防护
- 不支持平滑重启(zero-downtime deploy)
Gunicorn 部署要点(推荐新手优先尝试)
Gunicorn 启动简单、依赖少、文档清晰,适合中小型 Flask/Django 项目:
- 安装:
pip install gunicorn(建议在虚拟环境中) - 启动命令示例:
gunicorn -w 4 -b 127.0.0.1:8000 app:app(4 工作进程,绑定本地 8000 端口) - 推荐用配置文件管理(如
gunicorn.conf.py),统一设定 worker 数、日志路径、超时时间、最大请求数等 - 务必配合进程管理器(Supervisor 或 systemd),避免终端关闭后服务退出
uWSGI 部署要点(适合需要精细调优的场景)
uWSGI 功能更丰富(支持多种协议、内置缓存、信号控制、动态重载),但配置项多、出错提示不够友好:
- 安装:
pip install uwsgi(注意 Python 版本匹配,避免因系统默认 Python 2 导致加载失败) - 常用通信方式有两种:TCP 端口(如
--socket 127.0.0.1:8001)或 Unix socket 文件(如--socket /tmp/myapp.sock),后者性能略高且更安全 - Nginx 配置需与 uWSGI 模式严格对应:用端口就写
proxy_pass http://127.0.0.1:8001;用 socket 就写uwsgi_pass unix:/tmp/myapp.sock - 建议启用
stats接口(如stats = 127.0.0.1:9191)用于监控进程状态
Nginx 配置关键项(两者通用)
Nginx 是流量入口,配置质量直接影响稳定性与安全性:
-
反向代理必须指向正确后端地址:Gunicorn 用
proxy_pass http://127.0.0.1:8000;uWSGI TCP 模式同理,Unix socket 模式则改用uwsgi_pass指令 -
静态文件交给 Nginx 直接服务:Django 设
alias /path/to/static/;,Flask 可配location /static { alias /home/app/static/; } -
加必要 header:如
proxy_set_header Host $host;、proxy_set_header X-Real-IP $remote_addr;,确保应用能获取真实客户端信息 -
设超时和缓冲区:避免长请求被中断,例如
proxy_read_timeout 300;、proxy_buffering on;
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











