关闭 proxy_buffering 是解决反向代理下载超大视频时 Worker 崩溃最直接有效的方法,可使 Nginx 边收边发、内存恒定在 KB 级;若必须开启缓冲,则需协同优化临时文件路径、大小限制、系统资源及后端流式响应支持。

反向代理下载超大视频文件时 Worker 崩溃,核心不是“内存溢出”本身,而是 Nginx 在代理过程中因缓冲策略不当、临时文件管理失控或系统资源限制未同步调整,导致 worker 进程被内核 OOM killer 杀掉,或主动因 fd/缓冲不足退出。解决需从缓冲机制、磁盘落盘、系统限制、后端配合四方面协同优化。
关掉 proxy_buffering(最直接有效的选择)
视频文件本质是流式内容,不需要 Nginx 缓存整段响应再发给客户端——这正是内存和磁盘压力的根源。关闭缓冲后,Nginx 只做透传,边收边发,内存占用恒定在 KB 级:
- 在对应
location块中明确设置:proxy_buffering off; - 一旦关闭,
proxy_buffers、proxy_busy_buffers_size、proxy_max_temp_file_size等参数全部失效,无需调大 - 必须确保后端支持 HTTP 流式响应(如返回
Transfer-Encoding: chunked或带正确Content-Length),否则可能卡住
若必须开启缓冲(如需重试、头改写、安全过滤),则严格控制落盘与大小
开启缓冲时,大视频极易填满内存缓冲区,触发写入临时文件;若磁盘空间不足、I/O 慢或 proxy_max_temp_file_size 过小,就会报错或崩溃:
- 设足够大的磁盘缓存上限:
proxy_max_temp_file_size 4096m;(4GB,根据最大单文件预估) - 指定稳定且空间充足的临时路径:
proxy_temp_path /data/nginx/proxy_temp 1 2;(确保/data分区有空闲空间且非 tmpfs) - 避免用默认
/tmp:它常为内存盘(tmpfs),写大文件会直接耗尽内存 - 配套调大缓冲区但不盲目:
proxy_buffers 16 64k;(共 1MB 内存缓冲),proxy_buffer_size 64k;(应对可能的大响应头)
同步加固系统与 worker 层级限制
即使 Nginx 配置合理,若系统级文件句柄或内存限制太低,worker 在高并发下载时仍会因打开太多连接或临时文件而崩溃:
- 检查并提升 systemd 服务限制:
LimitNOFILE=1048576写入/etc/systemd/system/nginx.service.d/override.conf,然后systemctl daemon-reload && systemctl restart nginx - 验证生效:找一个 worker 进程 PID,执行
cat /proc/PID/limits | grep "Max open files",确认显示为 1048576 - 调高内核连接队列:
net.core.somaxconn = 65535和net.ipv4.tcp_max_syn_backlog = 65535,防止连接堆积压垮 worker - Nginx 主配置中设
worker_rlimit_nofile 1048576;,与 systemd 保持一致
后端与传输链路协同优化
单靠 Nginx 调优不够,后端和网络层也要适配流式场景:
- 后端响应必须带
Content-Length或使用chunked编码,禁用压缩(gzip off;在该 location 中),避免 Nginx 需二次处理 - 增加超时容忍:
proxy_read_timeout 3600;(防后端读取慢视频文件超时)、proxy_send_timeout 3600;(防客户端下载卡顿断连) - 确认客户端请求头未触发 Nginx 强制缓冲(如含
Range请求时,Nginx 默认仍缓冲,可加proxy_ignore_client_abort off;并确保后端支持断点续传) - HTTPS 场景下,TLS 握手和加密开销更大,建议复用连接:
proxy_http_version 1.1;+proxy_set_header Connection '';

















