apache通过mod_wsgi守护进程模式支持python虚拟环境,核心是wsgidaemonprocess指令明确指定python-home(虚拟环境根目录)和python-path(项目目录),并确保mod_wsgi与python版本严格匹配、权限正确、app.wsgi中使用固定application变量名。

Apache 本身不直接运行 Python 代码,要让它通过虚拟主机支持 Python 虚拟环境,核心是用 mod_wsgi 的守护进程模式,把虚拟环境路径明确注入 WSGI 进程,同时配合正确的权限与路径配置。不是简单改 DocumentRoot 就能跑 Python 应用。
确保 mod_wsgi 与 Python 版本严格匹配
安装前确认系统 Python 版本(如 python3.9),再装对应模块:
- Ubuntu/Debian:
sudo apt install libapache2-mod-wsgi-py3 - CentOS/RHEL:
sudo yum install mod_wsgi(自动匹配系统 Python) - 装完启用:
sudo a2enmod wsgi,然后sudo systemctl restart apache2 - 验证是否加载:
apache2ctl -M | grep wsgi—— 必须看到wsgi_module (shared)
在虚拟主机中指定虚拟环境路径
关键不在 DocumentRoot,而在 WSGIDaemonProcess 指令。它必须显式包含虚拟环境的 site-packages 路径:
- 假设项目在
/var/www/myflask,虚拟环境在/var/www/myflask/venv - 在站点配置文件(如
/etc/apache2/sites-available/myapp.conf)中写:
<virtualhost>
ServerName myapp.local
WSGIDaemonProcess myapp \
python-path=/var/www/myflask \
python-home=/var/www/myflask/venv \
processes=2 threads=15
WSGIProcessGroup myapp
WSGIScriptAlias / /var/www/myflask/app.wsgi
<pre class="brush:php;toolbar:false;"><Directory /var/www/myflask>
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/myapp_error.log
CustomLog ${APACHE_LOG_DIR}/myapp_access.log combined
python-home 是虚拟环境根目录(含 bin/activate),python-path 是项目根目录——两者都必须写对,缺一不可。否则会报 ModuleNotFoundError。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
准备 WSGI 入口文件(app.wsgi)
这个文件是 Apache 和 Python 应用之间的桥梁,必须放在项目目录下,内容需激活虚拟环境并导入应用实例:
- 确保
app.wsgi有可读权限:sudo chown www-data:www-data /var/www/myflask/app.wsgi - 内容示例(适配 Flask):
import sys
import os
<h1>激活虚拟环境(可选,但推荐双重保险)</h1><p>activate_this = '/var/www/myflask/venv/bin/activate_this.py'
if os.path.exists(activate_this):
exec(open(activate_this).read(), {'<strong>file</strong>': activate_this})</p><h1>添加项目路径</h1><p>sys.path.insert(0, '/var/www/myflask')</p><p>from app import app as application # 假设主程序是 app.py,实例名为 app</p>注意:application 是固定变量名,不能改成其他名字,mod_wsgi 只认这个名称。
权限与调试要点
常见失败几乎都源于权限或路径错误:
- Apache 用户(通常是
www-data或apache)必须能读取整个项目目录、wsgi 文件、虚拟环境目录 - 检查日志:
tail -f /var/log/apache2/myapp_error.log,90% 的问题看这里就能定位 - 不要用嵌入式模式(即不用
WSGIRestrictEmbedded off),生产环境只用守护进程模式 - 静态文件(CSS/JS)建议仍由 Apache 直接服务,可在配置中加
Alias /static /var/www/myflask/static并设置对应<directory></directory>
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










