mod_proxy_uwsgi核心是让apache通过原生uwsgi协议直连python后端,比http更轻量高效;必须同时启用mod_proxy和mod_proxy_uwsgi模块,uwsgi需监听uwsgi协议套接字(非http),配置proxypass使用uwsgi://前缀,并排除静态路径以提升性能。

直接用 mod_proxy_uwsgi 连接 Python 后端,核心是让 Apache 通过原生 uWSGI 协议与后端通信,比走 HTTP 更轻量、更高效。它不依赖中间协议解析,适合高并发、低延迟的生产场景。
确认模块已启用并加载
Apache 必须同时启用 mod_proxy 和 mod_proxy_uwsgi,缺一不可。仅启用了 mod_proxy 是无法识别 uwsgi:// 协议的。
- 在 Ubuntu/Debian 上:运行
a2enmod proxy proxy_uwsgi,再systemctl reload apache2 - 在 RHEL/CentOS 上:确保配置中有
LoadModule proxy_module modules/mod_proxy.so和LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so,路径需核对实际模块位置(如/usr/lib64/httpd/modules/) - 验证是否生效:
apache2ctl -M | grep -E "(proxy|uwsgi)"或httpd -M | grep -E "(proxy|uwsgi)"
配置 uWSGI 启动监听 uwsgi 协议套接字
uWSGI 必须以 Unix socket 或 TCP socket 方式暴露 uwsgi 协议,不能只开 HTTP 端口(如 --http :8000)。推荐使用 TCP 监听便于跨机或调试,例如:
- 命令行启动:
uwsgi --socket 127.0.0.1:8001 --module myapp.wsgi:application --master --processes 4 --threads 2 - 配置文件(
uwsgi.ini)示例:[uwsgi] chdir = /var/www/myapp module = myapp.wsgi:application socket = 127.0.0.1:8001 chmod-socket = 660 vacuum = true master = true processes = 4 die-on-term = true
注意:不要混用 --http 和 --socket;若只用 --http,Apache 就必须用 mod_proxy_http,失去 uWSGI 协议优势。
在虚拟主机中设置 ProxyPass 规则
Apache 配置里用 uwsgi:// 前缀指向 uWSGI 实例,同时建议排除静态资源路径,交由 Apache 直接服务:
- 基础反向代理:
<virtualhost> ServerName example.com ProxyPass / uwsgi://127.0.0.1:8001/ ProxyPassReverse / uwsgi://127.0.0.1:8001/ </virtualhost> - 跳过静态文件(如
/static和/media):<location> ProxyPass ! </location><location> ProxyPass ! </location> ProxyPass / uwsgi://127.0.0.1:8001/ ProxyPassReverse / uwsgi://127.0.0.1:8001/ - 如需负载均衡,搭配
mod_proxy_balancer和mod_lbmethod_byrequests:ProxyPass "/app/" "balancer://myuwsgi/" <proxy> BalancerMember uwsgi://127.0.0.1:8001 BalancerMember uwsgi://127.0.0.1:8002 </proxy>
安全与权限关键点
该方案虽高效,但绕过了 HTTP 层过滤,需格外注意边界控制:
-
禁止开放正向代理:确保全局配置中
ProxyRequests Off已设置,否则可能被滥用为开放代理 -
限制后端访问范围:uWSGI 应绑定
127.0.0.1(而非0.0.0.0),避免外部直连 -
Socket 权限匹配:若改用 Unix socket(如
socket = /run/uwsgi/app.sock),需确保 Apache 工作用户(如www-data或apache)对该 socket 文件有读写权限 -
启用 ProxyPreserveHost:设为
On可将原始 Host 头传给 uWSGI,对多租户或 Django 的ALLOWED_HOSTS判断很重要
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











