Linux运维-Tomcat集群部署
目录
- 基本介绍
- 部署Tomcat
- Tomcat HTTP请求过程
- Tomcat管理页面
- Tomcat部署zrlog项目
- 部署Tomcat集群
一.基本介绍
环境准备
JVM介绍
Java业务都是运行在java虚拟机上,java虚拟机简称JvM(javavirtualmachine)
虚拟机是通过软件模拟出具有完整硬件系统的功能为什么Java需要JVM虚拟机
早期C语言不支持跨平台,如果C语言想要在WindowsLinuxMac上运行需要进行分别编译,那么在Linux上有很多优秀的软件,如果需要在Windows上使用需要重新编译,移植性差而Java则不同,Java是可以跨平台,只需要将源码进行一次编译,能够在不同的作系统运行JAVA是如何做到的?
它只需要在WindwosLinux系统上运行一个jvm,这样我们能将Java编译好的war包在Windows和Linux平台运行起来,无需我们重复编译。而JVM是由jre提供JAVA环境JRE和JDK的区别jre是java的运行环境,包含jvm
jdk是java的开发环境,会包含java的运行环境jre
如果说单纯的运行java代码,只需要jre足够,但如果需要提供开发环境以及运行环境则需要JDKTomcat
Tomcat和Nginx类似,都是WEB服务器软件只不过Tomcat是基于JAVA开发的WEB服务,主要解析JAVA代码Nginx仅支持静态资源解析,而Tomcat支持解析Java开发的WEB应用,还支持解析静态资源(效率不高)Nginx适合做前端负载均衡,Tomcat适合做后端应用服务处理
通常情况企业会使用Nginx+Tomcat结合,Nginx处理静态资源,Tomcat处理动态资源

二.部署Tomcat
1.安装jdk
yum install java -y #暂时不用#上传安装包
[root@web01 ~]# rpm -ivh jdk-8u181-linux-x64.rpm
[root@web01 ~]# rpm -qa|grep jdk
jdk1.8-1.8.0_181-fcs.x86_64
2.安装Tomcat
(下载 Tomcat、解压、启动 )
Tomcat官网: https://tomcat.apache.org/[root@web01 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.104/bin/apache-tomcat-9.0.104.tar.gz
[root@web01 ~]#ll
-rw-r--r-- 1 root root 12787166 Apr 4 20:59 apache-tomcat-9.0.104.tar.gz[root@web01 ~]# mkdir /soft
[root@web01 ~]# tar xf apache-tomcat-9.0.104.tar.gz -C /soft/[root@web01 ~]# ln -s /soft/apache-tomcat-9.0.104/ /soft/tomcat[root@web01 ~]# /soft/tomcat/bin/startup.sh #启动
[root@web01 ~]# /soft/tomcat/bin/shutdown.sh # 停止# 8080 对外提供服务的端口
# 8005 关闭Tomcat端口
[root@web01 ~]# netstat -lntup|grep java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 2257/java
tcp6 0 0 :::8080 :::* LISTEN 2257/java
3.配置systemc方式启动
[root@web01 /soft/tomcat/bin]# cat /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Server
After=network.target remote-fs.target nss-lookup.target[Service]
Type=forking
ExecStart=/soft/tomcat/bin/startup.sh
ExecStop=/soft/tomcat/bin/shutdown.sh
Restart=/soft/tomcat/bin/shutdown.sh && sleep 2 && /soft/tomcat/bin/startup.sh[Install]
WantedBy=multi-user.target[root@web01 ~]# systemctl daemon-reload #加载生效[root@web01 /usr/lib/systemd/system]# systemctl restart tomcat
[root@web01 /usr/lib/systemd/system]# systemctl enable tomcat
4. Nginx启动方式
命令行的方式启动: /usr/sbin/nginx/usr/sbin/nginx -s stop/usr/sbin/nginx -s reload/usr/sbin/nginx -s stop && sleep 1 && /usr/sbin/nginx不支持查看当前nginx状态 只能用netstatsystemctl方式启动:systemctl start nginxrestart # 重启reload # 重新加载status # 查看服务状态enable # 开机自启动disable # 开机禁止启动cat的免交互写入,适合傻瓜式的复制文件
[root@web01 ~]# cat >1.txt <<EOF # >1.txt清空后写入
> 33
> 66
> 55
> EOF
[root@web01 ~]# cat 1.txt
33
66
55[root@web01 ~]# cat >> 1.txt<<EOF # >>1.txt追加内容
> 123
> 456
> 789
> EOF
[root@web01 ~]# cat 1.txt
33
66
55
123
456
789[root@web01 ~]# cat > 1.txt <<aaa
> 11
> 22
> 23
> aaa
[root@web01 ~]# cat 1.txt
11
22
23
5.配置文件
[root@web01 /soft/tomcat/conf]# cat server.xmltomcat软件目录结构:
bin ---主要包含启动和关闭tomcat的脚本(启停java脚本依赖jar包文件)
conf ---tomcat配置文件的目录(站点配置:server.xml)
lib ---tomcat运行时需要加载的jar包
logs ---tomcat日志存放位置
temp ---tomcat临时存放文件路径
webapps ---tomcat默认站点目录
work ---tomcat运行时产生的缓存文件
6.虚拟主机
[root@web01 /soft/tomcat/conf]# cat server.xml
...
...<Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" /></Host><Host name="diy.etiantian.com" appBase="/code/diy"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" /></Host>[root@web01 /soft/tomcat/conf]#mkdir -p /code/tomcat/diy/ROOT[root@web01 /soft/tomcat/conf]# echo "tomcat-diy" > /code/tomcat/diy/ROOT/index.html
[root@web01 /soft/tomcat/conf]# cat /code/diy/ROOT/index.html
tomcat-diy[root@web01 /soft/tomcat/conf]# systemctl restart tomcat解析host浏览器访问
10.0.0.7
diy.etiantian.org:8080

二.Tomcat HTTP请求过程

Ps: tomcat中Context的作用:
<Host name="diy.etiantian.com" appBase="/code/tomcat/diy"unpackWARs="true" autoDeploy="true"> <Context docBase="/code/tt" path="/tt" reloadable="true" />
<!--访问diy.etiantian.com:8080/tt这个uri,获取/code/tt中页面资源,不存在该目录会报错 无法启动Tomcat 需要提前创建--><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="localhost_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" /></Host>@web01 /soft/tomcat/logs]# systemctl restart tomcat#tomcat 9 版本目录不存在无法启动服务
[root[root@web01 /soft/tomcat/logs]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 997/sshd: /usr/sbin
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 994/php-fpm: master
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1776/nginx: master
tcp6 0 0 :::22 :::* LISTEN 997/sshd: /usr/sbin
tcp6 0 0 :::3306 :::* LISTEN 1308/mysqld
udp 0 0 127.0.0.1:323 0.0.0.0:* 670/chronyd
udp6 0 0 ::1:323 :::* 670/chronyd [root@web01 /soft/tomcat/logs]# mkdir /code/tt
[root@web01 /soft/tomcat/logs]# echo ttt... >/code/tt/index.hmtl[root@web01 /soft/tomcat/logs]# systemctl restart tomcat

用户发出一个请求,如http://tomcat.oldboy.com:8080/index.jsp
Connector发现是http/1.1协议,而且还是8080端口,于是就把请求接收后交给符合条件的Engine
Engine通过请求中的主机名tomcat.oldboy.com查找满足条件的虚拟主机(Host)
找到后就去此虚拟主机指定的appBase(代码存放的目录)最后将解析产生的结果返回给用户。
三.Tomcat管理页面

Tomcat自带的管理页面
管理功能
监控功能1.所有的管理页面,都将权限赋予给了角色,而角色的名称是固定的:
manager-gui admin-gui2.需要添加一个用户,将用户捆绑至对应的角色,这样用户就可以访问到对应的页面
[root@web01 ~]# vim /soft/tomcat/conf/tomcat-users.xml...<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="123456" roles="manager-gui,admin-gui"/></tomcat-users> # 配置文件的最后一行不要复制3.由于项目默认允许127.0.0.1访问,所以配置好了角色和用户也无法正常访问:vim /soft/tomcat/webapps/manager/META-INF/context.xml
默认状态,<Valve className="org.apache.catalina.valves.RemoteAddrValve"allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />修改为:
<Valve className="org.apache.catalina.valves.RemoteAddrValve"allow="\d+\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />4.重启tomcat并访问
[root@web01 ~]# systemctl restart tomcat



四.Tomcat部署zrlog项目
1. 定义虚拟主机
<!--站点zrlog.oldboy.com--><Host name="zrlog.oldboy.com" appBase="/zrlog"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="zrlog_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" /></Host>

2.下载上传war包至指定目录
zrlog官网: https://zrlog.com/
[root@web01 ~]# mkdir /code/zrlog[root@web01 /zrlog]# wget https://dl.zrlog.com/release/zrlog.war
[root@web01 /zrlog]# mv zrlog.war ROOT.war
[root@web01 /zrlog]# ll
total 10544
drwxr-x--- 9 root root 126 Apr 22 20:05 ROOT
-rw-r--r-- 1 root root 10794045 Jul 10 2024 ROOT.war1.在/zrlog目录下的解压.war包2.自动部署ROOT.war包 (自动生成ROOT目录)
3.重启tomcat应用
[root@web01 /zrlog]# systemctl restart tomcatWINDOWS的hosts解析
10.0.0.7 zrlog.oldboy.com
4.检查是否部署ok
[root@web0l conf]# tail -f /soft/tomcat/logs/catalina.out
11-May-2020 11:33:32.577 信息 [mainorg.apache.coyote.AbstractProtocol.start
开始协议处理句柄["http-nio-8080"]
11-May-2020 11:33:32.681 信息 [main]
org.apache.catalina.startup.Catalina.start
Server startup in [4,035] milliseconds
5.配置远程数据库连接
如果配置了数据库远程授权部分省略直接创建zrlog库即可
[root@db01 ~]# mysql -uroot -poldboy123.com -e "create database zrlog charset utf8;"MariaDB [(none)]> grant all privileges on *.* to'oldboy'@'%'
identified by'oldboy123.com';访问zrlog站点



五.部署Tomcat集群
1.tomcat集群架构图解


lb01 10.0.0.5 172.16.1.5
web01 172.16.1.7
web02 172.16.1.8JDK下载官网:
#按照需求下载自己对应的版本
https://www.oracle.com/java/technologies/downloads/#java21
2.安装tomcat
web02安装yum install java -y # 暂时不用# 先通过上传rpm包的方式安装jdk
[root@web02 ~]# rpm -ivh jdk-8u181-linux-x64.rpm
[root@web02 ~]# rpm -qa|grep jdk
jdk1.8-1.8.0_181-fcs.x86_64
3.拷贝代码和文件
# 注意是在web01节点操作的
[root@web01 ~]# scp -rp /soft 10.0.0.8:/
[root@web01 ~]# scp -rp /zrlog 10.0.0.8:/[root@web01 ~]# scp /usr/lib/systemd/system/tomcat.service 172.16.1.8:/usr/lib/systemd/system/tomcat.service
4.web02操作
[root@web02 ~]# /usr/local/apache-tomcat-10.1.40/bin/shutdown.sh [root@web02 /soft]# ln -s /soft/apache-tomcat-9.0.104/ /soft/tomcat/
[root@web02 ~]# systemctl daemon-reload[root@web02 ~]# systemctl start tomcat
root@web02 /data/zrlog]#systemctl enable tomcat
Created symlink /etc/systemd/system/multiuser.target.wants/tomcat.service → /usr/lib/systemd/system/tomcat.service.浏览器访问测试
10.0.0.8 zrlog.oldboy.com
5.NFS共享
1.编辑/etc/exports
[root@nfs /data/wp]# tail -1 /etc/exports
/data/zrlog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)2.上传静态图片到nfs
[root@nfs ~]# mkdir /data/zrlog
[root@web02 ~]# scp -r /zrlog/ROOT/attached/image/* 10.0.0.31:/data/zrlog[root@nfs /data/wp]# chown -R nginx.nginx /data/[root@nfs ~]# systemctl restart nfsweb01和web02挂载
[root@web01 ~]# mount -t nfs 172.16.1.31:/data/zrlog /zrlog/ROOT/attached/image
[root@web0 ~]# mount -t nfs 172.16.1.31:/data/zrlog /zrlog/ROOT/attached/image重启tomcat
[root@web01 ~]#/soft/tomcat/bin/shutdown.sh && /soft/tomcat/bin/startup.sh
6.后端代理
注意: 在Nginx做代理时
Nginx代理后端Nginx头部信息默认丢弃
Nginx代理后端Tomcat 头部信息自动携带 不管前面任何域名解析到负载 始终携带代理文件的头部信息1.Nginx_proxy
[root@lb01 /etc/nginx]# cat proxy_params
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 30;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 32k;
proxy_buffers 4 128k;root@lb01 /etc/nginx]# cat conf.d/zrlog.conf
upstream zrlog {server 172.16.1.7:8080;server 172.16.1.8:8080;
}server {listen 80;server_name zrlog.oldboy.com;location / {proxy_pass http://zrlog;include proxy_params; # tomcat启动的java程,可以直接通过proxy_pass进行负载均衡}
}为tomcat日志,获取http的Header信息
...<!--站点zrlog.oldboy.com--><Host name="zrlog.oldboy.com" appBase="/zrlog"unpackWARs="true" autoDeploy="true"><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"prefix="zrlog_access_log" suffix=".txt"pattern="%h %l %u %t "%r" %s %b" /></Host>
7.Tomcat+Nginx+HTTPS
Tomcat单节点 ---【了解项-安装PFX格式证书】
1.修改tomcat配置: server.xml
2.首先需要有证书 ( 必须 )
3.将http的默认监听端口8080 修改为 80,redirect至443
4.开启https监听器,配置证书即可。
5.将http强制跳转https ( tomcat操作,与nginx无关。)修改localhost
<Host name="aliyun.oldboy.com" appBase="webapps"web01 web02 lb01
root@lb01 /etc/nginx/ssl_key]#cat ../conf.d/zrlog.conf
upstream zrlog {server 172.16.1.7:8080;server 172.16.1.8:8080;
}server {listen 443 ssl;server_name zrlog.oldboy.com;ssl_certificate ssl_key/server.crt;ssl_certificate_key ssl_key/server.key;location / {proxy_pass http://zrlog;include proxy_params;}
}server {listen 80;server_name zrlog.oldboy.com;return 302 https://$server_name$request_uri;}
8.Tomcat+Nginx+Redis会话保持
多种会话方式:
1.ip_hash
2.mysql
3.redis
4.tomcat自带的cluster session复制 ( 官方建议不要超过4个tomcat节点 )
01.配置虚拟主机
# 所有节点都需要配置
[root@web01 ~]#cat /soft/tomcat/conf/server.xml
...<Host name="session.oldboy.com" appBase="/session"unpackWARs="true" autoDeploy="true"></Host>[root@web02 ~]#cat /soft/tomcat/conf/server.xml
...<!--session.oldboy.com--><Host name="session.oldboy.com" appBase="/session"unpackWARs="true" autoDeploy="true"></Host>
02.创建目录,编写代码
[root@web01 ~]# mkdir -p /session/ROOT/
[root@web02 ~]# mkdir -p /session/ROOT/[root@web01 ~]# vim /session/ROOT/index.jsp
<body><%//HttpSession session = request.getSession(true);System.out.println(session.getCreationTime());out.println("<br> web01 SESSION ID:" + session.getId() + "<br>");out.println("Session created time is :" + session.getCreationTime() + "<br>");%>
</body>[root@web02 ~]#vim /session/ROOT/index.jsp
<body><%//HttpSession session = request.getSession(true);System.out.println(session.getCreationTime());out.println("<br> web02 SESSION ID:" + session.getId() + "<br>");out.println("Session created time is :" + session.getCreationTime() + "<br>");%>
</body>[root@web01 ~]# systemctl restart tomcat
[root@web02 ~]# systemctl restart tomcat
03.接入负载均衡https
[root@lb01 /etc/nginx/conf.d]# vim session.conf
upstream session {server 172.16.1.7:8080;server 172.16.1.8:8080;}server {listen 443 ssl;server_name session.oldboy.com;ssl_certificate ssl_key/server.crt;ssl_certificate_key ssl_key/server.key;location / {proxy_pass http://session;include proxy_params;}
}server {listen 80;server_name session.oldboy.com;return 302 https://$server_name$request_uri;}[root@lb01 /etc/nginx/conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful[root@lb01 /etc/nginx/conf.d]# systemctl restart nginx
无会话保持:


04.接入 TomcatClusterRedisSessionManager
1.上传压缩包
[root@web01 ~]#ll
-rw-r--r-- 1 root root 921429 Apr 21 17:01 tomcat-cluster-redis-session-manager.zip2.解压zip包
[root@web01 ~]# unzip tomcat-cluster-redis-session-manager.zip3.拷贝jars到tomcat的/lib目录中
[root@web01 ~]# cp tomcat-cluster-redis-session-manager/lib/* /soft/tomcat/lib/4.拷贝conf下的redis.properties文件,到tomcat的conf文件
[root@web01 ~]# cp tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties /soft/tomcat/conf/5.将配置文件中连接redis地址修改为如下地址即可
[root@web01 ~]# vim /soft/tomcat/conf/redis-data-cache.properties
redis.hosts=172.16.1.51:6379
redis.password=1234566.添加如下两行至tomcat/conf/context.xml (添加在</Context> 上一行 )##引号内不能有空格
[root@web01 ~]# vim /soft/tomcat/conf/context.xml
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" /></Context># 注意:修改完一台直接和另外一台进行无差异同步rsync --delete #在企业中别用。
[root@web01 ~]# rsync -avz /soft/tomcat/ --delete 10.0.0.8:/soft/tomcat7.重启tomcat
[root@web01 ~]# systemctl restart tomcat
[root@web02 ~]# systemctl restart tomcat[root@db01 ~]# redis-cli -a '123456'web01、weblb01访问session.oldboy.com报错404 [root@web01 ~]# ps axu|grep tomcat
root 16662 1.1 9.8 3641448 95168 ? Sl 19:15 0:02 /usr/bin/java -Djava.util.logging.config.file=/soft/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dsun.io.useCanonCaches=false -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /soft/tomcat/bin/bootstrap.jar:/soft/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/soft/tomcat -Dcatalina.home=/soft/tomcat -Djava.io.tmpdir=/soft/tomcat/temp org.apache.catalina.startup.Bootstrap start
root 16707 0.0 0.0 213140 820 pts/2 S+ 19:19 0:00 grep tomcat
[root@web01 ~]# kill -9 16662
[root@web01 ~]# ps axu|grep tomcat
root 16715 0.0 0.0 213140 892 pts/2 S+ 19:20 0:00 grep tomcat[root@web01 ~]# systemctl start tomcat
[root@web01 ~]# netstat -lntup访问结果web01、web02轮询 ID号不变


