HTTPS环境下JBoss/Wildfly服务响应超1分钟报500错误,调超时无效求助
检查负载均衡器的超时设置
用了round robin负载均衡器,HTTP下正常但HTTPS下超时,大概率是负载均衡器对HTTPS请求的超时阈值设成了1分钟。要把负载均衡器的连接超时和请求超时都调整到120秒以上,和服务器端配置匹配。很多负载均衡器默认HTTPS超时比HTTP短,或者单独配置了HTTPS的超时规则。验证Undertow的完整超时配置
除了https-listener的timeout,还要检查Undertow subsystem的server配置里的worker参数,确保worker的io-threads和task-core-threads足够,避免线程池耗尽导致请求被中断。
还要配置Undertow的request-timeout在server级别,而不只是listener级别:<subsystem xmlns="urn:jboss:domain:undertow:12.0"> <server name="default-server" request-timeout="120000"> <http-listener name="default" socket-binding="http" redirect-socket="https" request-timeout="120000"/> <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" request-timeout="120000"/> <host name="default-host" alias="localhost"> <location name="/" handler="welcome-content"/> <filter-ref name="server-header"/> <filter-ref name="x-powered-by-header"/> </host> </server> <worker name="default" io-threads="8" task-core-threads="20" task-max-threads="80" task-keepalive="60000"/> </subsystem>另外,别漏了
read-timeout和write-timeout的设置,这两个也可能影响长请求:<https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" request-timeout="120000" read-timeout="120000" write-timeout="120000"/>排查SSL握手后的连接保持设置
SSL连接的keep-alive配置可能和HTTP不同,在standalone.xml的socket-binding-group里,确保https的socket binding没有额外的超时限制:<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> <socket-binding name="https" port="${jboss.https.port:8443}" /> <!-- 检查是否有单独的超时配置,有的话调整 --> </socket-binding-group>同时,确保服务器端发送的
Connection: keep-alive头部在HTTPS请求中正常返回,避免浏览器/Postman提前关闭连接。启用Undertow的调试日志
开启Undertow的DEBUG日志,查看请求在SSL通道中的处理流程,确认是在哪个环节被中断:<subsystem xmlns="urn:jboss:domain:logging:8.0"> <logger category="io.undertow"> <level name="DEBUG"/> </logger> <logger category="org.jboss.as.undertow"> <level name="DEBUG"/> </logger> </subsystem>从日志里可以看到请求何时被接收、何时处理完成、何时发送响应,对比HTTP和HTTPS的日志差异,定位超时触发点。
测试绕过负载均衡器的HTTPS请求
直接访问服务器的HTTPS端口(不经过负载均衡器),执行相同的长请求,看是否还会出现500错误。如果直接访问正常,说明问题肯定出在负载均衡器的HTTPS超时配置上;如果仍然报错,再回到服务器端的Undertow和SSL配置排查。
内容的提问来源于stack exchange,提问作者Ramesh

