7.4 线上性能排查与安全加固


文档摘要

7.4 线上性能排查与安全加固 本节摘要:保养站的收尾双课。性能排查三件工具:访问日志筛慢请求、线程转储看线程在等什么、垃圾回收日志判断内存病;内存泄漏三步定位法。安全加固十项清单:从关闭端口、锁定 manager、清理默认应用到标题伪造、目录列表等,每项都给出动作与理由。学完本章,你的服务既跑得稳,也守得住。 前面三节覆盖了调优、观测与启动部署故障,本节处理剩下两类最难也最要紧的问题:线上"莫名的慢",以及把整套服务从"默认配置"升到"可对外"的安全水位。这也是全册管道漫游的最后一站——回程路上把行囊装满。 慢请求三件工具 线上变慢,先别猜,拿数据。三件工具按顺序上。 第一件,访问日志筛慢请求。7.2 给格式加了耗时列之后,一条命令捞出最慢的一批。

7.4 线上性能排查与安全加固

本节摘要:保养站的收尾双课。性能排查三件工具:访问日志筛慢请求、线程转储看线程在等什么、垃圾回收日志判断内存病;内存泄漏三步定位法。安全加固十项清单:从关闭端口、锁定 manager、清理默认应用到标题伪造、目录列表等,每项都给出动作与理由。学完本章,你的服务既跑得稳,也守得住。

前面三节覆盖了调优、观测与启动部署故障,本节处理剩下两类最难也最要紧的问题:线上"莫名的慢",以及把整套服务从"默认配置"升到"可对外"的安全水位。这也是全册管道漫游的最后一站——回程路上把行囊装满。

慢请求三件工具

线上变慢,先别猜,拿数据。三件工具按顺序上。

第一件,访问日志筛慢请求。7.2 给格式加了耗时列之后,一条命令捞出最慢的一批。

# 按耗时列排序 取最慢的十条 awk '{print $NF, $0}' logs/access.2026-08-21.log | sort -rn | head -n 10
4820 GET /order/detail 3910 GET /order/detail 3760 POST /order/export

慢请求集中在订单详情与导出——范围立刻从"全站慢"缩到两个路径,后续排查只围绕它们展开。这一步的价值是把模糊感受变成精确清单。

第二件,线程转储看线程在等什么。趁慢的时候连抓三次转储(间隔五秒),统计忙线程的栈顶分布。

# 抓三次转储 统计 exec 线程的栈顶聚类 for i in 1 2 3; do jstack $(ps -ef | grep catalina | grep -v grep | awk '{print $2}') > /tmp/dump$i.txt sleep 5 done grep -A 3 'catalina-exec' /tmp/dump1.txt | grep 'at ' | awk -F'at ' '{print $2}' | cut -d'(' -f1 | sort | uniq -c | sort -rn | head -n 5
143 demo.OrderDao.queryByNo 31 org.postgresql.jdbc.PgResultSet.next 9 demo.ReportExporter.buildExcel

一百四十多个线程的栈顶停在同一个数据库查询方法——病灶找到了,又是下游(呼应 7.1 的"调优先调下游")。三次转储若都停在同一处,基本坐实;若每次不同且都在容器代码里跳动,则偏向高负载的正常调度,要回到容量层考虑扩容。

第三件,垃圾回收日志判断内存病。看两个形态:停顿越来越长、老年代锯齿抬高不落。前者调回收策略(7.1 讲过),后者怀疑泄漏。泄漏三步定位:开启堆转储参数让内存将满时自动落盘;用分析工具打开转储,按对象数量与占用排序找异常大的集合或类加载器;顺着引用链回溯到持有者——常见真凶是 5.3 没清理的监听器、被静态集合缓存的会话对象、以及自定义阀门里的无限累积 Map。修法对号入座,泄漏类问题的答案几乎都在"谁持有引用没放"。

安全加固十项清单

性能是让用户满意,安全是让对手出局。默认配置是给开发用的,上生产前过一遍这十项。

图 7-4:安全加固清单——十项各挡一类风险

图 7-4:安全加固清单——十项各挡一类风险

挑四项展开动作。关闭端口:server.xml 里 Server 的 shutdown 属性换成随机长串,同时防火墙封掉 8005 的外部访问——默认口令等于把总闸按钮装在门外。管理端:manager 与 host-manager 若不需要就地删除,需要则配强口令并挂上 1.2 讲过的地址限制阀门只放行运维网段。默认应用:docs、examples 这类示例应用在发布镜像里全部剔除,它们除了暴露版本信息没有生产价值。错误细节:给应用配统一错误页(4.3 的 error-page),容器层的异常栈不进浏览器——栈里的类名与路径是给对手的踩点地图。

<!-- 关闭口令与隐藏版本 两处小改 两份保险 --> <Server port="8005" shutdown="随机长串替换我"/> <Connector port="8080" protocol="HTTP/1.1" server="首页"/>

第三行的 server 属性把响应里的服务器标识改写为自定义文字——既藏版本又不撒谎。配合全局 web.xml 里默认 Servlet 的 listings 参数设为 false,目录不再裸奔。这两行改动成本三十秒,挡掉的是扫描器的前两轮试探。

收束:把管道走成自己的

全册到此闭环。回望这条管道:一个请求进城(Connector)、穿迷宫(四层容器)、过关卡(Valve 与 Realm 与 Filter)、到终点(Servlet 生态)、再回程(响应与日志),而保养站(调优监控排障安全)让整条管道持续可运营。最后三条带走:参数有住址,见到任何配置先问它在管道哪一站;故障有归因,被拒查闸门、变慢查线程与下游、起不来查日志末尾;安全有清单,十项打勾再对外。这三条思维习惯,比任何具体参数都长寿——版本会换,管道的形状不会。

常见问题:加固相关的两个高频问答

**关闭端口 8005 到底防什么?**它防的是"一行字符串关停整台服务":任何能连到 8005 的进程,发送默认口令即可让 Tomcat 优雅关闭——在内网渗透里这常被当作横向移动的跳板。改掉默认口令加封网段,两道保险成本各三十秒。

**证书过期监控算安全项还是运维项?**都算。证书过期瞬间全站握手失败,表现像被打了拒绝服务——监控里加一条到期提醒(提前三十天告警),比任何事后的应急处置都便宜。把它挂进 7.2 的资源象限看板,安全与运维一个面板两全。

本节要点回顾

  • 慢请求三件工具:访问日志筛清单、线程转储聚类栈顶、垃圾回收日志看形态,按序上、拿数据说话。
  • 泄漏三步定位:堆转储、按占用排序、顺引用链找持有者,真凶多在没清理的监听器与静态集合。
  • 加固十项:端口口令、管理端、默认应用、版本标题、目录列表、TLS、符号链接、错误细节、账号散列、补丁节奏。
  • 对手视角验证:外网扫描与路径试探,每季度复检。
  • 三条长寿思维:参数有住址、故障有归因、安全有清单。

全册终。愿你手上的每一条管道,都既跑得快,也守得住。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U