apache 本身不是 wsgi 服务器,需通过 mod_wsgi 模块使其具备 wsgi 执行能力;须确认模块已加载、编写含 application 可调用对象的 wsgi 入口文件、配置虚拟主机映射并设置正确权限后重启服务。

Apache 本身不是 WSGI 服务器,它需要通过 mod_wsgi 模块来充当 WSGI 容器,从而运行 Python Web 应用。实现连接的关键不是“对接外部 WSGI 服务器”(如 Gunicorn 或 uWSGI),而是让 Apache 自身具备 WSGI 执行能力——mod_wsgi 就是这个桥梁。
确认 Apache 已加载 mod_wsgi 模块
这是最基础也最容易被跳过的一步。Apache 必须识别并启用该模块,否则所有后续配置都无效。
- 检查模块是否已安装:运行
apache2ctl -M | grep wsgi(Debian/Ubuntu)或httpd -M | grep wsgi(RHEL/CentOS),应看到wsgi_module (shared) - 若未出现,需先安装:Ubuntu 上执行
sudo apt install libapache2-mod-wsgi-py3,并确保启用:sudo a2enmod wsgi - Windows 用户需手动将
mod_wsgi.so复制到 Apache 的modules/目录,并在httpd.conf中添加LoadModule wsgi_module modules/mod_wsgi.so
编写符合规范的 WSGI 入口文件
Apache 通过该文件启动你的 Python 应用。它必须暴露一个名为 application 的可调用对象(函数或实例),且签名严格匹配 WSGI 标准。
- 示例
/var/www/myapp/app.wsgi:
import sys
import os
<h1>激活虚拟环境(如有)</h1><p>activate_this = '/var/www/myapp/venv/bin/activate_this.py'
if os.path.exists(activate_this):
exec(open(activate_this).read(), {'<strong>file</strong>': activate_this})</p><h1>添加项目路径到 Python 路径</h1><p>sys.path.insert(0, '/var/www/myapp')
os.chdir('/var/www/myapp')</p><h1>加载应用(以 Flask 为例)</h1><p>from myapp import app as application</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6933" title="python-script-generator"><img
src="https://img.php.cn/upload/skill/000/000/081/179119443150703.jpg" alt="python-script-generator" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill6933" title="python-script-generator" class="overflowclass">python-script-generator</a>
<p class="overflowclass">快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。</p>
</div>
<a rel="nofollow" href="/xiazai/skill6933" title="python-script-generator" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>- 注意:文件名任意,但入口变量名必须是
application;若用其他名字(如my_app),需在 Apache 配置中用WSGICallableObject my_app显式声明 - 务必设置正确的
sys.path和工作目录,否则导入会失败
配置 Apache 虚拟主机映射请求到 WSGI
Apache 需知道哪些 URL 请求应交给哪个 WSGI 脚本处理。推荐使用守护进程模式(WSGIDaemonProcess + WSGIProcessGroup),更稳定、隔离性更好。
- 典型配置片段(保存为
/etc/apache2/sites-available/myapp.conf):
<virtualhost>
ServerName example.com
<pre class="brush:php;toolbar:false;"># 启动守护进程组
WSGIDaemonProcess myapp python-path=/var/www/myapp python-home=/var/www/myapp/venv
WSGIProcessGroup myapp
WSGIScriptAlias / /var/www/myapp/app.wsgi
<Directory /var/www/myapp/app.wsgi>
Require all granted
</Directory>
# 静态文件建议单独由 Apache 服务(提升性能)
Alias /static /var/www/myapp/static
<Directory /var/www/myapp/static>
Require all granted
</Directory>
-
python-home指向虚拟环境根目录(启用 venv);python-path是项目源码路径 -
WSGIScriptAlias /表示挂载到网站根路径;若只想挂载到/api,写成WSGIScriptAlias /api /path/to/app.wsgi - 静态文件不要由 Python 应用处理,用
Alias交由 Apache 直接返回
权限与重启验证
配置生效前,权限和重启缺一不可。
- 确保 Apache 进程用户(通常是
www-data或apache)对 WSGI 文件、项目目录、虚拟环境有读取和执行权限 - 启用站点并重载配置:
sudo a2ensite myapp.conf && sudo systemctl reload apache2 - 查看错误日志定位问题:
sudo tail -f /var/log/apache2/error.log(Ubuntu)或/var/log/httpd/error_log(CentOS) - 访问域名或 IP,看到预期响应即成功;若报 500,90% 原因是 WSGI 文件路径错误、Python 导入失败或权限不足
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










