生产中间件常见问题

1. 动态修改 Tomcat maxThreads 后,为什么线程数还是上不去?

常见原因:
  1. Tomcat 线程池已经扩容,但压测不够大,没触发到上限
  2. 压测工具连接数 / 并发数不够
  3. 接口内部有锁、慢 SQL、外部调用阻塞,线程没真正并发跑
  4. 你改的不是当前在用的 Connector(比如改到 AJP 或 HTTPS 连接器)
  5. maxConnections 太小,限制了连接数
快速排查:
  • /actuator/tomcatthreads.max 是否真的改成功
  • maxConnections 是否足够(NIO 一般设 10000+)
  • 压测时用 jstack | grep http-nio-8080-exec- | wc -l 看真实线程数

2. Nginx reload 会不会断连接、影响业务?

答案:不会断已有连接,只会对新连接生效。
  • nginx -s reload热重载
  • 老 worker 处理完当前连接才退出
  • 新连接用新配置
  • 业务无感,生产可随便用(只要配置语法正确)
安全做法:
bash
运行
nginx -t   # 先检查语法
nginx -s reload

3. 动态 Valve / Filter 加了,为什么不生效?

最常见 3 个坑:
  1. Valve 加错位置
    • 加到 EngineHostContext 效果不一样
    • 建议加到 Context 最稳
  2. 顺序问题
    • 后面的 Valve/Filter 把请求放行了
    • 把自定义 Valve 设为最前面
  3. 规则没加进内存
    • 用了非线程安全集合(ArrayList、HashMap)
    • 必须用 ConcurrentHashMapConcurrentHashMap.newKeySet()

4. 动态封禁 IP,为什么 Nginx 里拿到的是 127.0.0.1?

原因:

你走了代理(Nginx → Tomcat),Tomcat 拿到的是 Nginx 本机 IP。

解决:

Nginx 传真实 IP:

nginx
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Tomcat 里用 X-Real-IP 而不是 remote_addr

5. Spring 拦截器和 Tomcat Valve 谁先执行?

执行顺序(从外到内):
  1. Nginx
  2. Tomcat Connector
  3. Tomcat Valve
  4. Servlet Filter
  5. Spring Interceptor
  6. Controller
所以:

Valve 先于拦截器,能拦截静态资源、错误页面,拦截器做不到。


6. 动态规则存在内存里,重启就丢,怎么持久化?

3 种生产方案:
  1. 配置中心(Nacos/Apollo)

    监听配置变更 → 更新内存规则

  2. Redis

    定时拉取 / 直接查 Redis(注意性能)

  3. 数据库 + 本地缓存

    启动加载,变更刷新

最简单稳定:配置中心 + 内存缓存。

7. 动态过滤规则高并发下会不会有线程安全问题?

会!
  • 不能用 HashMapHashSetArrayList
  • 必须用:
    • ConcurrentHashMap
    • ConcurrentHashMap.newKeySet()
    • AtomicBoolean
只要规则存储是线程安全的,高并发没问题

8. 为什么动态修改 Valve/Filter 不能热插拔?

因为:
  • Tomcat 的 Pipeline 一旦启动不支持动态删除
  • Spring 的拦截器 / Filter 注册后也不能动态卸载
真正的 “热插拔” 方案:

写一个总阀门 / 总过滤器,规则存在内存里,

通过开关 enable=true/false 来开启 / 关闭。


9. Nginx 动态封禁大量 IP(几万),map 块会不会性能下降?

不会明显下降,但不推荐。
  • map 是哈希表,查询极快
  • 但几万条写在配置里 难看、难维护、reload 慢
真正生产方案:
  • OpenResty + Lua + Redis(海量 IP 无压力)
  • Nginx + geo 模块(专门为大量 IP 设计)

10. 动态调整规则后,怎么确认真的生效?

通用验证三板斧:
  1. 读配置接口

    把当前规则直接返回前端

  2. 打日志

    拦截时输出 IP、路径、规则来源

  3. 压测 /curl 测试

    用被封禁 IP 访问,看是否返回 403

上一篇 RH2288V5风扇调速
下一篇 批量配置VLAN:如何快速部署多个VLAN到多台交换机