01 Tomcat Web服务

1、JAVA基础知识

1.1 编程语言

我们的编程语言大体分为下面两大类:

  • 系统级: C、C++、go

  • 应用级: C#、java、python、perl、ruby、php

这些应用级编程语言,它们的着眼点不是程序的运行效率,⽽是程序的便捷可移植性;

所以无论是 java、python、php ,它们都是有着自⼰ "解释器" 的编程语言;

但对于 java 我们将底层运行环境称为解释器可能并不合适,所以我们⼀般会将其底层运行环境称为虚拟机 (JVM)

1.2 什么是JVM

JVM 全称 (java Virtual Machine) ,简成 java 虚拟机,那什么是虚拟机

  • ⾸先虚拟机可以通过软件模拟⼀台完整的计算机硬件功能;

  • 其次能够在该模拟的计算机硬件上安装相应的操作系统运行;

但 jvm 并不是提供⼀个能安装操作系统级的虚拟机,它仅提供了 java 程序运行的独⽴环境(程序级虚拟机);

1.3 为何需要JVM

像 C 语言是不⽀持跨平台,因此 C 语言开发的程序,如果希望在 windows 或linux 上运行则需要编译多次,已确保能适配不同的操作系统平台;

⽽ JAVA 则不同, JAVA 只需要将编写好的源代码进行⼀次编译,就能够在不同的系统平台运行,能够做到⼀次编译,多处运行;

但有⼀个前提,事先我们需要在各个操作系统平台上安装好 JVM 虚拟机;

1.4 JDK与JRE

  • jre 是 java 的运行环境,包含了 jvm 虚拟机;

  • jdk 是 java 的开发环境,包含了 java 的运行环境 jre

  • 如果单纯的运行 java 代码,只需要 jre 足够,但如果需要提供开发环境以及运行环境则需要 jdk

2、安装OpenJDK

OpenJDK 是 Sun 公司采用 GPL v2 协议发布的 JDK 开源版本,于 2009 年正式发布。

2.1 安装Java1.8

[root@web03 ~]# yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y

# 查看版本
[root@web03 ~]# java -version
openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)

2.2 安装Java11

[root@web03 ~]# yum install java-11-openjdk java-11-openjdk-devel

2.3 安装Java17

[root@web03 ~]# yum install java-17-openjdk java-17-openjdk-devel

3、安装OracleJDK

1、访问Oracle官方网站,下载JDK: https://www.oracle.com/java/technologies/downloads/

3.1 rpm包安装方式

1、下载java8版本的rpm

[root@rocky9 ~]# dnf -y install lrzsz vim 
[root@rocky9 ~]# rpm -ivh jdk-8u401-linux-x64.rpm

2、检查版本

[root@rocky9 ~]# java -version
java version "1.8.0_401"
Java(TM) SE Runtime Environment (build 1.8.0_401-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.401-b10, mixed mode)

3.2 ⼆进制安装方式

1、下载⼆进制包

📎jdk-8u401-linux-x64.tar.gz

[root@rocky9 ~]# dnf -y install lrzsz vim wget net-tools
[root@rocky9 ~]# tar xf jdk-8u401-linux-x64.tar.gz -C /usr/local/
[root@rocky9 ~]# ln -s /usr/local/jdk1.8.0_401/ /usr/local/jdk

2、添加java环境变量

[root@rocky9 ~]# vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/

# 加载环境变量
[root@rocky9 ~]# source /etc/profile.d/jdk.sh

3、检查版本

[root@rocky9 ~]# java -version
java version "1.8.0_401"
Java(TM) SE Runtime Environment (build 1.8.0_401-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.401-b10, mixed mode)

3.3 运行简单java代码

将源码编译为字节码测试

1、编写 java 源代码

[root@rocky9 ~]# cat hello.java
class Hello{
	public static void main(String[] args)
 	{
 		System.out.println("hello, java");
	 }
}

2、使用 javac 命令编译源码

[root@rocky9 ~]# javac hello.java

[root@rocky9 ~]# ls Hello.*
Hello.class

3、使用相对路径运行class类文件

[root@rocky9 ~]# java -cp . Hello
hello, java

4、Tomcat服务介绍

4.1 什么是Tomcat

  • Tomcat 和 Nginx 类似,也是⼀个 Web 服务器软件。

  • 只不过 Tomcat 是基于 JAVA 开发的 WEB 服务,因此它主要是解析 Java 代码。

4.2 Tomcat与Nginx

  • Nginx 仅⽀持静态解析,⽽ Tomcat ⽀持解析 java 代码解析,同时还⽀持解析静态资源(但效率不⾼)

  • Nginx 适合做前端负载均衡;

  • Tomcat 适合做后端应用服务处理;

  • 通常情况下企业会使用 Nginx+tomcat 方式来运行,由 Nginx 处理静态资源, Tomcat 处理动态资源;

5、Tomcat服务安装

5.1 下载并安装

📎apache-tomcat-9.0.111.tar.gz

[root@rocky9 ~]# mkdir /app
[root@rocky9 ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.111/bin/apache-tomcat-9.0.111.tar.gz

#或者,清华仓库源下载(建议)
[root@rocky9 ~]# wget https://mirror.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.111/bin/apache-tomcat-9.0.111.tar.gz

[root@rocky9 ~]# tar xf apache-tomcat-9.0.111.tar.gz -C /app
[root@rocky9 ~]# ln -s /app/apache-tomcat-9.0.111/ /app/tomcat

5.2 配置启动文件

1、默认tomcat没有启动服务文件,可以⼿动为tomcat建⽴启动停止文件

[root@rocky9 ~]# cat > /usr/lib/systemd/system/tomcat.service <<EOF
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
#二进制安装jdk、需要增加此环境变量
Environment=JAVA_HOME=/usr/local/jdk
Environment=CATALINA_HOME=/app/tomcat
Environment=CATALINA_BASE=/app/tomcat

ExecStart=/app/tomcat/bin/startup.sh
ExecStop=/app/tomcat/bin/shutdown.sh
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
EOF

2、启动tomcat服务

[root@rocky9 ~]# setenforce 0 
[root@rocky9 ~]# systemctl stop firewalld
[root@rocky9 ~]# systemctl daemon-reload
[root@rocky9 ~]# systemctl enable tomcat --now

[root@rocky9 ~]# netstat -lntp|grep java
tcp6       0      0 :::8080                 :::*                    LISTEN      12049/java          
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      12049/java

5.3 访问Tomcat应用

通过浏览器访问 http://IP:8080 即可访问 Tomcat 资源

5.4 Tomcat⽬录结构说明

  • bin :tomcat 启动和停止脚本;

  • Catalina 的名字来源于美国西海岸靠近洛杉矶的一个小岛,名为 Catalina 岛。这个小岛以其风景秀丽而著名。Servlet 运行模块的最早开发者 Craig McClanahan 因为喜欢 Catalina 岛,所以以 Catalina 命名他所开发的模块。此外,Tomcat 的名字来源于“公猫”,因为其开发者希望用一种能够自己照顾自己的动物代表这个软件,于是命名为 Tomcat。

  • conf :tomcat 服务相关配置文件;

  • lib :tomcat 运行需要加载的jar包,库文件;

  • logs :tomcat 在运行过程中产生的⽇志文件;

  • temp :tomcat 存放临时文件;

  • webapps :tomcat 网站默认站点⽬录;

  • work :tomcat 运行时编译产生的缓存文件(可 tree 命令验证);

5.5 Tomcat组成结构说明

在了解Tomcat组成结构之前,我们先了解⼀下Tomcat的配置文件

  • 顶级组件 server :表示⼀个 tomcat 实例,⼀台主机可以启动多 tomcat 实例;

  • 连接器组件 Connector : tomcat 用于接受用户请求,⽀持 HTTP、HTTPS、AJP 等连接协议;

  • 服务类组件 service :用来组织 Connector 和 Engine 的对应关系,⼀个 service 中只有⼀个 Engine ;

  • 容器类组件 Engine : Tomcat 用来响应并处理用户请求,⼀个 Engine 上可以关联多个 Host ;

  • 容器类组件 Host :虚拟主机, Tomcat 用它来实现多站点,使用不同的主机头区分;

  • 容器类组件 Context :应用的上下文,定义请求的 uri 路径与本地⽬录的映射关系;

5.6 Tomcat请求处理流程

  • 假设来自客户的请求为: http://tomcat.ops.net:8080/index.jsp

  • 1.服务端运行 Tomcat 应用,监听在本机的 8080 端⼝,等待连接;

  • 2.浏览器发送 http 请求,并且请求服务端的 8080 端⼝,也就是 tomcat 进程;

  • 3.服务端通过 http connector 连接器获取请求,然后通过 service 将请求交给符合条件的 engine ;

  • 4.Engine获取对应的Header头部信息,然后遍历所有的虚拟机Host进行匹配;

  • 5.如果 Engine 匹配不到,就把请求交给 Engine 中的 defaultHost 处理;

  • 6.如果 Engine 匹配到对应的 Host ,则提取该 Host 中指定的 appBase (代码存储的路径);

  • 7.最后 Engine 将解析后的结果通过 Service 返回给 Connector , Connector 返回给浏览器;

6、Tomcat核心功能

6.1 Tomcat虚拟主机Host

虚拟主机:在⼀台 tomcat 服务上运行多个站点

  • Host name :域名

  • appBase :网站代码存放路径

  • unpackWARs :自动解压 war 包

  • autoDeploy :自动部署

[root@rocky9 ~]# mkdir -p /code/tom1/ROOT
[root@rocky9 ~]# echo abc > /code/tom1/ROOT/index.html

[root@rocky9 ~]# vim /app/tomcat/conf/server.xml
      <Host name="tomcat1.ops.net"  appBase="/code/tom1"
            unpackWARs="true" autoDeploy="true">
      </Host>
      
 [root@rocky9 ~]# systemctl restart tomcat

6.2 Tomcat虚拟主机context

context 的使用方式(注意:如果设定了 context ,没有创建对应⽬录则无法启动 Tomcat )

  • docBase:站点存放的路径

  • path:访问站点的 URI 路径

  • reloadable:修改了jsp文件,无需重启就可以实现显示的同步

实例:访问 http://tomcat2.ops.net:8080/zh --> 映射 --> /code/zh

[root@rocky9 ~]# vim /app/tomcat/conf/server.xml
      <Host name="tomcat2.ops.net"  appBase="/code/tom2"
            unpackWARs="true" autoDeploy="true">
            <Context docBase="/code/zh" path="/zh" reloadable="true"/>
      </Host>

[root@rocky9 ~]# mkdir /code/tom2/ROOT
[root@rocky9 ~]# echo 666 > /code/tom2/ROOT/index.html
[root@rocky9 ~]# mkdir /code/zh
[root@rocky9 ~]# echo tom2 > /code/zh/index.html
[root@rocky9 ~]# systemctl restart tomcat

6.3 Tomcat默认页面Basic Auth

当我们点击 Tomcat 默认站点 Server Status 或 manager APP 时,会出现403错误,提示需要配置Basic认证才能访问管理页面,或状态页面。

1、配置 conf/tomcat-users.xml ,添加用户,然后关联⾄对应资源的角色名称;

[root@es-node1 tomcat]# vim conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>

2、由于 Tomcat 仅允许本地 127.0.0.1 进行 basic 认证。如果需要其他网段通过 basic 认证,还需要配置允许访问规则。找到 webapps/项⽬/META-INF/context.xml

[root@es-node1 tomcat]# vim 项⽬⽬录下/META-INF/context.xml
#tomcat9.0.111版本之前修改方式如下:
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
#修改为
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1|10\.0\.0\.\d+" />

#tomcat9.0.111版本之后修改方式如下:
将 allow="127.0.0.0/8,::1/128" />
修改为:allow="127.0.0.0/8,::1/128,10.0.0.0/24" />

#Tomcat默认管理页面
# vim /soft/tomcat/webapps/host-manager/META-INF/context.xml
# vim /soft/tomcat/webapps/manager/META-INF/context.xml

[root@rocky9 ~]# systemctl restart tomcat

[root@rocky9 ~]# ls /code/
t1

[root@rocky9 ~]# echo t1 > /code/t1/ROOT/index.html
[root@rocky9 ~]# tail -10 /app/tomcat/conf/server.xml
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
      <Host name="t1.tomcat.net"  appBase="/code/t1"
            unpackWARs="true" autoDeploy="true">
      </Host>

    </Engine>
  </Service>
</Server>

[root@rocky9 ~]# systemctl restart tomcat

02 Tomcat Web实践

1、Tomcat交付博客业务

1.1 配置虚拟主机

[root@web01 ~]# rm -rf /code/*
[root@web01 ~]# vim /soft/tomcat/conf/server.xml
      <!--zrlog.ops.net-->
      <Host name="zrlog.ops.net"  appBase="/code/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>

1.2 部署博客项⽬

官网:https://www.zrlog.com/

📎zrlog-2.2.3.rar

[root@web01 ~]# mkdir /code/zrlog
[root@web01 ~]# mv zrlog-2.2.3.war /code/zrlog/ROOT.war
[root@web03 ~]# systemctl restart tomcat

1.3 配置数据库服务

由于 zrlog 需要数据库⽀持,建议直接使用远程数据库

[root@db01 ~]# yum install mysql-server -y
[root@db01 ~]# systemctl enable --now mysqld
[root@db01 ~]# setenforce 0 
[root@db01 ~]# systemctl stop firewalld
[root@db01 ~]# mysql
mysql> create database zrlog charset utf8;
mysql> create user 'zrlog'@'%' identified by 'zrlog';
mysql> grant all privileges on *.* to 'zrlog'@'%';
mysql> flush privileges;

1.4 访问博客项⽬

通过浏览器访问,需要带上 8080 端⼝

安装后的效果

2、多节点部署

1、安装jdk

[root@web01 ~]# scp apache-tomcat-9.0.111.tar.gz jdk-8u401-linux-x64.tar.gz 10.0.0.29:/root

[root@web02 ~]# tar xf jdk-8u401-linux-x64.tar.gz -C /usr/local/ 
[root@web02 ~]# ln -s /usr/local/jdk1.8.0_401/ /usr/local/jdk
[root@web01 ~]# scp /etc/profile.d/jdk.sh 10.0.0.29:/etc/profile.d/

[root@web02 ~]# source /etc/profile.d/jdk.sh 
[root@web02 ~]# java -version
java version "1.8.0_401"
Java(TM) SE Runtime Environment (build 1.8.0_401-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.401-b10, mixed mode)

2、安装 tomcat 部署代码 (scp)

[root@web01 ~]# dnf -y install rsync

[root@web02 ~]# rsync -avz root@10.0.0.9:/app /
[root@web02 ~]# rsync -avz root@10.0.0.9:/code /
[root@web02 ~]# ln -s /app/apache-tomcat-9.0.111/ /app/tomcat

3、启动Tomcat

[root@web02 ~]# /app/tomcat/bin/startup.sh

[root@web02 ~]# ss -ntl | grep 8080
LISTEN 0      100                     *:8080            *:* 

[root@web02 ~]# systemctl stop firewalld
[root@web02 ~]# setenforce 0 

2.1 Tomcat集群部署

  • standalone 模式,Tomcat单独运行,直接接受用户的请求,不推荐;

  • 单机反向代理模式,可以做到静态由 nginx 提供响应,动态 jsp 代理给Tomcat ;

  • 反向代理多机模式:前置⼀台 Nginx ,给多台 Tomcat 实例做负载均衡调度;

3、集群部署环境准备

4、反向代理实践

4.1 单机反向代理实践

1、配置Nginx源,然后安装

[root@proxy1 ~]# yum -y install nginx 

2、配置Nginx代理

[root@proxy1 ~]# cat /etc/nginx/conf.d/proxy.conf
server {
 server_name zrlog.ops.net;
 listen 80;
 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;
 }
}

4.2 多机反向代理实践

1、安装Nginx

[root@lb01 ~]# yum install nginx -y

2、配置Nginx负载均衡

[root@proxy1 ~]# cat /etc/nginx/conf.d/proxy_zrlog.ops.net.conf
upstream java {
	server 10.0.0.9:8080;
	server 10.0.0.29:8080;
}
server {
 	server_name zrlog.ops.net;
 	listen 80;
 
	location / {
 		proxy_pass http://java;
 		proxy_set_header Host $http_host;
 		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 	}
}

[root@lb01 ~]# setenforce 0 
[root@lb01 ~]# systemctl stop firewalld

[root@lb01 ~]# systemctl enable --now nginx

5、多节点共享存储

1、安装 NFS

[root@nfs ~]# groupadd -g 666 www
[root@nfs ~]# useradd -u666 -g666 www
[root@nfs ~]# yum install nfs-utils -y

2、配置 NFS

[root@nfs ~]# vi /etc/exports
/data/zrlog 10.0.0.0/24(rw,all_squash,anonuid=666,anongid=666)

[root@nfs ~]# systemctl enable --now nfs-server

3、初始化NFS

[root@nfs ~]# mkdir /data/zrlog -p
[root@nfs ~]# chown -R www.www /data/zrlog
[root@nfs ~]# systemctl restart nfs-server

4、多web节点挂载

[root@web02 ~]# mkdir /code/zrlog/ROOT/attached/
[root@web01 ~]# mkdir /code/zrlog/ROOT/attached/
[root@web01 ~]# dnf -y install nfs-utils 
[root@web02 ~]# dnf -y install nfs-utils 

[root@web01 ~]# mount -t nfs 10.0.0.49:/data/zrlog /code/zrlog/ROOT/attached/
[root@web02 ~]# mount -t nfs 10.0.0.49:/data/zrlog /code/zrlog/ROOT/attached/

📎20251109133029_558.png

6、Tomcat配置Https

6.1 单机配置Https

Tomcat 单机配置证书【了解即可】阿⾥云文档传送⻔

1.修改 Tomcat 配置

📎21395293_tomcat.zhouhaoit.com_tomcat.zip

[root@rocky9 ~]# mkdir /app/tomcat/ssl
[root@rocky9 ~]# unzip 21395293_tomcat.zhouhaoit.com_tomcat.zip -d /app/tomcat/ssl/
[root@rocky9 ~]# cat /app/tomcat/ssl/pfx-password.txt
18oev28f

[root@web01 ~]# vim Tomcat安装⽬录/conf/server.xml
# <!--http连接器->处理请求与响应请求-->
 <Service name="Catalina">
 <Connector port="80" protocol="HTTP/1.1"
 connectionTimeout="20000"
 redirectPort="443" />
# <!--https连接器-->
<Connector port="443" #port属性根据实际情况修改(https默认端⼝为443)
 protocol="HTTP/1.1"
 SSLEnabled="true"
 scheme="https"
 secure="true"
 keystoreFile="/app/tomcat/ssl/tomcat.zhouhaoit.com.pfx" #证书名称需要写绝对路径
 keystoreType="PKCS12"
 keystorePass="18oev28f" ##替换为密码文件pfx-password.txt中的内容
 clientAuth="false"
 SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECD HE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>

2.配置 web.xml 文件,开启 HTTP 强制跳转 HTTPS ,在文件 </welcome-file-list> 后添加如下内容:

[root@rocky9 ~]# vi /app/tomcat/conf/web.xml 

<login-config> 
 <!-- Authorization setting for SSL --> 
 <auth-method>CLIENT-CERT</auth-method> 
 <realm-name>Client Cert Users-only Area</realm-name> 
</login-config> 
<security-constraint> 
 <!-- Authorization setting for SSL --> 
 <web-resource-collection > 
 <web-resource-name >SSL</web-resource-name> 
 <url-pattern>/*</url-pattern> 
 </web-resource-collection> 
 <user-data-constraint> 
 <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
 </user-data-constraint> 
</security-constraint>

[root@rocky9 ~]# systemctl restart tomcat

测试http访问,自动跳转到https

6.2 集群配置Https

1、创建 ssl ⽬录,并将证书存放⾄该⽬录即可

📎21214937_www.zhouhaoit.com_nginx.zip

[root@lb01 ~]# mkdir -p /etc/nginx/ssl && cd /etc/nginx/ssl

#上传证书
[root@lb01 /etc/nginx/ssl]# unzip 21214937_www.zhouhaoit.com_nginx.zip 
[root@lb01 /etc/nginx/ssl]# ls

2、编辑负载均衡,将 http 协议升级为 https

[root@proxy01 ~]# cat /etc/nginx/conf.d/proxy_zrlog.ops.net.conf
upstream zrlog {
	server 10.0.0.9:8080;
	server 10.0.0.29:8080;
}

server {
	listen 443 ssl;
	ssl_certificate ssl/www.zhouhaoit.com.pem;
	ssl_certificate_key ssl/www.zhouhaoit.com.key;
 	ssl_session_timeout 5m;
	server_name www.zhouhaoit.com;

	location / {
		proxy_pass http://zrlog;
		proxy_set_header Host $http_host;
	}
}
server {
	listen 80;
	server_name www.zhouhaoit.com;
	return 302 https://$server_name$request_uri;
}

3、重启 Nginx

[root@lb01 ~]# nginx -t
[root@lb01 ~]# systemctl restart nginx

7、Tomcat会话保持

7.1 会话保持架构概述

  • 通过 redis 方式实现 Tomcat 的 session 共享

7.2 会话保持地址规划

系统环境

IP

角色

版本

RockyLinux9

172.16.1.5

Nginx-proxy

1.24

RockyLinux9

172.16.1.7

Tomcat-node1

9.x

RockyLinux9

172.16.1.8

Tomcat-node2

9.x

RockyLinux9

172.16.1.41

Redis

9.x

7.3 添加虚拟主机配置

在所有的tomcat节点上添加虚拟主机

[root@web01 ~]# vim /app/tomcat/conf/server.xml
 <!--session站点-->
 <Host name="session.ops.net" appBase="/code/session"
 unpackWARs="true" autoDeploy="true">
 </Host>

7.4 添加sesion页面

[root@web01 ~]# mkdir /code/session/ROOT -p

#注意第二个web把web01改成web02,以便更好的看到效果
[root@web01 ~]# cat /code/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>

7.5 配置负载均衡调度

[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_session.ops.net.conf
upstream java {
 	server 10.0.0.9:8080;
 	server 10.0.0.29:8080;
}
server {
	server_name session.ops.net;
 	listen 80;
 
	location / {
 		proxy_pass http://java;
		proxy_set_header Host $http_host;
 }
}

[root@lb01 ~]# systemctl reload nginx

7.6 测试session状态

通过负载均衡测试访问,然后轮询调度到后端web集群,会发现不同主机的 session 不⼀致。

解决会话保持的问题:ip_hash

再次强刷浏览器,发现始终调度到同一节点

7.7 安装Redis Server

安装 redis,当然可以搭建 redis sentinel 或 redis cluster 集群

[root@redis ~]# yum -y install redis 

[root@redis ~]# vi /etc/redis/redis.conf 
bind 127.0.0.1 10.0.0.49
requirepass 123456  #在903行附近

[root@redis ~]# systemctl enable --now redis 

[root@redis ~]# ss -ntl | grep 6379
LISTEN 0      511        127.0.0.1:6379       0.0.0.0:*          
LISTEN 0      511        10.0.0.49:6379       0.0.0.0:*

[root@redis ~]# redis-cli 
127.0.0.1:6379> info
NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info

[root@redis ~]# redis-cli -a "123456"
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> info

下载 TomcatClusterRedisSessionManager (所有web集群都需要操作) GitHub地址

📎tomcat-cluster-redis-session-manager.zip

[root@web01 ~]# unzip tomcat-cluster-redis-session-manager.zip

7.8 配置Redis Sesssion Manager

1.将下载的 jar 移动到 tomcat/lib ⽬录

[root@web01 ~]# cp tomcat-cluster-redis-session-manager/lib/* /app/tomcat/lib/
[root@web02 ~]# cp tomcat-cluster-redis-session-manager/lib/* /app/tomcat/lib/

2.将 redis-data-cache.properties 文件移动到 tomcat/conf ⽬录,并完成配置

[root@web01 ~]# cp tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties /app/tomcat/conf/
[root@web02 ~]# cp tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties /app/tomcat/conf/

# 配置连接redis
[root@web01 ~]# vim /app/tomcat/conf/redis-data-cache.properties
...
redis.hosts=10.0.0.49:6379
redis.password=123456
...

[root@web02 ~]# vim /app/tomcat/conf/redis-data-cache.properties
...
redis.hosts=10.0.0.49:6379
redis.password=123456
...

3.在 tomcat/conf/context.xml 中添加如下两行类

[root@web01 ~]# vi /app/tomcat/conf/context.xml 
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />

[root@web02 ~]# vi /app/tomcat/conf/context.xml 
<Valve className="tomcat.request.session.redis.SessionHandlerValve" />
<Manager className="tomcat.request.session.redis.SessionManager" />

4.修改 tomcat/conf/web.xml 中的会话过期时间(分钟)

[root@web01 ~]# vi /app/tomcat/conf/web.xml 
#修改会话缓存时间
<session-config>
 <session-timeout>60<session-timeout>
<session-config>

[root@web02 ~]# vi /app/tomcat/conf/web.xml 
#修改会话缓存时间
<session-config>
 <session-timeout>60<session-timeout>
<session-config>

5.最后启动所有节点的 tomcat

[root@web01 ~]# systemctl restart tomcat

7.9 验证 Tomcat 会话保持

通过 nginx 进行访问,每次刷新 SessionID 都是⼀致的,但提供的节点不⼀致;

说明基于 Redis 方式共享 tomcat session 配置成功;

[root@redis ~]# redis-cli -a "123456"
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> flushall   #清空session数据
OK

8、源码包-jar包-war包区别

参考说明:https://www.baeldung-cn.com/java-jar-war-packaging

jar包方式直接运行参考: