Tomcat 企业级运维实战系列(五):Tomcat 优化和安全加固
- 一:安全优化
-
- 1)监牢模式
- [2)Tomat 版本信息隐藏](#2)Tomat 版本信息隐藏)
- 3)屏蔽服务端软件或代码版本信息
- [4)Nginx + PHP 屏蔽](#4)Nginx + PHP 屏蔽)
- 二:性能优化
-
- [1)io 模型优化](#1)io 模型优化)
- [2)Tomcat Java 线程数](#2)Tomcat Java 线程数)
- [3)DNS 与压缩](#3)DNS 与压缩)
- [4)JVM 优化](#4)JVM 优化)
- 总结
🚀 Tomcat 系列文章导航
本系列系统讲解 Linux 环境下 Apache Tomcat 的部署、配置、管理与优化,并最终带你完成 企业级前后端分离项目上线。无论你是初学者还是想进阶的运维人员,这份路线图都能帮你快速构建完整的知识体系。
⚠️ 该系列所有涉及的软件包和项目都可以私信博主免费获取
- 👉 第一部分:Tomcat 核心概念与基础部署
- 👉 第二部分:Tomcat 系统化管理与应用部署
- 👉 第三部分:Tomcat 配置解析与集群化部署
- 👉 第四部分:Tomcat 企业级监控
- 👉 第五部分:Tomcat 优化和安全加固
- 👉 第六部分:综合项目实战:Java 前后端分离架构部署
一:安全优化
条目 | 配置 | 备注 |
---|---|---|
Tomcat shutdown 端口的保护 | 改为其他的特殊端口,暗号也要修改 | |
ajp 连接端口禁用 | 已经从tomcat 8.5 开始默认就注释了 | 8009端口,用于与apache 进行连接 |
禁用管理端 | 把管理端相关配置,文件,目录清理掉 webapps 下面的 dosc examples host-manager manager | 如果开启较为危险 |
降权启动(监牢模式) | 通过普通用户运行与管理服务 | 端口大于1024,1024以内的端口特权端口,只能root使用。 对于二进制,编译安装的软件较为容易配置 |
文件列表访问控制 | 类似于 nginx autoindex,是否会默认列表站点目录的内容,默认关闭的 | |
tomcat 版本信息隐藏 | 遇到 4xx,5xx 错误的时候显示指定的页面,不包含服务器版本信息 | |
tomcat web 服务隐藏 | http 响应头里面的内容 connector 8080 部分增加头部信息 Server 信息 | |
访问限制 | 类似于 nginx,使用 allow 和 deny | 一般推荐使用 nginx 限制 |
启停脚本权限回收 | tomcat/bin 目录,脚本,700/500,从 tomcat 8.5 开始 750 | 权限最小化 |
访问日志格式规范 | tomcat server.xml 中配置访问日志的格式,参考 nginx | |
忽略响应头(一些暴漏敏感信息的头部信息) | lnmp/lnmt 环境中程序代码会在响应头中加入服务的版本信息 | proxy_hide_header |
1)监牢模式
核心思想
- 避免 root 运行 Tomcat:一旦 Tomcat 被攻击者利用漏洞入侵,就不会直接获得 root 权限。
- 限制用户权限 :给 Tomcat 单独创建一个用户(如
tomcat
),仅允许该用户运行 Tomcat,不具备其他系统操作权限。- 隔离目录:Tomcat 用户只能访问自己目录,不允许访问系统关键目录。
-
创建专用用户
-s /sbin/nologin
禁止其直接登录-M
表示不创建家目录
bashuseradd -Ms /sbin/nologin tomcat
-
修改 Tomcat 目录权限
保证 Tomcat 文件归属权属于 tomcat 用户。
bashchown -R tomcat:tomcat /opt/module/tomcat-8.5.87/
-
以指定用户启动 Tomcat
bashsu - tomcat -c "/opt/module/tomcat-8.5.87/bin/startup.sh"
或者在 systemd service 文件里指定:
bash[Service] User=tomcat Group=tomcat
-
验证进程权限
看到
tomcat
用户运行 java 进程,说明已隔离成功。bashps -ef | grep java
-
设置开机自启
-
推荐用
systemctl
管理(更安全、可控)。 -
如果系统较旧没有 systemd,可以在
/etc/rc.local
里写:bashsu - tomcat -c "/opt/module/tomcat-8.5.87/bin/startup.sh"
-
2)Tomat 版本信息隐藏
问题 :Tomcat 报错页面会显示 版本信息,容易被攻击者利用。
方案:
- 使用 Nginx 作为前端,隐藏真实 Tomcat,对外只暴露 Nginx。
- 禁止直接访问 Tomcat,通过 Nginx 反向代理访问。
- 在 Tomcat 内部也要准备好 自定义错误页面,避免泄露信息。
-
修改
server.xml
Server
属性用于定义响应头中的Server
字段,伪装成 Nginx。bash<Connector port="8080" protocol="HTTP/1.1" Server="Nginx/1.24.1" connectionTimeout="20000" redirectPort="8443" />
-
重启
Tomcat
bashsystemctl restart tomcat.service
-
验证
-I
:用 HEAD 请求 查看服务器响应头bashcurl -I 192.168.2.9:8080
bashHTTP/1.1 302 Cache-Control: private Location: https://192.168.2.104:8443/ Transfer-Encoding: chunked Date: Mon, 25 Aug 2025 08:45:54 GMT Server: Nginx/1.24.1
3)屏蔽服务端软件或代码版本信息
-
问题 :默认会暴露
Server: nginx/1.24.0
,以及后端返回的X-ZrLog
版本号。 -
解决:
-
在
/etc/nginx/conf.d/zrlog.conf
配置中使用:bashproxy_hide_header X-ZrLog;
-
隐藏返回头中的自定义信息。
-
-
验证 :重新加载 nginx 后,再次请求,
X-ZrLog
消失。
4)Nginx + PHP 屏蔽
-
问题 :默认会暴露
X-Powered-By: PHP/7.4.33
-
解决:
-
在
/etc/nginx/conf.d/blog.conf
相关配置中加入:bashfastcgi_hide_header X-Powered-By;
-
-
验证 :重新加载 nginx 后,再次请求,
X-Powered-By
消失。
二:性能优化
1)io 模型优化
BIO:阻塞,同步模型(Tomcat7 及之前默认,性能较差)
NIO (NIO1/NIO2):非阻塞,异步模型(Tomcat8 默认 NIO,推荐使用 NIO2)
APR:基于本地库,适合高并发场景
配置方法 (修改 server.xml
的 <Connector>
):
bash
# NIO2
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
Server="Nginx/1.24.1"
connectionTimeout="20000"
redirectPort="8443" />
# APR
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11AprProtocol"
Server="Nginx/1.24.1"
connectionTimeout="20000"
redirectPort="8443" />
提示 :修改后需重启 Tomcat,查看
catalina.out
确认生效。
2)Tomcat Java 线程数
maxThreads="500"
:最大线程数(推荐 200--400,需压测)
acceptCount="500"
:队列长度(一般与 maxThreads 一致)
acceptorThreadCount="2"
:请求接收线程数(= CPU 核心数 或 2 倍,默认 1)
minSpareThreads="10"
:最小空闲线程数(低负载时维持的线程数)
配置方法 (修改 server.xml
的 <Connector>
):
bash
<Connector port="8080"
protocol="HTTP/1.1"
maxThreads="500"
acceptorThreadCount="2"
minSpareThreads="10"
Server="Nginx/1.24.1"
connectionTimeout="20000"
redirectPort="8443" />
3)DNS 与压缩
Web 服务器默认可能会对客户端 IP 做反向解析,记录域名。
这样会 额外产生 DNS 查询请求 ,增加 响应延迟,对性能有影响。
开启压缩功能(推荐 Nginx 配置 gzip/brotli,更高效)
bashcompression="on" compressionMinSize="2048" compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf"
配置方法 (修改 server.xml
的 <Connector>
):
bash
<Connector port="8080"
protocol="HTTP/1.1"
enableLookups="false" # 添加该配置
Server="Nginx/1.24.1"
connectionTimeout="20000"
redirectPort="8443" />
4)JVM 优化
JVM 内存大小
-Xms
:初始内存(默认物理内存 1/64)-Xmx
:最大内存(默认物理内存 1/4)- 建议:
- 方案 1:
Xmx = 2 × Xms
- 方案 2:
Xmx = Xms
,避免频繁 GC
GC 日志
bash-Xloggc:/var/log/tomcat_gc.log
自动 Dump 功能
bash-XX:+HeapDumpOnOutOfMemoryError # 发生 OOM 自动导出内存快照 -XX:HeapDumpPath=/app/tools/tomcat/temp/oom.hprof # Dump 文件路径
配置示例(catalina.sh
)
⚠️提示:配置完之后重启 Tomcat
bash
JAVA_OPTS='-Xms1024m -Xmx1024m -Xloggc:/var/log/tomcat_gc.log \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/app/tools/tomcat/temp/oom.hprof'
总结
📌 本节重点回顾
-
安全加固
-
通过 非 root 用户运行,降低安全风险
-
隐藏 Tomcat 版本号,避免信息泄露
-
配置 安全响应头(X-Frame-Options、X-Content-Type-Options 等),防御常见攻击
-
-
性能优化
-
合理调整 线程池参数,提升高并发处理能力
-
选择合适的 I/O 模型 (NIO / NIO2)
-
配置 JVM 参数,优化堆内存与垃圾回收策略
-
-
优化思路
-
安全 → 降低攻击面,避免高危风险
-
性能 → 提升吞吐量与稳定性
-
综合 → 结合业务场景进行调优,而非盲目套用参数
-
✅ 至此,你已经具备了 Tomcat 安全与性能优化的基础思路,能让服务运行更稳健、更高效。
下一篇将进入 前后端分离架构部署,把 Tomcat 应用放入真实生产环境中实践。