Apache大文件传输稳定性取决于ProxyPass配套配置:须禁用EnableSendfile和EnableMMAP,启用flushpackets=on流式转发,同步调高ProxyTimeout与ProxyReceiveBufferSize,并确保Range请求透传。

ProxyPass 本身不处理大文件传输,它只负责转发请求和响应流。真正影响大文件上传/下载稳定性的,是围绕 ProxyPass 的一整套配套配置——包括缓冲策略、超时设置、头透传控制,以及是否启用 sendfile 等底层行为。
必须显式关闭 sendfile 和 mmap
Apache 在 Linux 上默认启用 EnableSendfile on,这在大文件(尤其几百 MB 以上)传输时容易引发中断或内容损坏,特别是在 NFS、容器挂载或虚拟化环境中。
直接在虚拟主机或全局配置中加上:
-
EnableSendfile off -
EnableMMAP off
重启 Apache 生效。这个调整不降低性能,反而提升稳定性。
让请求体“流式透传”,避免内存积压
ProxyPass 默认会缓存整个请求体再转发,对大文件上传极易超内存或超时。需强制分包转发:
- 在
ProxyPass指令后添加参数:flushpackets=on flushwait=1000
示例:ProxyPass /upload http://backend:8000/upload flushpackets=on flushwait=1000 - 或在
<proxy></proxy>块中设proxyset buffer=0,彻底禁用缓冲
同步调高全链路超时与接收缓冲
中断常因某一层先断开连接,所有环节必须协同延长时间:
-
ProxyTimeout 1800(30 分钟) -
ProxyReceiveBufferSize 2097152(2MB,适应大块数据) - 同时确保后端服务、防火墙、客户端也设对应超时,形成递进覆盖
确保 Range 请求能穿透代理(针对下载)
若用 ProxyPass 代理后端服务提供大文件下载,必须保证:
- 后端本身支持
Range头(如 Node.js 需启用http-range,Tomcat 需配置sendfile相关开关) - Apache 不丢弃
Range请求头:确认没用RequestHeader unset Range类规则 - 客户端发
Range: bytes=0-1023时,后端返回206 Partial Content而非200;否则问题出在后端或中间 CDN
限速与截断需借助其他模块配合
mod_proxy 本身不支持动态限速或按大小截断,但可结合:
-
mod_ratelimit实现响应级固定速率限速(需后端返回Content-Length或chunked) -
LimitRequestBody控制上传总大小(单位字节),防恶意大包占用资源 - 实际截断逻辑应由后端实现(如收到
Content-Length后判断并提前终止),Apache 只做可靠透传
不复杂但容易忽略


















