Tomcat使用手册

JVM虚拟机

常用参数

-XX:+PrintGC  #开启gc日志
-XX:+PrintGCDetails  #打印gc日志的详细信息
-XX:+PrintGCTimeStamps #打印gc日志的时间戳
-Xloggc:filename #gc日志的路径与名字

在这里GC 日志格式支持 %p 和 %t 两个参数:

%p 将会被替换为对应的进程 PID
%t 将会被替代为时间字符串,格式为: YYYY-MM-DD_HH-MM-SS

开启gc日志

-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data0/logs/gc-%t.log"

配置JAVA虚拟机的堆空间

1.设置java堆空间:两个值默认为物理内存64/1
-Xms:初始堆大小
-Xmx:最大堆大小
# 实际生产环境中, 我们通常将初始化堆(-Xms) 和 最大堆(-Xmx) 设置为一样大不超过物理内存的一半。以避免程序频繁的申请堆空间。

[root@qfedu.com bin]# vim catalina.sh   添加
JAVA_OPTS="-server -Xms2048m -Xmx2048m  -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data0/logs/gc-%t.log"
[root@qfedu.com ~]# mkdir /data0/logs/ -p  #创建gc日志存放路径

2.重启tomcat

JVM 运维实用排障工具

jdk安装

wget https://cloud.7boe.top/d/HKOSS/%E8%BD%AF%E4%BB%B6%E5%8C%85/jdk-8u321-linux-x64.tar.gz?sign=clICrDwnwWb9pMcbmSGK9-7Dke49AcKux6hLkaGKELs=:0 -O jdk.gz

压缩出来

tar xzf jdk-8u191-linux-x64.tar.gz -C /usr/local/

环境变量

vim /etc/profile

写入

JAVA_HOME=/usr/local/java #指定java安装目录
PATH=$JAVA_HOME/bin:$PATH #用于指定java系统查找命令的路径
export JAVA_HOME PATH #类的路径,在编译运行java程序时,如果有调用到其他类的时候,在classpath中寻找需要的类。

jps

用来查看Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程
常用参数如下:
-v:输出传给jvm的参数

注意: 使用jps 时的运行账户要和JVM 虚拟机启动的账户一致。若启动JVM虚拟机是运行的账户为www,那使用jps指令时,也要使用www 用户去指定。 sudo -u www jps

Example

#查看已经运行的JVM 进程的实际启动参数
[root@java-tomcat1 ~]# jps -v 
58154 Jps -Denv.class.path=.:/usr/local/java/lib:/usr/local/java/jre/lib:/usr/local/java/lib/tools.jar -Dapplication.home=/usr/local/java -Xms8m
58015 Bootstrap -Djava.util.logging.config.file=/data/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/data/application/tomcat -Dcatalina.home=/data/application/tomcat -Djava.io.tmpdir=/data/application/tomcat/temp

jstack

jstack用于打印出给定的java进程ID或远程调试服务的Java堆栈信息。此信息通常在运维的过程中被保存起来(保存故障现场),以供RD们去分析故障。
常用参数如下:
jstack <pid>
jstack [-F] <pid> //当’jstack [-l] pid’没有响应的时候强制打印栈信息

Example

jstack -F 38360 > /tmp/jstack.log

jmap

可以查看JVM堆内存使用情况
# jmap -heap pid

[root@qfedu.com ~]# jmap -heap 1414
Attaching to process ID 1414, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.271-b09

using thread-local object allocation.
Parallel GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 520093696 (496.0MB)
   NewSize                  = 11010048 (10.5MB)
   MaxNewSize               = 173015040 (165.0MB)
   OldSize                  = 22544384 (21.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 166723584 (159.0MB)
   used     = 52566128 (50.13096618652344MB)
   free     = 114157456 (108.86903381347656MB)
   31.5289095512726% used

Tomcat部署

下载

wget https://cloud.7boe.top/d/HKOSS/%E8%BD%AF%E4%BB%B6%E5%8C%85/apache-tomcat-9.0.83.zip?sign=fHosBJ5zXERmfI5Kn5QbfwUv_TUZikqAHpvDs1BhqNc=:0 -O tomcat9.zip

解压出来

tar zxvf tomcat9.zip

给权限

chmod +x tomcat9/bin/catalina.sh

启动

tomcat9/bin/startup.sh

Tomcat目录介绍

.
├── bin     #存放tomcat的管理脚本
├── BUILDING.txt
├── conf    #tomcat的配置文件
├── CONTRIBUTING.md
├── lib      #web应用调用的jar包存放路径
├── LICENSE
├── logs     #tomcat日志存放目录,catalin.out日志为只要输出日志
├── NOTICE
├── README.md
├── RELEASE-NOTES
├── RUNNING.txt
├── temp     #存放临时文件
├── webapps  #默认网站发布目录
└── work     #存放编译生产的.java与.class文件

网站默认目录

├── docs  #tomcat的帮助文档
├── examples  #web应用实例
├── host-manager  #主机管理
├── manager    #登录管理
└── ROOT    #默认站点根目录

配置文件

.
├── Catalina
├── catalina.policy
├── catalina.properties
├── context.xml
├── logging.properties
├── server.xml           # tomcat 主配置文件
├── server.xml.bak
├── server.xml.bak2
├── tomcat-users.xml    # tomcat 管理用户配置文件
├── tomcat-users.xsd
└── web.xml

x

tail -f tomcat9/logs/catalina.out 

Tomcat主要参数

port:指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。
protocol:连接器使用的协议,支持HTTP和AJP。AJP(Apache Jserv Protocol)专用于tomcat与apache建立通信的.
redirectPort:指定服务器正在处理http请求时,资源本身又被设置了必须要https方式访问的重定向的端口号
maxThreads:接收最大请求的并发数
connectionTimeout  指定超时的时间数(以毫秒为单位)

host参数

host:表示一个虚拟主机
name:指定主机名
appBase:应用程序基本目录,即存放应用程序的目录.一般为appBase="webapps",相对于CATALINA_HOME而言的,也可以写绝对路径。
unpackWARs:如果为true,则tomcat会自动将WAR文件解压,否则不解压。
autoDeploy:在tomcat启动时,是否自动部署

Tomcat多实例配置

装两个tomcat写入多个个端口

< <Server port="8011" shutdown="SHUTDOWN">
---
> <Server port="8012" shutdown="SHUTDOWN">

Tomcat安全优化

telnet 管理端口保护(强制)

类别配置内容及说明标准配置备注
telnet管理端口保护1.修改默认的8005管理端口为不易猜测的端口(大于1024);2.修改SHUTDOWN指令为其他字符串;1.以上配置项的配置内容只是建议配置,可以按照服务实际情况进行合理配置,但要求端口配置在8000~8999之间;
2、ajp 连接端口保护(推荐)
类别配置内容及说明标准配置备注
Ajp 连接端口保护1.修改默认的ajp 8009端口为不易冲突的大于1024端口;2.通过iptables规则限制ajp端口访问的权限仅为线上机器;<Connector port="8528"protocol="AJP/1.3" />以上配置项的配置内容仅为建议配置,请按照服务实际情况进行合理配置,但要求端口配置在8000~8999之间;;保护此端口的目的在于防止线下的测试流量被mod_jk转发至线上tomcat服务器;
3、 禁用管理端(强制)
类别配置内容及说明标准配置备注
禁用管理端1. 删除默认的{Tomcat安装目录}/conf/tomcat-users.xml文件,重启tomcat后将会自动生成新的文件;2. 删除{Tomcat安装目录}/webapps下默认的所有目录和文件;3.将tomcat 应用根目录配置为tomcat安装目录以外的目录;<Host name="localhost" appBase="/application/work/webapps"对于前段web模块,Tomcat管理端属于tomcat的高危安全隐患,一旦被攻破,黑客通过上传web shell的方式将会直接取得服务器的控制权,后果极其严重;
4、降权启动(强制)
类别配置内容及说明标准配置备注
降权启动1.tomcat启动用户权限必须为非root权限,尽量降低tomcat启动用户的目录访问权限;2.如需直接对外使用80端口,可通过普通账号启动后,配置iptables规则进行转发;避免一旦tomcat 服务被入侵,黑客直接获取高级用户权限危害整个server的安全;

参数详解

<Server port="8527" shutdown=" dangerous">

<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" server="webserver"/> 

<!-- Define an AJP 1.3 Connector on port 8528 -->
<!--Define an accesslog --> 
<Valve className="org.apache.catalina.valves.AccessLogValve"
                 directory="logs"  prefix="localhost_access_log." suffix=".txt"
                 pattern="%h %l %t %r %s %b %{Referer}i %{User-Agent}i %D" resolveHosts="false"/>

    <Connector port="8528" protocol="AJP/1.3" />

<Context path="" docBase="/home/work/local/tomcat_webapps" debug="0" reloadable="false" crossContext="true"/>
    
    
参数解释:
resolveHosts #如果这个值是true的话,tomcat会将这个服务器IP地址通过DNS转换为主机名,如果是false,就直接写服务器IP地址.
%h   #这个就是服务器名称了,如果resolveHosts为false的话,这里就是IP地址了
%t   #日志和时间,使用通常的Log格式
%r   #包含了请求的方法和URI
%s   #这个是响应http的状态码
%b   #这是发送信息的字节数,不包括http头,如果字节数为0的话,显示为-
%D   #处理请求的时间,以毫秒为单位
%l   #浏览者进行身份验证时提供的名字

隐藏版本号

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />      #在日志这里添加最后一句隐藏版本号。


重启tomcat访问查看