当前位置: 首页 > news >正文

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

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

  • 一:安全优化
    • 1)监牢模式
    • 2)Tomat 版本信息隐藏
    • 3)屏蔽服务端软件或代码版本信息
    • 4)Nginx + PHP 屏蔽
  • 二:性能优化
    • 1)io 模型优化
    • 2)Tomcat Java 线程数
    • 3)DNS 与压缩
    • 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 用户只能访问自己目录,不允许访问系统关键目录。
  1. 创建专用用户

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

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

    chown -R tomcat:tomcat /opt/module/tomcat-8.5.87/
    
  3. 以指定用户启动 Tomcat

    su - tomcat -c "/opt/module/tomcat-8.5.87/bin/startup.sh"
    

    或者在 systemd service 文件里指定:

    [Service]
    User=tomcat
    Group=tomcat
    
  4. 验证进程权限

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

    ps -ef | grep java
    
  5. 设置开机自启

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

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

      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。

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

    systemctl restart tomcat.service
    
  3. 验证

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

    curl -I 192.168.2.9:8080
    
    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配置中使用:

      proxy_hide_header X-ZrLog;
      
    • 隐藏返回头中的自定义信息。

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

4)Nginx + PHP 屏蔽

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

    在这里插入图片描述

  • 解决

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

      fastcgi_hide_header X-Powered-By;
      

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


二:性能优化

1)io 模型优化

  • BIO:阻塞,同步模型(Tomcat7 及之前默认,性能较差)

  • NIO (NIO1/NIO2):非阻塞,异步模型(Tomcat8 默认 NIO,推荐使用 NIO2)

  • APR:基于本地库,适合高并发场景

配置方法(修改 server.xml<Connector>):

# 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>):

<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,更高效)

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>):

<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 日志

-Xloggc:/var/log/tomcat_gc.log

自动 Dump 功能

-XX:+HeapDumpOnOutOfMemoryError   # 发生 OOM 自动导出内存快照
-XX:HeapDumpPath=/app/tools/tomcat/temp/oom.hprof   # Dump 文件路径

配置示例(catalina.sh

⚠️提示:配置完之后重启 Tomcat

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

http://www.xdnf.cn/news/1396549.html

相关文章:

  • 简易TCP网络程序
  • 250830-Docker从Rootless到Rootful的Gitlab镜像迁移
  • 【Linux】网络安全管理:Netfilter、nftables 与 Firewalld | Redhat
  • Pmp项目管理方法介绍|权威详解与实战指南
  • 【超全汇总】MySQL服务启动命令手册(Linux+Windows+macOS)(上)
  • MYSQL速通(3/5)
  • Linux 830 shell:expect,ss -ant ,while IFS=read -r line,
  • 构建AI智能体:十八、解密LangChain中的RAG架构:让AI模型突破局限学会“翻书”答题
  • Python自定义函数形式参中的*args、**kwargs、*和/
  • STM32G474 IAP 双bank升级的坑
  • WebStorm无法识别@下的文件,但是可以正常使用
  • 【后端数据库】MySQL 索引生效/失效规则 + 核心原理
  • 腾讯云OpenCloudOS 9系统部署OpenTenBase数据库详细教程
  • 【云原生】Docker 搭建Kafka服务两种方式实战操作详解
  • php连接rabbitmq例子
  • 【序列晋升】21 Spring Cloud Gateway 云原生网关演进之路
  • 卷积神经网络项目:基于CNN实现心律失常(ECG)的小颗粒度分类系统
  • HAProxy 负载均衡全解析:从基础部署、负载策略到会话保持及性能优化指南
  • docker命令(二)
  • 现状摸底:如何快速诊断企业的“数字化健康度”?
  • PCIe 6.0 TLP深度解析:从结构设计到错误处理的全链路机制
  • 算法题(194):字典树
  • 从0到1玩转 Google SEO
  • Suno-API - OpenI
  • “FAQ + AI”智能助手全栈实现方案
  • Python从入门到高手9.4节-基于字典树的敏感词识别算法
  • 8月29日星期五今日早报简报微语报早读
  • 轮廓周长,面积,外接圆,外接矩形近似轮廓和模板匹配和argparse模块实现代码参数的动态配置
  • 【C++】掌握类模板:多参数实战技巧
  • 基于Net海洋生态环境保护系统的设计与实现(代码+数据库+LW)