当前位置: 首页 > news >正文

Linux运维-Tomcat集群部署

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处理动态资源

image-20250422143705613

二.部署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 &quot;%r&quot; %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 &quot;%r&quot; %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

image-20250422193808595

二.Tomcat HTTP请求过程

image-20250422163710047

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 &quot;%r&quot; %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

image-20250422193625330

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

三.Tomcat管理页面

image-20250422194002869

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

image-20250422195517849

image-20250422195320971

image-20250422195439714

四.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 &quot;%r&quot; %s %b" /></Host>

image-20250422200200101

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站点

image-20250422201905903

image-20250422202008563

image-20250422202831981

五.部署Tomcat集群

1.tomcat集群架构图解

image-20250422203113984

image-20250422203128960

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 &quot;%r&quot; %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

无会话保持:

image-20250423153135207

image-20250423154229010

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号不变

image-20250423191854687

image-20250423195605315

http://www.sczhlp.com/news/11476/

相关文章:

  • 02011302 数组2
  • 02011401 委托01-委托基础、调用带引用参数的委托
  • 02011402 委托02-匿名方法、Lambda表达式
  • 基础数论公式集合
  • day23
  • 【办公自动化】如何使用Python操作PPT和自动化生成PPT?
  • 使用IOptions方式获取配置选项
  • 关于几种进阶搜索算法
  • 数据中心“拥抱”ARM架构,为何如此艰难?
  • ZROI 集训模拟赛后感
  • VLA完成度较低,加入世界模型或能收窄不确定性
  • 一文搞懂多模态大模型:视觉-语言模型(VLM)
  • 20250813(补档)
  • 8月集训记
  • 中国高校的AI大神教授盘点
  • VS Code 中把「自己部署的 Coder 模型」变成 AI 编程助手
  • 美版宇树|全球最灵敏人形机器人叠衣服,不只是机械臂!力证VLA模型?
  • AI自我提升的五种技术路径
  • C#记录类型与集合的深度解析:从默认行为到自定义比较
  • 【指南】同时安装vllm与flashinfer
  • 记一次展讯CPU安卓手机刷成砖后的救砖记录
  • Java集合——11.使用PriorityQueue
  • 基础算法
  • C++小白修仙记_快速排序
  • Java集合——10.使用Queue
  • 树链剖分详解(长链剖分)
  • 圆锥曲线二级结论
  • 新版EIDE创建C51_with_keil5模板方法
  • 【日记】2025-8-13
  • 谷歌账号停用申诉 google账户被封如何解封 如何填写申诉理由和找回账号