Apache通过mod_proxy_uwsgi代理uWSGI是成熟安全的部署方式,需启用proxy、proxy_http、proxy_uwsgi三模块,uWSGI须监听TCP端口(如127.0.0.1:8080),Apache配置中使用uwsgi://协议反向代理并排除静态路径。

Apache 通过 mod_proxy_uwsgi 连接 uWSGI 是一种成熟、安全且轻量的 Python 应用部署方式,特别适合已有 Apache 环境、不便替换为 Nginx 的场景。它绕开了老旧的 mod_wsgi(需编译、耦合强),也避免了手动编译 mod_uwsgi 的麻烦,直接复用 Apache 自带的代理框架,稳定性和兼容性更好。
一、确认并启用核心模块
Apache 必须加载三个基础模块才能支持 uWSGI 协议代理:
-
mod_proxy:代理功能主模块 -
mod_proxy_http:虽不直接用于 uwsgi:// 协议,但部分健康检查或调试路径可能依赖其工具函数,建议启用 -
mod_proxy_uwsgi:专为 uWSGI 协议设计的代理模块(不是可选插件,是必需组件)
在 Debian/Ubuntu 上执行:
sudo a2enmod proxy proxy_http proxy_uwsgi在 CentOS/RHEL 上检查 /etc/httpd/conf.modules.d/00-proxy.conf,确保以下三行未被注释:
立即学习“Python免费学习笔记(深入)”;
LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
启用后重启 Apache:sudo systemctl restart apache2(或 httpd)。
二、配置 uWSGI 启动服务(监听 TCP 端口)
mod_proxy_uwsgi 只支持 uwsgi 协议的 TCP socket(即 127.0.0.1:port),不支持 Unix socket(如 /tmp/uwsgi.sock)。因此 uWSGI 必须以 TCP 模式运行:
示例 uwsgi.ini:
chdir = /var/www/myapp
module = myapp.wsgi:application
master = true
processes = 4
socket = 127.0.0.1:8080
chmod-socket = 660
vacuum = true
die-on-term = true
logto = /var/log/uwsgi/myapp.log
关键点:
-
socket = 127.0.0.1:8080—— 必须是 IP:PORT 格式,推荐绑定本地回环,禁止暴露公网 - 无需
protocol = uwsgi(默认就是) - 不要启用
http = ...或http-socket = ...,否则会绕过 Apache,失去代理控制权
三、Apache 虚拟主机中配置 ProxyPass
在站点配置(如 /etc/apache2/sites-available/myapp.conf)中添加反向代理规则:
ServerName myapp.example.com
# 将所有请求转发给 uWSGI
ProxyPass / uwsgi://127.0.0.1:8080/
ProxyPassReverse / uwsgi://127.0.0.1:8080/
# 静态文件由 Apache 直接服务,不走 uWSGI
ProxyPass !
ProxyPass !
# 可选:透传原始 Host 头(对 Django ALLOWED_HOSTS 等校验有用)
ProxyPreserveHost On
注意细节:
-
uwsgi://协议前缀必须小写,不能写成UWSGI:// - ProxyPass 和
ProxyPassReverse末尾的/必须一致,否则路径重写出错 -
ProxyPass !表示排除该路径,让 Apache 自己处理静态资源,大幅提升性能
四、增强稳定性与安全性
生产环境建议补充以下配置:
-
超时控制:在
<virtualhost></virtualhost>内添加
ProxyTimeout 30
ProxyBadHeader Ignore -
错误页接管:uWSGI 崩溃时返回 503,可自定义响应
ErrorDocument 503 /503.html -
访问限制:限制仅本机可连 uWSGI(防火墙或 uWSGI 自身)
# 在 uWSGI 配置中加:
socket = 127.0.0.1:8080
socket-bind-addrs = 127.0.0.1 -
日志追踪:开启 Apache 代理日志便于排障
ProxyRequests Off
LogLevel proxy:info
不复杂但容易忽略



















