### 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
“`
\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分析让开发人员看
“`