WEB集群-Tomcat集群收尾和java故障案例

面试技巧

1、掌握面试主动权,梳理流程,给面试官讲故事

2、用户访问网站的流程是怎样的,我都遇到那些坑(故障)

1、接入ngx

zrlog.war改名为ROOT.war然后部署.

tomcat访问的灵异事件

访问的时候需要填写全部文件名 zrlog.oldboylinux.cn:8080/zrlog/

ROOT 用户访问的时候不加上路径,直接访问文件,就会访问ROOT下面的内容.

zrlog.oldboylinux.cn:8080/lidao.jsp === webapps/ROOT/lidao.jsp

应用建议:

把应用war包和目录放在ROOT目录下面即可

可以把war包改为 ROOT.war

bash 复制代码
#找出数据库连接的文件 在/app/tools/tomcat/webapps/ROOT
find -type f | xargs grep '172.16.1.51'
ini 复制代码
[root@web03 /app/tools/tomcat/webapps/ROOT]# cat ./WEB-INF/db.properties
#This is a database configuration file
#Wed Feb 22 09:05:24 CST 2023
driverClass=com.mysql.cj.jdbc.Driver
user=zrlog
password=1
jdbcUrl=jdbc:mysql://172.16.1.51:3306/zrlog?characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=GMT
#jdbcUrl=jdbc:mysql://数据库地址:3306/数据库名字?characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=GMT

可以通过复制常用机器上的rpm包构建自己的yum源

bash 复制代码
find /var/cache/yum -type f -name '*.rpm' | xargs cp -t /app/rpms/

Ngx配置文件

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

tomcat+ngx动静分离

需要开发拆分代码,把静态资源拆分出来单独存放.

2、Tomcat多实例

目标:在同一台Linux主机上运行多个tomcat实例.

原因:充分利用服务器资源.

步骤:

  • 多个tomcat目录
  • 配置文件端口8080,8005 启动
  • 准备多个tomcat

准备多个tomcat

bash 复制代码
tar xf apache-tomcat-9.0.65.tar.gz
cp -r apache-tomcat-9.0.65 tomcat-8081
cp -r apache-tomcat-9.0.65 tomcat-8082 
mv tomcat-808* /app/tools/

修改配置

bash 复制代码
sed -i 's#8005#8006#g' /app/tools/tomcat-8081/conf/server.xml 
sed -i 's#8080#8081#g' /app/tools/tomcat-8081/conf/server.xml 
sed -i 's#8005#8007#g' /app/tools/tomcat-8082/conf/server.xml 
sed -i 's#8080#8082#g' /app/tools/tomcat-8082/conf/server.xml

手动启动

bash 复制代码
echo java oldboylinux 8081 >/app/tools/tomcat-8081/webapps/ROOT/lidao.jsp
echo java oldboylinux 8082 >/app/tools/tomcat-8082/webapps/ROOT/lidao.jsp

⚠ 未来生产上,可以直接把tomcat+应用整体打包,使用的时候直接解压即可.

3、监控功能

未来通过各种监控工具(Zabbix/Grafana/Prometheus/....),监控Tomcat/java.

需要我们开启java远程监控功能(JMX remote)

tomcat配置中修改tomcat启动的选项.开启jmx远程监控功能.

交给zbx就可以了(使用windows jdk连接tomcat).

diff 复制代码
#加载/app/tools/tomcat/bin/catalina.sh 文件中125 后面
CATALINA_OPTS java环境变量,指定java启动的时候的选项
​
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"
bash 复制代码
#重启服务
systemctl restart tomcat

在windows下,通过jdk连接tomcat(模拟监控软件连接)

C:\Program Files\Java\jdk1.8.0_201\bin\jconsole.exe

GC是垃圾回收,类似于清理缓存

四、java故障案例

1、命令

1)jps

jps ===》java ps 命令,只显示java进程. 类似于ps -ef | grep java 1

perl 复制代码
jps -lvm |grep tomcat-8081

2)jstack

jstack查看java进程内部信息,线程信息.

  • 进程: 占空间,占系统资源,厂房.
  • 线程: 厂房里面的工人,处理与用户的请求.

需要代码使用多线程技术. 通过 ps aux 查看进程是否支持线程(是否使用多线程技术)

perl 复制代码
先过滤出java进程的pid 
查看java进程的线程信息 
jstack 1786
查看java线程状态
jstack 1786 |grep -i state

1、新建状态New;

2、就绪状态Runnable;

3、运行状态Running;

4、阻塞状态Blocked;

5、死亡状态Dead。

3)jmap

jmap查看或导出jvm信息,查看jvm使用情况

jmap -heap java-pid 

导出jvm内存镜像,未来生产环境该文件较大.

perl 复制代码
jmap -dump:format=b,file=8081.hprof 1786
Dumping heap to /root/8081.hprof ...
Heap dump file created
[root@web03 ~]# ll -h 8081.hprof
 -rw------- 1 root root 20M Sep 19 09:43 8081.hprof

4)mat分析工具

jvm内存映像文件,在windows/mac/ubuntu系统下通过MemoryAnalyzer Tool (MA/MAT)

1、需要jdk环境

2、软件包解压即可使用

3、MemoryAnalyzer.exe

五、Java应用负载高故障案例

思维导图

排查流程小结

Java会话共享方案

六、Tomcat配置https

day051留

七、java前后端分离项目

Tomcat 动静分离.提取出静态资源.

静态资源:前端(html,css,js).

后端:(Java,PHP,Python,Golang ) 连接使用数据库. 前后端分离,拆分为前端部分和后端部分,一般前后端通过API接口的进行连接.

API应用程序接口: 开发人员书写好的,可以直接调用的代码.使用的人员不需要关注功能如何实现的,只需要关注如何调用接口即可.

API接口在各种服务中广泛存在.

  1. 前端,后端下载的代码是源代码
  2. 前端代码需要编译,nodejs环境编译 静态资源(html,css,js) ------》nginx中.
  3. 后端代码java, 通过maven/gradle编译 war包/jar包 运行.

1、概述

架构图

2、数据库准备

  • 解压
  • 配置
  • 初始化
  • 管理,连接
  • 创建库
  • 创建用户导入数据库表与数据(sql文件)
bash 复制代码
#解压,环境准备
mkdir -p /app/tools/ /app/data/3306/
tar xf mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz -C /app/tools/
ln -s /app/tools/mysql-8.0.27-linux-glibc2.12-x86_64/ /app/tools/mysql
yum install ncurses ncurses-devel libaio-devel openssl openssl-devel -y
​
#配置文件,用户
useradd -s /sbin/nologin -M mysql
​
#设置配置文件
cat>>/etc/my.cnf<<'EOF'
#by oldboy weixin:oldboy0102
[mysqld]
##用户
user=mysql
##安装目录
basedir=/app/tools/mysql/
##数据目录
datadir=/app/data/3306/
powurt=3306
socket=/tmp/mysql.sock
[client]
socket=/tmp/mysql.sock
EOF
​
cat /etc/my.cnf
#修改配置和数据目录的所有者.
chown mysql.mysql /etc/my.cnf
chown -R mysql.mysql /app/data/3306
​
#配置PATH环境变量
echo 'export PATH=/app/tools/mysql/bin:$PATH' >>/etc/profile
source /etc/profile
#检查
mysql -V

初始化数据库(不需要重复运行,重复运行会报错)

ruby 复制代码
#初始化
mysqld --initialize-insecure --user=mysql --basedir=/app/tools/mysql/ --datadir=/app/data/3306/ 
#判断上条命令是否成功,0表示成功
echo $?

启动

bash 复制代码
#拷贝已经准备好的启动管理文件
cp /app/tools/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
#开机自启动服务,运行服务
systemctl enable mysqld
systemctl start mysqld

登录

mysql

创建数据库

ini 复制代码
#创建exam数据库并指定字符集.
create database exam charset utf8mb4;

添加用户(请注意)

mysql5.8以后两条命令

csharp 复制代码
#创建用户
create user exam@'172.16.1.%' identified with mysql_native_password by  '1';
#授权
grant all on exam.* to exam@'172.16.1.%' ;
#测试
mysql -uexam -p1 -h 172.16.1.52;

导入数据(创建表,导入数据)

mysql exam <xzs-mysql.sql

3、部署后端

bash 复制代码
mkdir -p /app/code/exam/{front,backend}
解压
cd /app/code/exam/backend/
​
#配置文件内容:
cat >> application-prod.yml <<'EOF'
logging:
  path: /usr/log/xzs/
spring:
  datasource:
    url: jdbc:mysql://172.16.1.52:3306/exam?useSSL=false&useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowPublicKeyRetrieval=true&allowMultiQueries=true
    username: exam
    password: 1  # 替换为实际的数据库密码
    driver-class-name: com.mysql.cj.jdbc.Driver
EOF
​
java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod  xzs-3.9.0.jar
​
#说明
-Dspring.profiles.active=prod jar包目录同层的 application-prod.yml application.yml
​
​
#后台启动Java命令
nohup java -Duser.timezone=Asia/Shanghai -jar -Dspring.profiles.active=prod xzs-3.9.0.jar > start1.log 2>&1 &

访问与测试后端

http: 10.0.0.9:8000/student 学生 student 123456

http: 10.0.0.9:8000/admin admin 123456

4、部署前端

ini 复制代码
[root@web03 ~]# cat /etc/nginx/conf.d/exam.conf
server{
 listen 80;
  server_name admin.oldboylinux.cn;
  root  /app/code/exam/front/admin/;
  location / {
    index index.html;
  }
  location /api/ {
    proxy_pass  http://localhost:8000;
  } 
}
​
server {
  listen 80;
  server_name stu.oldboylinux.cn;
  root  /app/code/exam/front/student/;
  location / {
    index index.html;
  }
  location /api/ {
    proxy_pass  http://localhost:8000;
  } 
}
相关推荐
刘瑾言5 分钟前
ES操作命令
java·elasticsearch
计算机-秋大田5 分钟前
基于Spring Boot的船运物流管理系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
灰灰的辉11 分钟前
统信操作系统离线安装JDK、Nginx、elasticsearch、kibana、ik、pinyin
java·开发语言·elasticsearch
lzb_kkk32 分钟前
【JavaEE】文件io
java·开发语言·java-ee·1024程序员节
yang_shengy34 分钟前
【JavaEE】多线程(1)
java·开发语言·jvm·java-ee
果壳~36 分钟前
【Java】SpringBoot模拟流式输出,前端使用流式接收数据并打印
java·前端·spring boot
only-lucky37 分钟前
QT之QML从入门到精通(第七章)
java·数据库·qt
带刺的坐椅43 分钟前
Solon MVC 的 @Mapping 用法说明
java·mvc·ioc·solon
飞滕人生TYF44 分钟前
java Arrays 详解
java·python·排序算法