Windows Server 2019 IIS服务器与HAProxy间间歇性504网关错误排查求助
看到你遇到的这个间歇性504问题确实头疼——之前稳定运行的HAProxy+Windows 2019 IIS架构突然掉链子,而且只有重启网卡才能临时救场,还找不到明确的时间规律,IIS日志也没给线索,换谁都得挠头。结合我处理这类问题的经验,给你整理几个可以一步步尝试的排查方向:
先从TCP连接状态与端口资源查起:重启网卡能解决问题,大概率和异常堆积的TCP连接有关。你可以在IIS服务器上打开命令提示符,执行
netstat -ano | findstr TIME_WAIT和netstat -ano | findstr CLOSE_WAIT,看看是不是有大量处于等待状态的连接。Windows默认的TcpTimedWaitDelay是240秒,如果业务短连接密集,很容易耗尽可用端口,导致HAProxy无法建立新连接而返回504。可以尝试调整注册表参数(记得先备份注册表):- 定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - 新增DWORD值
TcpTimedWaitDelay,设置为30-60之间的数值(缩短连接等待回收时间) - 新增DWORD值
MaxUserPort,设置为65534(扩大可用端口范围)
重启服务器后观察问题是否缓解。
- 定位到
检查HAProxy的后端超时与日志配置:看看HAProxy配置文件中,后端服务器的
server条目是否设置了合理的timeout server参数,如果超时时间过短,刚好碰到IIS临时处理缓慢或网络波动,就会触发504。另外可以临时调高HAProxy的日志级别到debug,这样出现504时能抓到更详细的错误细节——比如是连接超时、服务器无响应,还是TCP握手失败,这能帮你快速缩小排查范围。启用IIS的失败请求跟踪规则:虽然IIS事件日志没报错,但隐性的请求处理问题可能没被记录。你可以针对站点开启失败请求跟踪,指定跟踪504状态码,一旦问题触发,就能抓到从请求进入IIS到返回错误的全流程细节,比如请求是不是在IIS内部卡住,或者应用池是否有隐性的资源耗尽(比如CPU、内存、数据库连接池满了)。同时建议监控服务器的实时资源使用,出现504时立刻查看CPU、内存、磁盘IO是否有异常飙升。
排查网卡的高级功能兼容性:有些网卡的硬件加速功能(比如TCP Checksum Offload、Large Send Offload)可能和HAProxy的TCP栈存在兼容性问题,导致间歇性连接异常。你可以在网卡属性的“配置-高级”选项中,临时禁用这些Offload相关的功能,然后观察一段时间,看504是否还会出现。另外也可以尝试更新网卡驱动到官方最新版本,老驱动的bug也可能引发这类问题。
排除安全软件/防火墙的干扰:问题从1/18开始出现,你可以回忆一下那天前后服务器或HAProxy端有没有安装新的安全软件、Windows更新,或者修改过防火墙规则?有些安全软件会对TCP连接做扫描或拦截,间歇性触发就会导致504。可以临时禁用服务器上的防火墙和安全软件,测试一段时间,排除这个因素。
测试双向连接稳定性:在IIS服务器上用
ping -t持续ping HAProxy的IP,同时用pathping检测网络路径是否有丢包或延迟波动。另外可以用curl或其他工具在HAProxy服务器上持续向IIS发送请求,模拟业务负载,看能不能主动复现504,定位问题是单向还是双向的。
备注:内容来源于stack exchange,提问作者steelrat405

