nginx 代理 nexus 私服仓库出现 502
1、背景
nginx 作为 nexus 的反向代理,maven 配置的 nexus 地址指向的是 nginx
2、问题
mvn 编译构建时候出现个别的包或 pom 文件下载返回 502 导致编译失败,在同一个 VPC 内的 mvn 客户端不会出现该问题,跨云账号通过云企业网组网访问的 mvn客户端会出现 502,10 次构建有 8-9 次出现,复现率很高,如果跳过 nginx直接访问 nexus就没问题
3、排查过程
nginx日志如下
{"method":"GET","uri":"/nexus/content/groups/lkb-public/org/codehaus/plexus/plexus-component-annotations/1.5.5/plexus-component-annotations-1.5.5.pom.sha1",
"status":"502",
"X-Forwarded-For":"-",
"response_time":"7.012",
"request_time":"7.009",
"upstream_connect_time":"-",
"upstream_header_time":"-",
"userAgent":"Apache-Maven/3.6.3 (Java 1.8.0_333; Linux 5.15.0-142-generic)","request_length":"370","bodySize":"150","authorization":"-","x-auth-token":"-","EagleEye-TraceID":"-"}
nexus 查看 TCP 连接
netstat -anptu
有 500 多个连接,其中 200 多个 CLOSE_WAITE,其余是ESTABLISHED
4、故障分析
由于 nginx之前未开启长连接,默认都是短连接,mvn下载的每一个文件都会创建一个新的 TCP 连接,多个下载不会复用同一个连接,mvn编译过程有几百个 pom jar下载就会导致有几百个 TCP 连接建立,这个数值对于 linux系统而已未达瓶颈,但是对 nexus而言已经到了它连接池的上线了,满了之后新的请求过来只在等待队列里面,不会处理请求,nginx会对于这种建立 TCP 连接后无响应的连接在过了几秒钟后判断为连接不可用或异常遂返回 502
5、解决
nginx增加如下配置参数
upstream repo{
server 1.1.1.1:8081; # 新增:长连接复用配置(解决偶发连接中断)
keepalive 32; # 保持 32 个空闲长连接
keepalive_timeout 60s; # 空闲连接超时(与 Nexus 适配)
keepalive_requests 100; # 单个长连接最大处理请求数
}
...
location / {
proxy_pass http://repo;
# 新增:启用 HTTP/1.1 长连接(核心修复偶 502)
proxy_http_version 1.1;
proxy_set_header Connection ""; # 清空 Connection 头,启用 keepalive
}
...
相关配置解释
proxy_http_version 1.1; proxy_set_header Connection ""; 为了开启长连接,可以理解为开关,但是仅仅如此还不够,只是每次连接后 TCP 不会关闭,不会让多个请求复用同一个 TCP 连接
keepalive 32; 是关键,永远有 32 空闲 TCP 长连接存在,请求进来都复用这 32个,如果单个最大处理 100 个(keepalive_requests 100;)打满后可以在 32 基础上新增连接,没有上限。如果没有请求了,也不会释放所以连接会保留 32 个,避免频繁新建 TCP,较少三次握手等开销
6、相关扩展
502 与 504 区别

TCP 中的 CLOSE_WAIT 、TIME_WAIT 存在场景
TCP 三次握手(建立连接)
TCP 四次挥手(关闭连接)
核心状态速查表

根据上述分析,time_wait属于正常情况,如果有大量短链接的话由于有释放时长(2MSL)短期内会有大量的此种状态
close_wait如果大量存在属于异常状况,说明被动关闭接收方没有进行后续的回包

浙公网安备 33010602011771号