Apache ProxyPass 默认不适用于实时流媒体,需启用mod_proxy、mod_proxy_http等模块,禁用缓冲、延长超时、配置balancer集群,并按HLS/DASH、WebSocket等协议差异化调优。

Apache 的 ProxyPass 默认不适用于长连接、低延迟的实时流媒体(如 HLS、DASH、WebRTC 信令或 RTMP over HTTP),因为其传统反向代理行为会缓冲响应、超时中断连接、不支持连接复用与流式转发。要可靠代理实时流媒体请求到后端集群,需针对性调优模块配置,并启用关键特性。
启用并配置 mod_proxy 和流媒体相关模块
确保以下模块已加载(在 httpd.conf 或 mods-enabled/ 中):
-
mod_proxy(必需) -
mod_proxy_http(用于 HTTP 流,如 HLS/DASH 的 .m3u8/.ts 请求) -
mod_proxy_balancer(用于集群负载均衡) -
mod_headers(用于透传关键头,如Cache-Control、Content-Type) -
mod_rewrite(可选,用于路径重写或协议判断)
若需代理 WebSocket 类信令(如 WebRTC 的信令通道),还需启用 mod_proxy_wstunnel。
配置无缓冲、长存活的代理规则
对流媒体路径(例如 /live/ 或 /hls/),禁用缓冲、延长超时、保持连接:
ProxyPreserveHost On ProxyRequests Off <p><location> ProxyPass "balancer://hls-cluster/" retry=5 timeout=5 ProxyPassReverse "balancer://hls-cluster/"</location></p><pre class="brush:php;toolbar:false;"># 关键:禁用响应缓冲,支持 chunked 流式传输 SetEnv proxy-nokeepalive 1 SetEnv proxy-sendbuffersize 0 Header unset Connection Header set Cache-Control "no-cache, no-store, must-revalidate"
后端集群定义(轮询 + 健康检查)
说明:
-
ping=5表示每 5 秒主动探测后端连通性,避免转发到宕机节点 -
SetEnv proxy-nokeepalive 1强制关闭 Apache 与客户端之间的 keep-alive,防止流被中间截断(尤其对老旧客户端有效) - 若后端使用 HTTP/1.1 分块传输(chunked),建议同时设置
ProxySet keepalive=On和timeout=300提升连接复用率
适配不同流协议的关键处理
不同流类型需差异化配置:
-
HLS / DASH 静态分片:重点控制缓存头和 MIME 类型,添加:
AddType application/vnd.apple.mpegurl .m3u8AddType video/mp2t .ts
并用Header set Access-Control-Allow-Origin "*"支持跨域播放 -
基于 HTTP 的实时流(如 MSE 推送的 /stream):必须启用
ProxyPass的flushpackets=on参数(Apache ≥ 2.4.37):ProxyPass "balancer://stream-cluster/" flushpackets=on -
RTMP over HTTP(如 nginx-rtmp 的 /stat)或 WebRTC 信令:若走 WebSocket,改用:
ProxyPass "/ws/" "ws://192.168.1.10:8080/ws/"
并确保后端支持 upgrade 协议协商
日志与可观测性建议
添加自定义日志字段,便于排查流中断原因:
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %{ms}T %{pid}P" streamlog
CustomLog logs/stream-access.log streamlog
重点关注:%{ms}T(请求耗时)、%O(响应字节数)、%>s(最终状态码)。持续返回 200 但字节为 0,往往表示连接被意外关闭;出现大量 502/503 则需检查后端健康或超时设置。











