ThankNeko's Blog ThankNeko's Blog
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)

Hoshinozora

尽人事,听天命。
首页
  • 操作系统

    • Linux基础
    • Linux服务
    • WindowsServer笔记
    • Ansible笔记
    • Shell笔记
  • 容器服务

    • Docker笔记
    • Kubernetes笔记
    • Git笔记
  • 数据库服务

    • MySQL笔记
    • ELK笔记
    • Redis笔记
  • 监控服务

    • Zabbix笔记
  • Web服务

    • Nginx笔记
    • Tomcat笔记
  • 数据处理

    • Kettle笔记
  • Python笔记
  • Bootstrap笔记
  • C笔记
  • C++笔记
  • Arduino笔记
  • 分类
  • 标签
  • 归档
  • 随笔
  • 关于
GitHub (opens new window)
  • 操作系统

  • 虚拟化服务

  • 数据库服务

  • 监控服务

  • Web服务

    • Nginx笔记

    • Tomcat笔记

      • Tomcat介绍与部署使用
      • Tomcat监控与排错思路
      • Tomcat优化
        • Tomcat安全优化
          • 1. 修改默认Shutdown端口和暗号
          • 2. 关闭AJP连接端口
          • 3. 关闭WEB管理端
          • 4. 降权启动
          • 5. 关闭文件列表访问控制
          • 6. 关闭Tomcat错误页面信息
          • 7. 修改服务端响应头信息
          • 8. 访问限制
          • 9. 回收脚本权限
        • Tomcat性能优化
          • 1. tomcat工作模式(io模型)
          • 2. 禁用DNS逆向解析功能
          • 3. 开启压缩功能
          • 4. 线程相关优化
          • 5. JVM内存优化
          • 6. 动静分离优化
  • 数据处理

  • Ops
  • Web服务
  • Tomcat笔记
Hoshinozora
2023-03-10
目录

Tomcat优化

# Tomcat安全优化

# 1. 修改默认Shutdown端口和暗号

虽然Tomcat的Shutdown端口默认只允许本地访问,但还是修改一下比较好。

  • # 配置方式
    • vim ./conf/server.xml - 修改配置文件中Server标签的属性

      <Server port="端口号" shutdown="暗号">
      
      1

# 2. 关闭AJP连接端口

如果Web服务器和Tomcat做的是短链接,就需要频繁的创建和关闭TCP连接,于是Tomcat就做了个优化,架设了一个叫做AJP的长连接,在多个请求和响应周期过程中会重用该连接,以减少了创建连接和关闭连接的次数。 但是AJP服务只有Apache服务器才能使用。而我们一般是使用Nginx+Tomcat的架,用不着AJP协议,所以一般会把AJP连接器关闭以节省资源。

  • # 配置方式
    • vim ./conf/server.xml - 注释掉配置文件中包含protocol="AJP/1.3"的Connector标签。
    • Tomcat8.5之后默认是关闭(注释)的。

# 3. 关闭WEB管理端

  • # 配置方式
    • 注释掉server.xml中管理端配置

        <GlobalNamingResources>
          <!-- 管理页面 正式环境关闭
          <Resource name="UserDatabase" auth="Container"
                    type="org.apache.catalina.UserDatabase"
                    description="User database that can be updated and saved"
                    factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
                    pathname="conf/tomcat-users.xml" />
        -->
        </GlobalNamingResources>
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
    • 删除管理端相关的WEB文件

      • webapps/下的默认文件都可以删掉

# 4. 降权启动

让服务以普通用户运行。

  • # 配置方式
    # 1.创建普通用户
    useradd -M tomcat
    
    # 2.将Tomcat目录所有者改为普通用户
    chown -R tomcat:tomcat /data/apps/tomcat
    chmod -R 744  /data/apps/tomcat
    
    # 3.以普通用户的身份启动TOMCAT
    su - tomcat -c /data/apps/tomcat/tomcat/bin/startup.sh
    
    # 4.加入自启动
    su - tomcat -c /data/apps/tomcat/tomcat/bin/startup.sh >> /etc/rc.local
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

# 5. 关闭文件列表访问控制

Tomcat默认是关闭的。

  • # 配置方式
    • vim ./conf/web.xml

      <init-param>
          <param-name>listings</param-name>
          <param-value>false</param-value>
      </init-param>
      
      1
      2
      3
      4

# 6. 关闭Tomcat错误页面信息

Tomcat默认错误页面会显示版本信息,一般不应该将版本号信息展示出来。

  • # 配置方式
    • 通过指定错误页面解决。
    • 我们可以通过修改./conf/web.xml下的配置进行错误页面的重定向。
    • 也可以修改应用程序下的WEB-INF/web.xml下的配置进行错误页面的重定向。

# 7. 修改服务端响应头信息

  • # 配置方式
    • vim ./conf/server.xml - 在Connector中添加头信息即可, 比如:server="myserver"

      <Connector port="8080" protocol="HTTP/1.1"
                 connectionTimeout="20000"
                 redirectPort="8443"
                 server="myserver" />
      
      1
      2
      3
      4
    • 注意:通过Nginx转发访问时,可能会被Nginx的信息覆盖。

# 8. 访问限制

类似于nginx的allow和deny。

  • # 配置方式
    • vim ./conf/server.xml - 在<Host>虚拟主机中配置

      <Valve className="org.apache.catalina.valves.RemoteAddrValve"
                 allow="192.168.10.*,10.0.0.1" deny="*.*.*.*" />
      
      1
      2

# 9. 回收脚本权限

不让其他用户拥有执行脚本的权限。

  • # 配置方式
    • chmod -R 750 ./bin/ - 将./bin/中的文件全部修改为750权限

# Tomcat性能优化

# 1. tomcat工作模式(io模型)

  • bio(blocking io) - 阻塞模型
    • Tomcat7之前使用的工作模型,同步阻塞,每个客户端的连接都会启动一个线程来处理。并发量高时,线程数较多,会造成资源浪费。
  • nio(new io) - 非阻塞模型
    • Tomcat8之后的工作模型,异步非阻塞,nio1(默认)/nio2可以通过少量的线程处理大量的请求。
  • apr(Apache Portable Runtime)
    • 也是一个异步模型,同时也会提升Tomcat在静态文件方面的处理能力,但配置较复杂。Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。
    • 平时使用Nginx处理静态文件的话,可以不用apr模式。

# 2. 禁用DNS逆向解析功能

该功能可用于获取客户端的主机名,但实际上从IP解析到域名的意义不大,而且会消耗一定的查询时间,所以一般可以关闭该功能,以提高性能。 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址。

  • # 配置方式
    • vim ./conf/server.xml - 在Connector中添加配置

      <Connector port="8080" protocol="HTTP/1.1"
                 connectionTimeout="20000"
                 redirectPort="8443"
                 enableLookups="false" />
      
      1
      2
      3
      4
    • enableLookups="false" - 关闭DNS逆向解析

# 3. 开启压缩功能

压缩静态资源,例如css/js/html/jpg等。开启GZIP压缩虽然可以提高Web响应速度,但是会提高服务器CPU消耗,看如何取舍。

  • # 配置方式
    • vim ./conf/server.xml - 在Connector中添加配置

      <Connector port="8080" protocol="HTTP/1.1"
                 connectionTimeout="20000"
                 redirectPort="8443"
                 compression="on"
                 compressionMinSize="2048"
                 compressableMimeType="text/html,text/xml,application/javascript,text/css,text/plain,text/json" />
      
      1
      2
      3
      4
      5
      6
    • compression="on" - 启用压缩功能

    • compressionMinSize="2048" - 文件压缩最小大小阈值,单位B,默认2048B

      • 此处是大于2KB的文件才进行压缩,注意此值的大小,如果配置不合理,产生的后果是小文件压缩后反而变大了,达不到预想的效果。
    • compressableMimeType="text/html,text/xml" - 会被压缩的MIME类型列表

      • 多个用逗号隔开,表明支持html、xml、js、css、json等文件格式的压缩。

# 4. 线程相关优化

需要根据实际情况进行配置,一般要结合压力测试工具边测试边进行调整。测试工具一般有ab(http)、stree(系统)、jmeter(http/接口)、LoadRunner(专业压力测试)。

  • # 配置方式
    • vim ./conf/server.xml - 在Connector中添加配置

      <Connector port="8080" protocol="HTTP/1.1"
                 connectionTimeout="20000"
                 redirectPort="8443"
                 maxThreads="500"
                 minSpareThread="10"
                 acceptCount="500"
                 acceptorThreadCount="2" />
      
      1
      2
      3
      4
      5
      6
      7
    • maxThreads="500" - 最大工作线程数量

    • minSpareThread="10" - 始终打开的最小工作线程数量

      • 并发量低时可以节省创建线程的开支。
    • acceptCount="500" - 接收新请求的最大队列长度

      • 一般保持和最大线程数量一致即可,当工作线程达到最大线程数量时,新请求就需要排队等待线程处理。
    • acceptorThreadCount="2" - 单个线程处理请求数

      • 也就是一个线程最多能处理多少个请求,一般和CPU核心数一致,或者设为其2倍。

# 5. JVM内存优化

服务器内存小时,一般最大内存可以设为初始内存的两倍,让JVM按需使用资源。但在内存资源比较充足时,建议JVM初始内存和最大内存设为一致,分配一个固定的内存大小以减少内存抖动。 JVM向操作系统申请内存时都需要一定的开销,所以在启动项目的时候就直接设置好足够的堆内存大小,省下了申请内存的开销。

  • # 配置方式
    • vim ./tomcat/bin/setenv.sh - 在setenv.bat或setenv.sh文件中配置

      • 如果tomcat的bin目录下没有这个文件,可以手动创建。
      • setenv.bat或setenv.sh是tomcat的变量通用文件,里面的变量会被daemon.sh和startup.sh等启动器引用。
      # -Xms 初始内存
      # -Xmx 最大内存
      # -Xloggc执行GC时打印日志
      JAVA_OPTS="-Xms1024m -Xmx1024m \
           -Xloggc:/var/log/tomcat_gc.log"
      
      1
      2
      3
      4
      5

# 6. 动静分离优化

Nginx处理静态资源,Tomcat处理动态资源。

# Nginx+Tomcat

  • Nginx配置文件

    • 注意目录权限问题,需要让Nginx有访问Tomcat静态资源的权限。
    upstream tomcat {
        192.168.10.11:8080 max_fails=3 fail_timeout=10s;
        192.168.10.12:8080 max_fails=3 fail_timeout=10s;
    }
    
    server {
        listen 80;
        server_name zrlog.test.com;
        root /data/apps/tomcat/tomcat/webapps/zrlog.test.com/ROOT;
    
        # 需要程序做动静分离才会有index.jsp
        location / {
            index index.jsp;
        }
    
        location ~ \.(gif|jpg|png|js|css)$ {
            expires 1d;
        }
    
        location ~ \.jsp$ {
            proxy_pass http://tomcat;
            proxy_set_header Host $http_host;
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24

# LB+Nginx+Tomcat

  • LB配置文件

    upstream nginx {
        192.168.10.11:80 max_fails=3 fail_timeout=10s;
        192.168.10.12:80 max_fails=3 fail_timeout=10s;
    }
    
    upstream tomcat {
        192.168.10.13:8080 max_fails=3 fail_timeout=10s;
        192.168.10.14:8080 max_fails=3 fail_timeout=10s;
    }
    
    server {
        listen 80;
        server_name zrlog.test.com;
    
        # 默认走Tomcat动态请求,因为动态请求不太好区分
        location / {
            proxy_pass http://tomcat;
            proxy_set_header Host $http_host;
        }
    
        # 静态资源走Nginx获取
        location ~* \.(htm|html|js|css|jsp|json|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
            proxy_pass http://nginx;
            proxy_set_header Host $http_host;
        }
    
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
  • Nginx配置文件

    • 需要将静态资源传输到Nginx后端或者挂NFS,如果有上传的文件的功能应当挂NFS,以保证任意以一台Nginx服务器都能访问上传的资源。
    server {
        listen 80;
        server_name zrlog.test.com;
        root /data/apps/webapps/zrlog.test.com/ROOT;
    
        location / {
            index index.html;
        }
    
        location ~ \.(htm|html|js|css|jsp|json|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
            expires 1d;
        }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
#Web#Java#Tomcat
Tomcat监控与排错思路
Kettle介绍与部署

← Tomcat监控与排错思路 Kettle介绍与部署→

最近更新
01
二〇二五年四月十七日随笔
04-17
02
二〇二五年四月十六日随笔
04-16
03
二〇二五年四月九日随笔
04-09
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Hoshinozora | MIT License
湘ICP备2022022820号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式