Gunicorn 与 Nginx:生产环境 Web 服务器配置
📂 所属阶段:第六阶段 — 上线部署(生产篇)
🔗 相关章节:Docker 部署全流程 · 环境变量与安全配置
做了三个月的 Flask 项目管理后台终于要上线了!之前用 flask run 自测,多开两个标签页刷新日志页面就卡顿,甚至偶尔 502。查了一圈,Gunicorn 多进程处理动态请求 + Nginx 反向代理做静态文件/SSL/负载均衡入口,是 Python Web 生产部署的「黄金入门组合」——今天就带大家快速搭一套带日志、守护进程、安全配置的完整方案。
1. 为什么要放弃 flask run,选 Gunicorn?
先对比下两者的能力边界,就知道为什么生产环境坚决不能用内置服务器了:
2. Gunicorn 的安装与基本配置
2.1 环境准备
确保你的项目在虚拟环境中运行(避免全局依赖污染),然后直接用 pip 安装:
2.2 启动方式
Gunicorn 支持两种启动模式:命令行传参、配置文件(推荐,更规范易维护)。
命令行快速启动
适合临时测试:
参数解释:
-w 4:启动 4 个 Worker 进程(核心数×2+1 是黄金公式,后面细说)-b 127.0.0.1:8000:绑定本地 8000 端口(不要直接绑定 0.0.0.0 暴露公网,留 Nginx 做入口)
配置文件启动(生产必选)
创建 gunicorn.conf.py 放在项目根目录,所有配置统一管理:
启动配置文件:
3. Nginx 反向代理配置
Gunicorn 处理动态请求没问题,但做SSL 加密、静态文件服务、Gzip 压缩、负载均衡入口就太弱了——这些专业的活交给 Nginx。
3.1 前置准备
- 确保服务器已安装 Nginx(Ubuntu/Debian 用
apt install nginx,CentOS 用yum install nginx) - 准备好域名和 SSL 证书(推荐免费的 Let's Encrypt,用
certbot自动申请) - 把静态文件(CSS/JS/图片)、媒体文件(用户上传的)集中放到 Nginx 可访问的目录(比如
/var/www/daoman/)
3.2 配置文件
创建 /etc/nginx/conf.d/daoman.conf(避免直接修改 nginx.conf,方便后续维护/删除):
3.3 测试与重启 Nginx
4. Systemd 守护进程管理
生产环境不能手动敲命令启动 Gunicorn,万一服务器重启、进程异常挂掉,没人手动重启就完了——用 systemd(Linux 系统自带的服务管理工具)来守护。
4.1 创建服务文件
创建 /etc/systemd/system/daoman.service:
4.2 激活与管理服务
5. 生产部署架构与最佳实践小结
完整架构图
3 个关键最佳实践
- Worker 数量调整:纯 CRUD 接口用「CPU核心数×2+1」,如果是 IO 密集型(比如爬虫后台、调用第三方 API),可以加到「CPU核心数×4」,但不要超太多(会增加进程切换开销)。
- 安全第一:
- 强制 HTTPS(不要留 HTTP 端口)
- Gunicorn 只绑定本地 127.0.0.1
- 静态/媒体文件目录权限设为
www-data:www-data,不要给 777 - 环境变量不要写在代码里,用
.env或 systemd 配置
- 发布流程优化:用
git pull拉新代码 →systemctl reload daoman优雅重载(发布期间不中断用户请求)。
🔗 扩展阅读

