关键在于后端服务启动时明确使用虚拟环境中的Python解释器,而非依赖Nginx配置或shell环境变量;需用绝对路径调用venv/bin/python启动Gunicorn/Uvicorn,或在systemd service中固化该路径,Nginx Unit则通过home字段指定venv根目录。

关键不在 Nginx 配置里写路径,而在于让后端服务(Gunicorn、Uvicorn 或 Nginx Unit)启动时,**明确使用虚拟环境里的 Python 解释器**。Nginx 本身不运行 Python,它只负责把请求转发给已启动的服务进程——这个进程用哪个 python,决定了实际执行环境。
每个项目配独立虚拟环境 + 绝对路径调用
不能靠 python 或 python3 命令,必须用虚拟环境内 bin 目录下的完整路径:
- 创建虚拟环境时指定目标 Python 版本,例如:
python3.11 -m venv /var/www/myapp/venv - 激活只是开发便利,生产部署中不激活,而是直接调用:
/var/www/myapp/venv/bin/python - Gunicorn 启动示例:
/var/www/myapp/venv/bin/python -m gunicorn --bind 127.0.0.1:8001 myapp:app - Uvicorn 启动示例:
/var/www/myapp/venv/bin/python -m uvicorn main:app --host 127.0.0.1 --port 8002
用 systemd 管理服务,固化解释器路径
避免手动运行或依赖 shell 环境变量,通过 systemd service 文件锁定解释器位置:
- 新建
/etc/systemd/system/myapp.service -
ExecStart=行必须写全路径,例如:ExecStart=/var/www/myapp/venv/bin/python -m gunicorn --bind 127.0.0.1:8001 myapp:app - 加上
WorkingDirectory=/var/www/myapp和User=www-data,确保上下文一致 - 启用并启动:
systemctl daemon-reload && systemctl enable --now myapp
Nginx Unit:直接在 JSON 配置中声明 home 路径
如果你用的是 Nginx Unit(推荐用于多版本隔离),它的 home 字段指向虚拟环境根目录(不是 bin 子目录):
立即学习“Python免费学习笔记(深入)”;
- Unit 会自动在其
bin/python下查找解释器,所以"home": "/var/www/myapp/venv"即可 - 完整片段示例:
"applications": { "myapp": { "type": "python", "home": "/var/www/myapp/venv", "path": "/var/www/myapp", "module": "main:app" } } - 更新配置只需
curl -X PUT --data-binary @unit-config.json http://localhost:8443/config/applications/myapp,无需重启
验证是否生效的简单方法
别只看进程名,要查实际加载的解释器:
- 查进程打开的文件:
lsof -p $(pgrep -f "gunicorn.*myapp") | grep python,确认路径指向你的 venv - 在应用代码里加一行日志:
import sys; print("Python path:", sys.executable),看输出是否为/var/www/myapp/venv/bin/python - 检查
ps aux | grep myapp,命令行参数里应出现完整 venv 的 python 路径


















