从Nexus下载大文件时连接被主机软件中止问题求助
解决Windows Server 2008 R2实例上Java进程从Nexus下载大文件中断的问题
从你的描述和Nexus日志来看,核心问题是Windows主机主动中止了Socket连接,结合大文件下载场景,大概率是系统TCP/IP栈限制、Java进程网络配置不足,或者AWS实例的网络特性导致的。下面给你几个针对性的解决方案,按优先级排序:
1. 先用命令行工具验证下载是否正常(快速排查)
首先排除Java进程本身的问题,用支持断点续传的命令行工具测试下载:
- 用
wget(若未安装可先部署):wget -c http://your-nexus-url/path/to/2.6GB-artifact.zip - 或者用PowerShell的
Invoke-WebRequest:Invoke-WebRequest -Uri "http://your-nexus-url/path/to/2.6GB-artifact.zip" -OutFile "local-artifact.zip" -Resume
如果命令行能完整下载,那问题肯定出在Java进程的配置上;如果还是中断,就聚焦到系统或AWS网络层面。
2. 调整Java进程的网络配置(针对Java端问题)
Java默认的网络超时和缓冲区设置可能不足以支撑大文件长时间下载,给你的Java进程添加以下JVM参数:
-Dsun.net.client.defaultReadTimeout=3600000 # 设置读超时为1小时(单位:毫秒) -Dsun.net.client.defaultConnectTimeout=300000 # 设置连接超时为5分钟 -Djava.net.preferIPv4Stack=true # 强制使用IPv4,避免IPv6兼容性问题 -Dsun.net.inetaddr.ttl=300 # 缩短DNS缓存时间,避免解析异常
如果你的Java代码是自定义下载逻辑,一定要实现断点续传:
- 用
HttpURLConnection时,先检查本地已下载文件大小,再设置请求头:long downloadedSize = new File("local-artifact.zip").length(); connection.setRequestProperty("Range", "bytes=" + downloadedSize + "-");
这样即使连接中断,下次可以从断点继续下载,不会丢失已下载内容。
3. 修正Windows Server 2008 R2的TCP/IP栈设置(针对系统层面)
你之前修改注册表无效,可能是没改对项或者未重启生效。请按以下步骤操作:
- 打开注册表编辑器(
regedit),定位到HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters:- 添加/修改
TcpTimedWaitDelay(DWORD),设为十进制30(缩短TIME_WAIT端口占用时间) - 添加/修改
MaxUserPort(DWORD),设为十进制65534(增加可用端口数量) - 添加/修改
TcpMaxDataRetransmissions(DWORD),设为十进制10(增加TCP重传次数,避免轻易中止连接)
- 添加/修改
- 定位到
HKLM\SYSTEM\CurrentControlSet\Services\AFD\Parameters:- 添加/修改
DefaultReceiveWindow(DWORD),设为十进制131072(增大接收缓冲区,适配大文件传输) - 添加/修改
DefaultSendWindow(DWORD),设为十进制131072(增大发送缓冲区)
- 添加/修改
- 修改完成后重启服务器,确保设置生效。
4. 检查AWS实例的网络限制(针对云环境)
t2.large是突发性能实例,长时间大流量下载可能触发带宽降速,进而导致连接超时:
- 临时切换到固定带宽的实例类型(比如m5.large)测试,看是否还会中断;
- 查看CloudWatch监控指标:检查
NetworkIn/NetworkOut的带宽变化,以及PacketLoss是否有异常; - 检查安全组的TCP空闲超时:AWS安全组默认TCP空闲超时是360秒(6分钟),如果下载过程中出现短暂停顿,可能被判定为空闲而断开。可以在Java代码中添加心跳包(比如每隔5分钟发送一个空请求头),或者联系AWS支持调整安全组超时;
- 确认VPC的DNS解析正常:避免下载过程中Nexus域名解析到不同IP导致连接中断。
5. 调整Nexus服务器的配置(如果有权限)
如果能访问Nexus的配置,调整Jetty服务器的连接超时:
- 打开Nexus安装目录下的
etc/jetty/jetty.xml,找到idleTimeout配置,把默认的300000(5分钟)改成3600000(1小时):<Set name="idleTimeout">3600000</Set> - 确保Nexus启用了断点续传支持:检查Nexus返回的响应头是否包含
Accept-Ranges: bytes,如果没有,在Nexus配置中开启相关选项。
先从命令行测试开始,一步步排查,应该能找到问题所在。
内容的提问来源于stack exchange,提问作者Saatviga Sudhahar
相关产品推荐
相关产品推荐

