直接用mod_proxy_uwsgi直连uWSGI原生协议是Apache部署Python服务最轻量高效的方式,需同时启用mod_proxy与mod_proxy_uwsgi模块、uWSGI监听TCP socket(如127.0.0.1:8001)、Apache配置ProxyPass使用uwsgi://前缀并设置ProxySet连接池参数。

直接用 Apache 虚拟主机支持高并发 Python 服务,关键不是堆配置项,而是选对通信路径——用 mod_proxy_uwsgi 直连 uWSGI 原生协议,绕过 HTTP 解析开销。它比 mod_wsgi 守护进程模式更轻量,比反向代理 Nginx + uWSGI 更省资源,特别适合已运行 Apache 且需复用其 SSL 终止、权限控制和静态文件能力的场景。
启用必要模块并禁用正向代理
mod_proxy_uwsgi 不是独立模块,必须和 mod_proxy 同时加载,否则 uwsgi:// 协议无法识别:
- Ubuntu/Debian:运行
a2enmod proxy proxy_uwsgi,再systemctl reload apache2 - RHEL/CentOS:确认
httpd.conf中有两行(路径按实际模块位置调整):LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so - 必须添加
ProxyRequests Off(放在全局或虚拟主机内),否则代理配置不生效,还存在安全风险
uWSGI 必须监听 TCP socket 并关闭 HTTP 模式
mod_proxy_uwsgi 只支持 127.0.0.1:PORT 格式的 TCP socket,不支持 Unix socket 或 HTTP 端口:
- 启动命令示例:
uwsgi --socket 127.0.0.1:8001 --module myapp.wsgi:application --master --processes 4 --threads 2 --vacuum --die-on-term - 推荐使用配置文件(如
/etc/uwsgi/myapp.ini):[uwsgi]<br>chdir = /var/www/myapp<br>module = myapp.wsgi:application<br>socket = 127.0.0.1:8001<br>master = true<br>processes = 4<br>threads = 2<br>vacuum = true<br>die-on-term = true
- 切勿混用
--http或http-socket,否则 Apache 会误走 HTTP 代理逻辑而失败
虚拟主机中配置 ProxyPass 与连接池参数
在 <VirtualHost> 内写明代理规则,并用 <Proxy> 块设置连接行为,避免请求堆积或后端雪崩:
立即学习“Python免费学习笔记(深入)”;
- 基础转发:
ProxyPass / uwsgi://127.0.0.1:8001/<br>ProxyPassReverse / uwsgi://127.0.0.1:8001/
- 连接池调优(加在
<Proxy "uwsgi://127.0.0.1:8001">块内):ProxySet min=2 max=50 acquire=3000 retry=60
其中max=50是每个 Apache 子进程最多维持的连接数,不是全局上限;retry=60表示后端宕机后 60 秒内不转发新请求 - 静态资源建议排除(如
/static、/media),由 Apache 直接服务:ProxyPass /static !<br>ProxyPass /media !
配合 MPM 模型合理分配资源
Apache 的并发能力取决于所用 MPM(如 prefork、event)。Python 应用 I/O 密集,推荐 event MPM + uWSGI 异步 worker:
- Ubuntu 上启用 event:
a2dismod mpm_prefork && a2enmod mpm_event - uWSGI 配合异步(需 uWSGI ≥ 2.0.20):
async = 2<br>workers = 1<br>plugin = asyncio
- 检查当前 MPM:
apache2ctl -V | grep -i mpm,确保与配置匹配


















