核心在于WSGIDaemonProcess指令中通过python-home指定虚拟环境根目录,使mod_wsgi加载对应解释器和site-packages;同时python-path补充项目源码路径,并在wsgi.py中硬编码site-packages到sys.path,确保依赖严格隔离。

Apache 部署 Python 应用时,配合虚拟环境隔离项目依赖,核心在于让 mod_wsgi 明确使用指定虚拟环境的 Python 解释器和包路径,而不是系统全局环境。只要配置到位,多个项目就能完全互不干扰。
为每个项目创建独立虚拟环境
不要共用一个虚拟环境。每个项目应在自身根目录下创建专属环境(如 venv 或 .venv),既便于归属识别,也方便 Git 忽略:
- 进入项目目录:
cd /var/www/myproject - 创建环境:
python3 -m venv venv - 激活后安装依赖:
source venv/bin/activate && pip install -r requirements.txt - 确认关键路径:
venv/bin/python是该环境的解释器,venv/lib/python3.x/site-packages是包安装位置
在 WSGI 脚本中显式指定虚拟环境路径
wsgi.py 不只是应用入口,更是环境“锚点”。必须在其中加载虚拟环境的 site-packages,并确保解释器正确:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 在
wsgi.py开头添加(替换为你实际的 venv 路径):
import os
venv_path = '/var/www/myproject/venv'
site_packages = os.path.join(venv_path, 'lib', 'python3.x', 'site-packages')
sys.path.insert(0, site_packages)
sys.path.insert(0, '/var/www/myproject')
- 确保
python-path参数或WSGIDaemonProcess中的python-path指向该site-packages目录 - 避免仅靠
source activate—— Apache 进程不读 shell 激活逻辑,必须硬编码路径
Apache 配置中绑定守护进程与虚拟环境
推荐使用守护进程模式(WSGIDaemonProcess),它比嵌入式更稳定,也更利于隔离:
立即学习“Python免费学习笔记(深入)”;
- 在站点配置中明确指定解释器路径和 Python 路径:
ServerName myproject.example.com
WSGIDaemonProcess myproject python-home=/var/www/myproject/venv python-path=/var/www/myproject
WSGIProcessGroup myproject
WSGIScriptAlias / /var/www/myproject/wsgi.py
...
</VirtualHost>
-
python-home指向虚拟环境根目录(venv),mod_wsgi 会自动从中加载解释器和site-packages -
python-path补充项目源码路径,确保import myapp可以找到 - 不同项目用不同
WSGIDaemonProcess名称(如myproject、otherapp),Apache 自动分隔进程空间
验证与常见问题处理
部署后务必验证是否真正生效,避免“看似隔离、实则混用”:
- 在
wsgi.py中临时加一行:assert 'venv' in sys.executable,重启 Apache 看是否报错 - 检查日志:
tail -f /var/log/apache2/error.log,关注ImportError或路径警告 - 若提示
No module named 'xxx',大概率是python-path或site-packages路径写错,或未执行pip install到该环境 - 避免在系统 Python 下运行
pip install后误以为已安装——必须在激活对应venv后操作

















