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 应用放入真实生产环境中实践。

相关推荐
科技小郑5 小时前
吱吱企业通讯软件可私有化部署,构建安全可控的通讯办公平台
大数据·网络·安全·信息与通信·吱吱企业通讯
czhc11400756636 小时前
Linux 830 shell:expect,ss -ant ,while IFS=read -r line,
linux·运维·r语言
滴滴滴嘟嘟嘟.6 小时前
嵌入式Linux驱动开发:蜂鸣器驱动
linux·运维·驱动开发
hit56实验室6 小时前
腾讯云的运维笔记——从yum的安装与更新源开始
运维·笔记·腾讯云
成都极云科技8 小时前
裸金属服务器与虚拟机、物理机的核心差异是什么?
运维·服务器·数据库
我命由我123459 小时前
Word - Word 查找文本中的特定内容
运维·经验分享·笔记·word·运维开发·文档·文本
计算机小手9 小时前
内网穿透系列十二:一款基于 HTTP 传输和 SSH 加密保护的内网穿透工具 Chisel ,具备抗干扰、稳定、安全特性
经验分享·网络协议·安全·docker·开源软件
IDC02_FEIYA9 小时前
服务器托管多少钱一年?服务器托管收费标准
运维·服务器
Sadsvit10 小时前
Ansible 自动化运维工具:介绍与完整部署(RHEL 9)
linux·运维·centos·自动化·ansible
key_Go11 小时前
05.《ARP协议基础知识探秘》
运维·服务器·网络·华为·arp