AWS EKS下带OWASP规则ModSecurity的Nginx Ingress首次请求高延迟问题
排查思路
- 优先验证IP信誉拦截功能影响:临时将crs-setup.conf中
tx.do_reput_block参数值改为0,重启Ingress Controller Pod后测试首次请求延迟是否恢复正常,该功能默认会在新IP首次请求时查询远端IP信誉库,无本地缓存时会产生极高额外延迟。 - 检查Pod资源使用情况:通过Kubernetes metrics或监控平台查看Nginx Ingress Controller Pod的CPU、内存使用率,确认是否存在CPU限流(throttle)现象,当前配置的100m CPU上限远低于ModSecurity+OWASP规则集的最低运行要求,极易触发限流导致请求排队。
- 拆分请求耗时阶段:使用curl命令打印各阶段耗时,定位延迟发生在TCP/TLS握手阶段还是后端业务/ModSecurity处理阶段:
curl -w "TCP握手耗时:%{time_connect}\nTLS握手耗时:%{time_appconnect}\n服务端处理耗时:%{time_starttransfer}\n总请求耗时:%{time_total}\n" -o /dev/null -s https://你的业务域名 - 核查ModSecurity运行日志:查看ModSecurity debug日志的时间戳,确认首次请求的高耗时具体发生在哪个规则执行阶段,重点关注IP信誉查询、规则上报相关的日志条目。
- 验证NLB与连接复用配置:检查NLB目标组的会话保持配置,同时确认Nginx是否开启了上游服务连接复用、TLS会话复用能力,避免每次新IP请求都需要重新建立全链路连接。
解决方案
- 关闭非必要的IP信誉拦截功能:如果业务不需要基于公共IP信誉库的拦截能力,直接将crs-setup.conf中的
setvar:tx.do_reput_block=1修改为setvar:tx.do_reput_block=0,可直接解决该场景下的首次请求高延迟问题。如果确实需要使用IP信誉能力,需配置本地IP信誉库缓存,避免每次请求都查询远端接口。 - 调高Ingress Controller资源配额:将nginx-values.yaml中controller.resources的CPU limit至少调整为1000m,内存调整为1Gi,根据业务压测结果继续上调,避免因资源不足导致的请求排队延迟。
- 降低ModSecurity日志开销:生产环境无需开启调试日志,将waf.conf中的
SecDebugLogLevel从3调整为0,关闭不必要的日志写入,减少磁盘IO开销。 - 关闭ModSecurity状态上报功能:waf.conf中的
SecStatusEngine On会向ModSecurity官方上报运行统计数据,会产生额外的外网请求开销,无需使用的话改为SecStatusEngine Off即可。 - 开启连接与会话复用能力:在nginx-values.yaml的controller.config下新增以下配置,减少建连开销:
ssl-session-cache: "shared:SSL:10m" ssl-session-timeout: "10m" ssl-session-tickets: "on" keep-alive: "75" keep-alive-requests: "100" upstream-keepalive-connections: "128" upstream-keepalive-timeout: "60" upstream-keepalive-requests: "100" - 延长本地缓存有效期:如果保留IP信誉功能,可将crs-setup.conf中的
SecCollectionTimeout参数从600适当调大,延长IP相关数据的本地缓存时间,减少重复查询频率。
内容的提问来源于stack exchange,提问作者Rubenoh
相关产品推荐
相关产品推荐

