Apache部署多套Python项目需为每个项目配置独立VirtualHost、唯一WSGIDaemonProcess(含专属python-home和python-path)、独立app.wsgi入口(application变量名不可改)、正确权限与mod_wsgi启用。

在 Apache 中用虚拟主机部署多套独立 Python 项目,关键不是“复用同一套配置”,而是为每个项目分配**独立的 WSGI 进程、独立的虚拟环境路径、独立的入口文件和权限控制**。Apache 不会自动隔离 Python 环境,必须靠 WSGIDaemonProcess 显式声明,否则所有项目会共享进程、混用依赖,导致 ImportError 或运行时冲突。
每个项目配独立的 VirtualHost + 守护进程
不能多个项目共用一个 <virtualhost></virtualhost> 块,也不能共用同一个 WSGIDaemonProcess 名称。每个项目需有:
- 唯一
ServerName(如app1.local、app2.local) - 独立
WSGIDaemonProcess名称(如app1、app2) - 各自指向自己的
python-home(虚拟环境根目录)和python-path(项目代码目录) - 各自绑定唯一的
WSGIScriptAlias和<directory></directory>权限块
虚拟环境路径必须一对一精确指定
python-home 必须是虚拟环境的顶层目录(含 bin/activate),python-path 必须是项目根目录(含 app.wsgi)。例如:
- 项目 A:虚拟环境在
/var/www/app1/venv,代码在/var/www/app1→ 写python-home=/var/www/app1/venv python-path=/var/www/app1 - 项目 B:虚拟环境在
/var/www/app2/.venv,代码在/var/www/app2→ 写python-home=/var/www/app2/.venv python-path=/var/www/app2
漏写或路径错位,Python 解释器就找不到包,直接报 ModuleNotFoundError。
立即学习“Python免费学习笔记(深入)”;
WSGI 入口文件(app.wsgi)不可共用
每个项目的 app.wsgi 必须单独存在、内容独立,且必须使用固定变量名 application。典型内容如下:
import sys
import os
<h1>激活当前项目虚拟环境(可选,守护进程模式下由 python-home 保证)</h1><p>activate_this = '/var/www/app1/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/app1')</p><h1>导入 Flask/Django 应用实例</h1><p>from myapp import app as application
注意:application 是 Apache 调用的唯一入口变量名,不能改成 app 或 application1,否则 500 错误。
权限与模块启用不能遗漏
每套配置生效前,必须确认:
-
mod_wsgi已启用:sudo a2enmod wsgi(Debian/Ubuntu)或确保LoadModule wsgi_module在主配置中加载 - 每个项目目录对 Apache 用户(如
www-data)有读+执行权限:sudo chown -R www-data:www-data /var/www/app1 -
<directory></directory>块中含Require all granted,且AllowOverride All(如需 .htaccess) - 配置语法检查通过:
sudo apache2ctl -t→ 输出Syntax OK后再sudo systemctl reload apache2


















