公司内部服务器出现拉取失败问题,有一个1.2G的包,下载到1G左右85%就会中断
由于内部服务器都是通过nginx服务器进行了中转,检查了jfrog的磁盘状态都正常,问题出现在代理服务器上。
在代理服务器修改nginx的缓存配置,常规需要修改3个地方,一个是超时配置,一个缓存大小和请求大小配置,修改后重载配置,就能下载大于1G的文件了
location / { proxy_read_timeout 900; # Nginx 向后端发送请求数据的超时时间 proxy_pass_header Server; proxy_cookie_path ~*^/.* /; if ( $request_uri ~ ^/artifactory/(.*)$ ) { proxy_pass http://jfrog-artifactory-server/artifactory/$1; } proxy_pass http://jfrog-artifactory-server/artifactory/; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_buffer_size 4k; proxy_buffers 4 32k; proxy_busy_buffers_size 64k; proxy_max_temp_file_size 2048m; # 允许缓存最大2G文件 client_max_body_size 4096m; #客户端请求服务器最大允许大小 }
延展说明:
以下是 Nginx 中proxy_read_timeout、proxy_send_timeout和proxy_connect_timeout的对比与配置指南,涵盖作用、默认值及典型场景:
------
1. proxy_connect_timeout
作用:Nginx 与后端服务器建立 TCP 连接的超时时间(从发起连接到完成三次握手)。
默认值:60秒
典型场景:
• 后端服务负载过高或网络拥塞时,建立连接可能超时。
• 建议值:
• 内部网络:5-15秒(低延迟环境)
• 跨地域/高延迟网络:15-30秒
• 错误表现:Nginx 返回502 Bad Gateway(连接后端失败)。
------
2. proxy_send_timeout
作用:Nginx 向后端发送请求数据的超时时间(从发送完请求头到发送完请求体的总时间)。
默认值:60秒
典型场景:
• 客户端上传大文件(如视频、镜像)时,发送时间可能较长。
• 建议值:
• 普通请求:30-60秒
• 大文件上传:根据带宽和文件大小计算(如 1GB 文件在 10Mbps 带宽下需约15分钟,即900秒)。
• 错误表现:Nginx 关闭连接,客户端可能看到504 Gateway Timeout。
------
3. proxy_read_timeout
作用:Nginx 从后端读取响应数据的超时时间(从建立连接到接收完响应的时间)。
默认值:60秒
典型场景:
• 后端处理耗时操作(如复杂计算、数据库查询)。
• 建议值:
• API 接口:30-60秒
• 长任务接口:300秒+(需与后端服务超时策略对齐)
• 错误表现:Nginx 返回504 Gateway Timeout(后端响应超时)。
------
三者的关系与配置示例
请求处理流程:
客户端 → Nginx → (1) 建立连接 → (2) 发送请求 → (3) 接收响应 → 客户端
• (1) proxy_connect_timeout:控制步骤 1
• (2) proxy_send_timeout:控制步骤 2
• (3) proxy_read_timeout:控制步骤 3
配置示例:
【nginx】
location /upload/ {
proxy_pass http://backend_server;
proxy_connect_timeout 15s; # 15秒内完成连接建立
proxy_send_timeout 900s; # 允许15分钟发送大文件
proxy_read_timeout 120s; # 等待后端响应最长2分钟
}
------
注意事项
1. 全局协调:超时配置需与后端服务一致(如 Tomcat 的connectionTimeout、Spring 的server.servlet.context-timeout)。
2. 资源占用:过长的超时会占用 Nginx 工作进程的连接池,影响并发能力。
3. 动态调整:
• 对慢速客户端可单独设置client_body_timeout和client_header_timeout。
• WebSocket 场景需额外配置proxy_http_version 1.1和proxy_set_header Upgrade。
4. 测试验证:
• 使用curl -v或压测工具(如 JMeter)模拟超时场景。
• 监控 Nginx 的error.log,观察upstream timed out相关日志。
------
总结
【表格】
参数 阶段 默认值 典型调整场景
proxy_connect_timeout 建立连接 60s 网络高延迟、后端负载高
proxy_send_timeout 发送请求 60s 大文件上传、慢客户端
proxy_read_timeout 接收响应 60s 后端处理耗时任务
-------------------------
Nginx 代理的缓存机制
Nginx 作为代理服务器时,处理大文件下载有两种模式:
内存缓冲:默认使用内存缓存响应数据(受 proxy_buffer_size
和 proxy_buffers
限制)
磁盘缓冲:当内存不足时,启用磁盘临时文件(受 proxy_temp_path
和 proxy_max_temp_file_size
控制)
关键限制参数
proxy_max_temp_file_size
:默认值为 1G
这是最可能的故障点!当文件超过设定值时,Nginx 会中断传输。