面试技巧
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源
bashfind /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、软件包解压即可使用
五、Java应用负载高故障案例
排查流程小结
Java会话共享方案
六、Tomcat配置https
day051留
七、java前后端分离项目
Tomcat 动静分离.提取出静态资源.
静态资源:前端(html,css,js).
后端:(Java,PHP,Python,Golang ) 连接使用数据库. 前后端分离,拆分为前端部分和后端部分,一般前后端通过API接口的进行连接.
API应用程序接口: 开发人员书写好的,可以直接调用的代码.使用的人员不需要关注功能如何实现的,只需要关注如何调用接口即可.
API接口在各种服务中广泛存在.
- 前端,后端下载的代码是源代码
- 前端代码需要编译,nodejs环境编译 静态资源(html,css,js) ------》nginx中.
- 后端代码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;
}
}