Tomcat 企业级运维实战系列(五):Tomcat 优化和安全加固

Tomcat 企业级运维实战系列(五):Tomcat 优化和安全加固


🚀 Tomcat 系列文章导航

本系列系统讲解 Linux 环境下 Apache Tomcat 的部署、配置、管理与优化,并最终带你完成 企业级前后端分离项目上线。无论你是初学者还是想进阶的运维人员,这份路线图都能帮你快速构建完整的知识体系。
⚠️ 该系列所有涉及的软件包和项目都可以私信博主免费获取


一:安全优化

条目 配置 备注
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 用户只能访问自己目录,不允许访问系统关键目录。
  1. 创建专用用户

    • -s /sbin/nologin 禁止其直接登录
    • -M 表示不创建家目录
    bash 复制代码
    useradd -Ms /sbin/nologin tomcat
  2. 修改 Tomcat 目录权限

    保证 Tomcat 文件归属权属于 tomcat 用户。

    bash 复制代码
    chown -R tomcat:tomcat /opt/module/tomcat-8.5.87/
  3. 以指定用户启动 Tomcat

    bash 复制代码
    su - tomcat -c "/opt/module/tomcat-8.5.87/bin/startup.sh"

    或者在 systemd service 文件里指定:

    bash 复制代码
    [Service]
    User=tomcat
    Group=tomcat
  4. 验证进程权限

    看到 tomcat 用户运行 java 进程,说明已隔离成功。

    bash 复制代码
    ps -ef | grep java
  5. 设置开机自启

    • 推荐用 systemctl 管理(更安全、可控)。

    • 如果系统较旧没有 systemd,可以在 /etc/rc.local 里写:

      bash 复制代码
      su - tomcat -c "/opt/module/tomcat-8.5.87/bin/startup.sh"

2)Tomat 版本信息隐藏

问题 :Tomcat 报错页面会显示 版本信息,容易被攻击者利用。

方案

  • 使用 Nginx 作为前端,隐藏真实 Tomcat,对外只暴露 Nginx。
  • 禁止直接访问 Tomcat,通过 Nginx 反向代理访问。
  • 在 Tomcat 内部也要准备好 自定义错误页面,避免泄露信息。
  1. 修改 server.xml

    Server 属性用于定义响应头中的 Server 字段,伪装成 Nginx。

    bash 复制代码
    <Connector port="8080"
               protocol="HTTP/1.1"
               Server="Nginx/1.24.1"
               connectionTimeout="20000"
               redirectPort="8443" />
  2. 重启 Tomcat

    bash 复制代码
    systemctl restart tomcat.service
  3. 验证

    -I:用 HEAD 请求 查看服务器响应头

    bash 复制代码
    curl -I 192.168.2.9:8080
    bash 复制代码
    HTTP/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配置中使用:

      bash 复制代码
      proxy_hide_header X-ZrLog;
    • 隐藏返回头中的自定义信息。

  • 验证 :重新加载 nginx 后,再次请求,X-ZrLog 消失。

4)Nginx + PHP 屏蔽

  • 问题 :默认会暴露 X-Powered-By: PHP/7.4.33

  • 解决

    • /etc/nginx/conf.d/blog.conf相关配置中加入:

      bash 复制代码
      fastcgi_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,更高效)

bash 复制代码
compression="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 应用放入真实生产环境中实践。

相关推荐
用户962377954485 小时前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机8 小时前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机8 小时前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户9623779544810 小时前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star10 小时前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户9623779544813 小时前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
碳基沙盒2 天前
OpenClaw 多 Agent 配置实战指南
运维
xy123062 天前
OpenStack Train 部署实战(三)控制节点--keystone服务
centos·openstack
cipher2 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
蝎子莱莱爱打怪4 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes