Nginx反向代理时限制下载带宽,避免占满带宽的方法
解决Nginx反向代理大文件时上游带宽跑满的问题
问题根源
默认配置下,Nginx开启的proxy_buffering会将上游(云存储桶/Workers)的响应数据缓存到内存或临时文件中。即便客户端下载速度很慢,Nginx仍会全速从上游拉取完整文件,直接导致服务器带宽被占满。
解决方案
通过调整反向代理的缓冲配置,限制Nginx的上游数据缓存量,让其仅缓冲少量数据,同步匹配客户端的下载速度,避免提前拉取完整大文件。
修改后的反向代理配置
server { server_name my.domain.com; root /var/www/html/; set $bucket "123456.workers.com"; sendfile on; location / { resolver 1.1.1.1; proxy_http_version 1.1; proxy_redirect off; proxy_set_header Connection ""; proxy_set_header Authorization ''; proxy_set_header Host $bucket; proxy_ssl_server_name on; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_hide_header cf-ray; proxy_hide_header Content-Disposition; proxy_hide_header report-to; proxy_hide_header server; proxy_hide_header x-amz-id-2; proxy_hide_header x-amz-request-id; proxy_hide_header x-amz-meta-server-side-encryption; proxy_hide_header x-amz-server-side-encryption; proxy_hide_header Set-Cookie; proxy_ignore_headers Set-Cookie; proxy_intercept_errors on; add_header Cache-Control max-age=31536000; # 核心修改:调整缓冲配置,匹配客户端速度 proxy_buffering on; proxy_buffer_size 4k; # 单个请求的初始缓冲区大小 proxy_buffers 8 4k; # 每个请求的缓冲区总大小(8*4k=32k) proxy_max_temp_file_size 0; # 禁止创建临时文件缓存上游数据 proxy_pass https://$bucket; # without trailing slash } listen 80 default_server; }
配置参数说明
proxy_buffering on;:保留缓冲功能,但通过后续参数限制缓冲规模,避免无限制拉取上游数据proxy_buffer_size:调小读取上游响应头的缓冲区大小,减少不必要的内存占用proxy_buffers:限制响应体的缓冲区总容量,当缓冲区满时,Nginx会暂停从上游读取,直到客户端取走部分数据proxy_max_temp_file_size 0;:彻底禁止Nginx将超出内存缓冲的响应数据写入临时文件,从根源避免预下载完整大文件
备选方案:完全关闭缓冲
如果业务场景以大文件下载为主,可直接关闭缓冲,让Nginx实时转发上游数据,严格匹配客户端速度:
# 在location块内添加 proxy_buffering off;
注意:关闭缓冲会让Nginx同步处理请求,可能增加CPU负载,适合大文件占比高的场景,小请求较多时不推荐。
验证修改
重启Nginx服务生效:
sudo systemctl restart nginx
测试单个客户端下载大文件,观察服务器上游带宽使用情况,此时带宽应与客户端下载速度一致或接近。
内容的提问来源于stack exchange,提问作者Root
相关产品推荐
相关产品推荐

