Nginx 本身不执行 Python 代码,多版本共存关键在于后端服务绑定指定解释器路径:Nginx Unit 通过 application 块的 "home" 字段指定根目录(如 "/opt/python3.11"),自动查找 bin/python;Gunicorn/uWSGI 则须用绝对路径启动(如 "/opt/python3.11/bin/python -m gunicorn"),并推荐 systemd 固定 ExecStart 避免 PATH 污染。

Nginx 本身不执行 Python 代码,所以“多版本共存”的关键不在 Nginx 配置里,而在于后端服务如何绑定指定 Python 解释器。Nginx 只负责把请求转发过去,真正跑哪个版本的 Python,得看 Gunicorn、uWSGI 或 Nginx Unit 启动时用的是哪条 python 命令。
用 Nginx Unit 直接指定解释器根目录
这是目前最简洁、最隔离的方式。Unit 原生支持多语言多版本,每个 application 独立声明 Python 版本路径:
-
home 字段填解释器安装根目录(不是 bin/python 路径),比如
/opt/python3.11或/usr/local - Unit 会自动在其下查找
bin/python并加载对应环境 - 配置示例中,FastAPI 项目指向
"home": "/opt/python3.11",Django 项目可同时指向"home": "/usr/local/bin/python3.10" - 修改后只需重发 JSON 片段,不用重启整个 Unit 服务,毫秒级生效
用 Gunicorn/uWSGI 时必须用绝对路径启动
别依赖系统 PATH 或全局 python 命令——它容易被污染或指向错误版本:
- Gunicorn:直接调用目标解释器启动,例如
/opt/python3.11/bin/python -m gunicorn --bind 127.0.0.1:8001 myapp:app - uWSGI:在 ini 文件中用
virtualenv = /path/to/venv或命令行加--virtualenv指定环境 - 强烈建议写成 systemd service 文件,在
ExecStart=行固定完整路径,避免运行时歧义
反向代理配置本身无需区分 Python 版本
Nginx 的 server 或 location 块只管转发,和 Python 版本无关。只要后端服务监听在不同端口或地址,Nginx 就能照常代理:
立即学习“Python免费学习笔记(深入)”;
- 比如 v1 应用跑在
127.0.0.1:8001(由 Python 3.10 启动),v2 跑在127.0.0.1:8002(由 Python 3.11 启动) - Nginx 配置只需写
proxy_pass http://127.0.0.1:8001/;和proxy_pass http://127.0.0.1:8002/; - 注意
proxy_pass末尾斜杠是否保留,它影响路径重写逻辑
Windows 宝塔等图形面板需警惕进程残留
尤其在 Windows 上改完配置后,旧 Nginx 进程可能没真正退出,导致新配置不生效:
- 手动杀进程:
taskkill /f /im nginx.exe - 再用绝对路径启动:
"C:/BtSoft/nginx/nginx.exe" -p "C:/BtSoft/nginx/" -c "C:/BtSoft/nginx/conf/nginx.conf" - Python 版本推荐用 3.10.x 或 3.11.x,3.15+ 在部分 Windows 环境存在兼容性问题


















