mod_proxy本身不提供鉴权与流控能力,必须配合mod_lua+jwt校验实现统一鉴权、mod_lua+redis实现rpm限流,并启用sslproxyverify确保https后端通信安全。

mod_proxy 本身不处理鉴权与流控 —— 它只做请求转发。要对后端 RESTful 接口实现统一鉴权和流控,必须在 proxy 层叠加其他模块或外部组件,不能仅靠 ProxyPass 配置完成。
统一鉴权:用 mod_lua + JWT 或签名校验拦截请求
Apache 原生不支持 OAuth2 或 JWT 解析,但可通过 mod_lua 编写轻量校验逻辑,在请求到达后端前完成身份核验:
- 在
LocationMatch或ProxyPass前插入 Lua 脚本,提取 Authorization Header 中的 Bearer Token - 验证签名(如 HS256)、过期时间、issuer 和 audience;私钥/公钥可从文件或环境变量加载
- 校验失败时直接返回
401 Unauthorized或403 Forbidden,不转发到后端 - 若需对接外部认证服务(如 Keycloak),Lua 可调用 HTTP Client 同步校验,但注意超时与连接复用
流控:必须依赖外部状态存储,Redis 是 Apache 下最可行选择
mod_ratelimit 无效于 RESTful 接口——它只限响应带宽(bytes/sec),无法按请求数(RPM/TPS)控制,且不拒绝超限请求。
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
- 使用 mod_lua 连接 Redis,设计计数 key 如
rate:ip:{remote_ip}:path:{uri_path}:min:{floor(time/60)} - 每次请求执行 INCR + EXPIRE(窗口对齐),超阈值则返回
429 Too Many Requests - 注意 MPM 模型:prefork 下全局 Lua 变量不共享,必须用 Redis 存储状态;event/mpm_worker 可配合连接池复用 redis 实例
- 避免在 handle 函数内反复 new redis 连接,应复用全局连接对象或使用连接池封装
HTTPS 后端通信中强制证书校验,防止中间人窃取鉴权凭据
当 proxy 到 HTTPS 后端(如 https://api.internal/)时,若跳过证书验证,攻击者可在内网伪造服务端,截获 token 或签名密钥。
- 启用
SSLProxyVerify require,并设置SSLProxyCheckPeerName on - 通过
SSLProxyCACertificateFile显式加载后端服务所用 CA 根证书(非系统默认信任库) - 确保后端证书 SAN 字段包含 ProxyPass 中写的域名,CN 不再被现代 TLS 栈认可
- 时间偏差超过 5 分钟会导致
SSLProxyCheckPeerExpire on拒绝连接,需同步服务器时间
关键配置顺序与模块依赖不可颠倒
鉴权和流控逻辑必须在 proxy 转发之前生效,否则所有控制都失去意义。
- 确认已启用:
mod_proxy、mod_proxy_http、mod_lua、mod_ssl(如走 HTTPS 后端) - Lua 脚本需放在
ProxyPass指令之前,推荐用<locationmatch></locationmatch>包裹 -
ProxyPreserveHost On应开启,确保后端能正确识别原始 Host,便于多租户路由或日志追踪 - 禁用
ProxyRequests On,防止 Apache 变成开放代理,引发安全审计风险










