核心在于分层协作:nginx负责接入口、静态资源和负载调度,uwsgi专注执行python逻辑,django/flask只管业务代码;三者职责分离、不重叠,通过uwsgi协议通信,实现稳定高效生产部署。

核心在于分层协作:Nginx 负责接入口、静态资源和负载调度,uWSGI 专注执行 Python 逻辑,Django/Flask 只管业务代码。三者不混用职责,才能稳定高效。
明确各组件角色,避免功能重叠
Nginx 不是 Python 应用服务器,它不解析 .py 文件,也不运行 Django 的 manage.py;uWSGI 也不是反向代理网关,它不直接面向公网、不处理 SSL 终止或 gzip 压缩;Django/Flask 更不是 Web 服务器,wsgi.py 里那个 application 对象只是协议入口,不能监听端口对外服务。
常见误区包括:
- 用 uWSGI 直接监听 80 端口并暴露公网(缺少 Nginx 的安全过滤和连接管理)
- 在 Nginx 配置里用 proxy_pass 指向 http://127.0.0.1:8000(绕过 uwsgi 协议,浪费性能)
- 让 Django 自带的 runserver 在生产环境运行(无并发、无守护、无日志轮转)
用 uwsgi 协议通信,而非 HTTP
uWSGI 和 Nginx 之间推荐使用 uwsgi 协议(二进制、低开销),而不是 HTTP 协议。这需要两处配合:
- Nginx 配置中用 uwsgi_pass 指向 Unix socket 或 TCP 地址,例如
uwsgi_pass unix:/run/uwsgi/app.sock; - uWSGI 启动时启用 uwsgi protocol,如加参数
--socket /run/uwsgi/app.sock --chmod-socket=664 - 确保 Nginx 进程用户(如 www-data)对 socket 文件有读写权限
- 禁用 uWSGI 的
--http参数,避免多协议冗余监听
合理配置 uWSGI 进程与资源
不要盲目堆进程数。典型生产配置应兼顾 CPU 核心数、内存限制和请求特性:
- 进程数建议设为 CPU 核心数 × 2(例如 4 核机器设
--processes 8) - 启用
--master,由主进程管理 worker 生命周期 - 用
--max-requests 5000和--max-requests-delta 500防止内存泄漏累积 - 添加
--vacuum,退出时自动清理 socket 和临时文件 - 日志输出到文件而非 stdout:
--logto /var/log/uwsgi/app.log
Nginx 配合要点:静态分离 + 安全加固
Django/Flask 的静态文件(CSS/JS/图片)绝不经 Python 处理。Nginx 应直接响应:
- 在 server 块中单独配 location ~ ^/(static|media)/,指向实际目录,如
alias /opt/myapp/static/; - 设置
expires 1h;和add_header Cache-Control "public, immutable";提升前端加载速度 - 禁止访问敏感路径:
location ~* \.(py|pyc|env|ini|yml)$ { return 404; } - 启用 Gzip:
gzip on; gzip_types text/plain application/json text/css application/javascript;
这套组合不是越复杂越好,而是每层只做一件事,并把那件事做到位。Nginx 把请求分得准,uWSGI 把 Python 执行得稳,框架就把业务写得清——自然就高效了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











