如何在Spring Boot嵌入式Tomcat中配置mod_reqtimeout?
解决Spring Boot嵌入式Tomcat应对Slow HTTP DoS攻击的配置方案
首先得明确:mod_reqtimeout是Apache HTTP Server专属的模块,你的应用用的是Spring Boot内置的Tomcat,没法直接启用这个模块,但Tomcat有自己的对应配置来防范这类慢请求攻击,下面是具体的配置方法:
1. 通过配置文件快速配置
这是最省心的方式,直接在application.properties或application.yml里添加Tomcat相关参数:
application.properties示例:
# 连接超时:超过20秒没收到完整请求就断开 server.tomcat.connection-timeout=20000 # 最大连接数:控制Tomcat同时处理的连接上限 server.tomcat.max-connections=8192 # 等待队列大小:连接数满时,暂时排队的请求数量 server.tomcat.accept-count=100 # 异步请求超时:针对异步处理的请求设置超时 server.tomcat.async-timeout=10000
application.yml示例:
server: tomcat: connection-timeout: 20000 max-connections: 8192 accept-count: 100 async-timeout: 10000
2. 自定义Tomcat Connector实现精细控制
如果需要针对请求头、请求体做更精准的超时限制,可以写个配置类自定义Tomcat的Connector:
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.apache.catalina.connector.Connector; import org.apache.coyote.http11.Http11NioProtocol; @Configuration public class TomcatCustomConfig { @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() { return factory -> { factory.addConnectorCustomizers((Connector connector) -> { Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); // 基础连接超时 protocol.setConnectionTimeout(20000); // Socket读取超时:客户端发数据太慢就断开 protocol.setSoTimeout(15000); // 读取请求头超时:防Slowloris这类慢发请求头的攻击 protocol.setHeaderTimeout(10000); // 读取请求体超时:防Slow HTTP POST这类慢发请求体的攻击 protocol.setBodyTimeout(15000); // 最大连接数与等待队列 protocol.setMaxConnections(8192); protocol.setAcceptCount(100); }); }; } }
这些参数的作用一目了然:就是通过限制各个阶段的超时时间,避免服务器资源被未完成的慢请求长期占用,从根源上防范DoS风险。
3. 额外防护建议
- 搭配Spring Security做请求频率限制:比如限制同一IP的请求次数,进一步减少恶意请求的影响
- 前端加反向代理:如果你的应用部署在Nginx或Apache这类代理后面,可以在代理层配置超时规则(比如Nginx的
client_header_timeout、client_body_timeout,Apache的mod_reqtimeout),在流量到达应用前就拦截慢请求
补充说明:Acunetix的警告是针对Web服务器的,嵌入式Tomcat虽然没有
mod_reqtimeout,但上面的配置能达到完全等效的防护效果。
内容的提问来源于stack exchange,提问作者Rasool Ghafari
相关产品推荐
相关产品推荐

