TOMCAT

### 1 web中间件

| java容器 | 说明 |
| ——– | ——————————————– |
| tomcat | 最常用,较重,功能完善 |
| jetty | 轻量,功能较少 |
| jboss | |
| weblogic | 用于oracle数据库环境使用,weblogic属于oracle |
| 东方通 | 国产java容器,tongweb |
| ….. | |

JVM-JRE-JAVA

jvm:java虚拟机中,运行java代码的地方

jre:java运行环境,提供jvm环境,java命令

jdk:java开发环境,jvm+jre+额外功能

jdk安装的两种方法

“`sh
1、rpm -ivh jdk-8u351-linux-x64.rpm

2、二进制部署jdk
mkdir -p /app/tools/
tar xf jdk-8u341-linux-x64.tar.gz -C /app/tools/
ll /app/tools/
ln -s /app/tools/jdk1.8.0_341/ /app/tools/jdk
在/etc/profile最后添加以下内容
export JAVA_HOME=/app/tools/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

source /etc/profile

“`

![image-20250107154434265](D:\Program Files (x86)\Typora\007-tomcat\image-20250107154434265.png)

二进制部署tomcat

“`sh
tar -xf apache-tomcat-9.0.97.tar.gz -C /app/tools/
ln -s /app/tools/apache-tomcat-9.0.97/ /app/tools/tomcat
/app/tools/tomcat/bin/version.sh
“`

### 2 tomcat目录结构

| 目录 | 说明 |
| ——- | ———————————- |
| bin | 存放tomcat管理命令 |
| conf | tomat配置文件 |
| lib | 依赖于库文件,插件文件 |
| logs | 日志目录 |
| webapps | 站点目录 |
| work | tomcat运行java代码的存放代码的目录 |

#### 1 bin目录

| bin目录 | 说明 |
| ———– | ——————————— |
| startup.sh | 启动脚本 |
| shutdown.sh | 关闭脚本 |
| catalina.sh | 核心脚本,配置tomcat优化,jvm优化 |

#### 2 conf目录

| conf配置文件 | 说明 |
| ———— | —————————— |
| server.xml | tomcat配置文件,类似nginx.conf |
| web.xml | 配置文件,辅助文件 |

#### 3 logs目录

| logs目录 | 说明 |
| ———————————– | ———————————————————— |
| catalina.out | tomcat应用日志,启动过程,关闭等错误日志,核心找error,failed,exception |
| catalina.2022-09-15.log | catalina.sh的切割日志,按每天进行切割 |
| localhost_access_log.2022-09-15.txt | 访问日志,未来可以重新定义成跟nginx日志一样格式 |

#### 4 webapps

站点目录

war包,自动解压,自动部署

书写systemctl管理配置文件进行管理

目标:

可以给二进制安装或编译安装的软件书写systemctl配置文件

可以通过systemctl管理服务(开机重启,是否开机启动)

### 3 书写systemctl流程

书写配置文件,参考其他服务

重新加载systemctl

开始使用systemctl管理服务即可

systemctl配置文件路径

/usr/lib/systemd/system/xxx.service

以.service结尾

分为3个部分

[Unit]

[Service]

[Install]

| systemctl配置文件结构 | 说明 |
| ————————– | ———————————————————- |
| [Unit] | 指定注释信息,依赖(先后顺序) |
| Description | 说明与注释 |
| After | 在这里指定服务之后运行,network。target |
| [Service] | 核心,用于指定服务开启、关闭、重启命令 |
| Type=notify | 指定类型simple或forking即可 |
| ExecStart | 服务启动命令 |
| ExecStop | 服务关闭命令 |
| ExecReload | 重启 |
| EnvironmentFile | 配置环境变量的文件(一般对于编译安装,二进制安装需要加上) |
| [Install] | 内容固定,指定运行级别 |
| WantedBy=multi-user.target | 运行级别,一般都是多用户模式 |

“`sh
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking

# 指定Tomcat的启动和关闭脚本路径
ExecStart=/app/tools/tomcat/bin/startup.sh
ExecStop=/app/tools/tomcat/bin/shutdown.sh

# 指定用户和组,Tomcat通常以非root用户运行

# 环境变量,确保JAVA_HOME被正确设置
Environment=”JAVA_HOME=/app/tools/jdk”

# 确保在启动时重新加载服务
Restart=on-failure

[Install]
WantedBy=multi-user.target
“`

### 4 运行java代码

开发人员书写的java代码:java源代码,无法直接不上到tomcat中

需要对源代码进行编译打包,生成war包或jar包

java代码→编译→war包或jar包

使用war包或jar包部署web服务器

| 如何运行java相关软件包 | 说明 | 应用场景 |
| ———————- | ———————————————————— | ——– |
| war包 | 需要放在java容器中运行,比如放到tomcat的webapps目录下(tomcat会自动加载与运行war包内容) | 功能复杂 |
| jar包 | 不需要依赖,直接运行只需要jdk,通过java -jar xxx.jar运行 | 功能简单 |

#### 1 jar包运行

“`sh
[root@web03 ~]# java -jar -Dfile.encoding=UTF-8 nginxWebUI-3.4.0.jar –server.port=8848 –project.home=/app/code/ngx
“`

–project.home 项目配置文件目录,存放数据文件,证书文件,日志等,默认为/home/nginxWebUI/

#### 2 tomcat管理端

tomcat管理端,web页面管理与查看tomcat信息功能

对tomcat进行调优的时候临时开启

未来生产环境中需要关闭

webapps/ROOT下面

#### 3 开启管理端功能

修改配置文件conf/tomcat-users.xml

修改代码,安全措施,只能127访问

“`sh
在倒数第二行之前添加


“`

#### 4 修改只能127访问

“`sh
cd /app/tools/tomcat/webapps/
sed -i ‘s#127#\\d+#g’ ./host-manager/META-INF/context.xml ./host-manager/WEB-INF/manager.xml ./manager/META-INF/context.xml
“`

### 5 案例01-tomcat部署zrlog应用

LNMT环境部署应用,war包应用

代码war

创建数据库与用户

war包部署到tomcat webapps目录

部署zrlog流程

1.数据库,库,用户

2.tomcat环境,部署war包

3.安装代码与调试

4.接入ngx

“`sh
数据库操作
MariaDB [(none)]> create database zrlog;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> grant all on zrlog.* to ‘zrlog’@’172.16.1.%’ identified by ‘XZnh@95599’;

MariaDB [(none)]> select user,host from mysql.user;

tomcat操作
[root@web03 ~]# mv zrlog-2.2.1-efbe9f9-release.war /app/tools/tomcat/webapps/ROOT.war

这里是启动tomcat后在页面上配置数据库文件后自动生成的,了解一下这个文件即可
[root@web03 /app/tools/tomcat/webapps/ROOT/WEB-INF]# cat db.properties
#This is a database configuration file
#Tue Nov 26 17:06:08 CST 2024
driverClass=com.mysql.cj.jdbc.Driver
user=zrlog
password=XZnh@95599
jdbcUrl=jdbc\:mysql\://172.16.1.51\:3306/zrlog?characterEncoding\=UTF-8&allowPublicKeyRetrieval\=true&useSSL\=false&serverTimezone\=GMT

chown -R root.root /app/tools/tomcat/
find /app/tools/tomcat/webapps/ -type f |xargs chmod 644
find /app/tools/tomcat/webapps/ -type d |xargs chmod 755

nginx配置
[root@web03 /etc/nginx/conf.d]# cat zrlog.ysllinux.cn.conf
server {
listen 80;
server_name zrlog.ysllinux.cn;
error_log /var/log/nginx/zrlog.ysllinux.cn.error.log notice;
access_log /var/log/nginx/zrlog.ysllinux.cn.access.log main;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

以上是没有实现动静分离
下面实现动静分离

[root@web03 /etc/nginx/conf.d]# cat zrlog.ysllinux.cn.conf
server {
listen 80;
server_name zrlog.ysllinux.cn;
error_log /var/log/nginx/zrlog.ysllinux.cn.error.log notice;
access_log /var/log/nginx/zrlog.ysllinux.cn.access.log main;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* \.(html|js|css|png|jpeg|bmp|webp)$ {
root /app/tools/tomcat/webapps/ROOT;
expires 7d;
}
}
“`

### 5 tomcat配置文件

“`sh

#8005端口,可以telnet到8005然后输入SHUTDOWN关闭tomat,有需要的话可以将SHUTDOWN改成其他指令





#配置管理认证等功能



#8080,处理用户的http请求,8443是用于处理https请求的

#engine部分,指定默认的虚拟主机,defaultHost指定的是默认的虚拟主机



#host部分,指定虚拟主机的配置





“`

| 虚拟主机 | tomcat | nginx |
| ——– | —————————————————— | —————————————— |
| 虚拟主机 | host部分 | server{} |
| 域名 | name=“域名“ | server_name java.ysllinux.cn; |
| 端口 | port=”8080″ | listen 80; |
| 站点目录 | appBase=”webapps“ | root /app/code/blog; |
| 自动解压 | unpackWARs=”true” | 无 |
| 自动部署 | autoDeploy=”true” | 无 |
| 日志目录 | valve部分的directory=”logs” | access_log /var/log/nginx/access.log main; |
| 日志名字 | valve部分的prefix=”localhost_access_log” suffix=”.txt” | access_log /var/log/nginx/access.log main; |
| 日志格式 | valve部分的pattern=”%h %l %u %t "%r" %s %b” | log_format main ….. |

要让tomcat访问日志格式与nginx一致,需要替换

“`sh
pattern=”%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" "%{X-Forwarded-For}i"” />
“`

### 6 tomcat多实例

将tomcat的目录多复制几个,然后修改server.xml里面的端口,再启

### 7 java远程监控功能

1、通过各种监控工具

2、使用tomcat自带的监控功能

修改catalina.sh

找CATALINA_OPTS

找到后修改

“`sh
CATALINA_OPTS=”$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=10.0.0.9″

-Dcom.sun.management.jmxremote #开启远程监控功能
-Dcom.sun.management.jmxremote.port=12345 #指定端口
-Dcom.sun.management.jmxremote.authenticate=false #关闭认证功能
-Dcom.sun.management.jmxremote.ssl=false #关闭ssl加密功能
-Djava.rmi.server.hostname=10.0.0.9″#写上本地网卡的ip,监听的地址,未来写上内网ip
“`

### 8 java监控命令

“`sh
都是以j开头的
jps
jstack
jmap
jdump

1、jps,jps -lvm相当于ps -ef
[root@web03 ~]# jps
1016 Bootstrap
1694 Jps
[root@web03 ~]# ps -ef | grep 1016
root 1016 1 0 10:11 ? 00:00:08 /app/tools/jdk/bin/java -Djava.util.logging.config.file=/app/tools/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= -classpath /app/tools/tomcat/bin/bootstrap.jar:/app/tools/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/app/tools/tomcat -Dcatalina.home=/app/tools/tomcat -Djava.io.tmpdir=/app/tools/tomcat/temp org.apache.catalina.startup.Bootstrap start

[root@web03 ~]# jps -lvm | grep tomcat
1016 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/app/tools/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=/app/tools/tomcat -Dcatalina.home=/app/tools/tomcat -Djava.io.tmpdir=/app/tools/tomcat/temp

2、jstack查看线程信息
用法
[root@web03 ~]# jstack 1016 | grep -i state
java.lang.Thread.State: RUNNABLE
java.lang.Thread.State: RUNNABLE
java.lang.Thread.State: RUNNABLE
java.lang.Thread.State: WAITING (parking)
状态
新建状态new
就绪状态runnable
运行状态running
阻塞状态blocked
死亡状态dead
挂起状态parking

统计状态
[root@web03 ~]# jstack 1016 | grep -i state|awk ‘{print $2}’|sort|uniq -c

3、jmap
jmap到处jvm内存数据保留到本地,通过其他软件分析这个文件
[root@web03 ~]# jmap -dump:format=b,file=8080.hprof 1016
Dumping heap to /root/8080.hprof …
Heap dump file created
[root@web03 ~]# ll
total 277620
-rw——- 1 root root 94931250 Nov 27 11:10 8080.hprof

java系统负载高排查流程
1、通过监控得知系统负载高
2、使用w/top/uptime/vmstat查看是cpu还是存还是io
3.1、io高,使用iotop查看到pid再查看pid对应的进程
3.2、内存高,top按M查看内存排行再查看进程
3.3、cpu高,top按P查看cpu排行再查看进程
4、最后查出来是java进程
查看服务日志
使用jstack查看线程信息
使用jmap -dump:format=b,file=8080.hprof 1016
1016是java进程号
5、使用MemoryAnalyzer.exe分析让开发人员看
“`

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注