• 【笔记】Tomcat 集群部署


    Tomcat快速入门

    Tomca基本介绍

    环境准备

    • JVM介绍
    • Java业务都是运行在java虚拟机上,java虚拟机简称JVM( java virtual machine)

    ​ 虚拟机是通过软件模拟出具有完整硬件系统的功能

    ​ 为什么Java需要JVM虚拟机

    ​ 早期C语言不支持跨平台,如果C语言想要在Windows Linux Mac上运行,需要进行分别编译,那么在Linux上有很多优秀的软件,如果需要在Windows上使用需要重新编译,移植性差

    而Java则不同,Java是可以跨平台,只需要将源码进行一次编译,能够在不同的操作系统运行

    JAVA是如何做到的?

    ​ 它只需要在Windwos Linux系统上运行一个jvm,这样我们能将Java编译好的war包在Windows和Linux平台运行起来,无需我们重复编译。而JVM是由jre提供

    JAVA环境JRE和JDK的区别

    jre是java的运行环境,包含jvm

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

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

    Tomcat

    Tomcat和Nginx类似,都是WEB服务器软件 只不过Tomcat是基于JAVA开发的WEB服务,主要解析JAVA代码

    Nginx仅支持静态资源解析,而Tomcat支持解析Java开发的WEB应用,还支持解析静态资源(效率不高)

    Nginx适合做前端负载均衡,Tomcat适合做后端应用服务处理

    通常情况企业会使用Nginx+Tomcat结合,Nginx处理静态资源,Tomcat处理动态资源

    在这里插入图片描述

    Tomcat快速安装

    安装jdk

    yum -y install java
    或者上传rpm包
    rpm -ivh  jdk....rpm
    
    • 1
    • 2
    • 3

    安装Tomcat

    (下载 Tomcat、解压、启动 )

    Tomcat官网: https://tomcat.apache.org/

    [

    root@web01 ~]#wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.58/bin/apache-tomcat-9.0.58.tar.gz --no-check-certificate
    
    [root@web01 ~]#`mkdir /soft`
    [root@web01 ~]#`tar xf  apache-tomcat-9.0.39.tar.gz  -C /soft/`
    [root@web01 ~]#` ln -s /soft/apache-tomcat-9.0.39/ /soft/tomcat`
    [root@web01 ~]# `/soft/tomcat/bin/startup.sh`     # 启动
    [root@web01 ~]# `/soft/tomcat/bin/shutdown.sh`	# 停止
    [root@web01 ~]# netstat -lntp |grep java
    
    tcp6    0    0 127.0.0.1:8005      :::*           LISTEN    6867/java       
    
    tcp6    0    0 :::8080            :::*           LISTEN    6867/java
    
    # 8080 对外提供服务的端口
    # 8005 关闭Tomcat端口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    配置systemc方式启动

    复制过来修改一下

    [root@web03 ~]# systemctl cat  nginx 
    
    • 1

    写入配置文件

    cat >/usr/lib/systemd/system/tomcat.service<<'EOF'
    [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
    ExecRetart=/soft/tomcat/bin/shutdown.sh  && sleep2  && /soft/tomcat/bin/startup.sh
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    启动

    [root@web03 ~]# systemctl daemon-reload  `#重新加载系统控制配置文件
    
    [root@web03 ~]# systemctl start  tomcat
    
    [root@web03 ~]# systemctl enable  tomcat
    
    Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /usr/lib/systemd/system/tomcat.service.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    配置文件

    配置文件

    tomcat软件目录结构:
    
    bin		      ---主要包含启动和关闭tomcat的脚本(启停java脚本依赖jar包文件)
    conf		    ---tomcat配置文件的目录(站点配置:server.xml)
    lib		      ---tomcat运行时需要加载的jar包
    logs		    ---tomcat日志存放位置
    temp		    ---tomcat临时存放文件路径
    webapps		  ---tomcat默认站点目录
    work		    ---tomcat运行时产生的缓存文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    配置文件详解-----> tomcat/conf/server.xml [📎server.xml]

    虚拟主机

    在这里插入图片描述

    cat   tomcat/conf/server.xml
    ...
    <Host name="diy.ahui.org"  appBase="/code/tomcat/diy" #代码目录
    	unpackWARs="true" autoDeploy="true"> #是否自动解包
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    	   prefix="diy_access_log" #日志名称 suffix=".txt"  #日志后缀名
    	   pattern="%h %l %u %t &quot;%r&quot; %s %b" /> #日志格式
    </Host>
    
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    自定义日志格式:
    在这里插入图片描述

    重新启动tomcat加载配置文件

    [root@web01 ]#  systemctl restart tomcat
    
    • 1

    创建网页测试

    [root@web01 ]#  mkdir /code/tomcat/diy/ROOT -p
    [root@web01 ]#  echo "tomcat-diy" > /code/tomcat/diy/ROOT/index.html
    
    • 1
    • 2

    解析host 浏览器访问

    Tomcat HTTP请求过程

    在这里插入图片描述

    Ps: tomcat中Context的作用:

    ...
    <Host >
    <!--访问/tt这个uri,上 / code/tt中获取页面资源,不存在该目录会报错 无法启动Tomcat 需要提前创建-->
    <Context docBase=" / code/tt" path="/tt" reloadable="true" />
    </Host>
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    context作用:----> 类似于nginx中的alias

    用户发出一个请求,如http://tomcat.ahui.com:8080/index.jsp

    Connector发现是http/1.1协议,而且还是8080端口,于是就把请求接收后交给符合条件的Engine

    Engine通过请求中的主机名tomcat.ahui.com查找满足条件的虚拟主机(Host)

    找到后就去此虚拟主机指定的appBase(代码存放的目录)最后将解析产生的结果返回给用户。

    Tomcat管理页面

    在这里插入图片描述
    Tomcat自带的管理页面
    管理功能
    监控功能

    1.所有的管理页面,都将权限赋予给了角色,而角色的名称是固定的: manager-gui admin-gui
    2.需要添加一个用户,将用户捆绑至对应的角色,这样用户就可以访问到对应的页面

    [root@web01 ROOT]# 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.由于项目默认允许127.0.0.1访问,所以配置好了角色和用户也无法正常访问:

    [root@web01 ROOT]# vim /soft/tomcat/webapps/host-manager/META-INF/context.xml
    [root@web01 ROOT]# vim /soft/tomcat/webapps/manager/META-INF/context.xml
    
    • 1
    • 2

    默认状态

    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
             allow="\d+\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
    
    • 1
    • 2

    修改后的状态:10.0.0.\d

    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
             allow="\d+\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
    
    • 1
    • 2

    4.重启tomcat并访问

    在这里插入图片描述

    Tomcat部署zrlog项目

    1.定义虚拟主机

    vim /soft/tomcat/conf/server.xml
    ...
     <!--站点zrlog.ahui.com-->
      <Host name="zrlog.ahui.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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    上传war包至指定目录

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

    [root@web01 conf]# mkdir /zrlog
    [root@web01 conf]# ll /zrlog/
    
    总用量 11316
    -rw-r--r-- 1 root root 11585583 5月  11 11:32 ROOT.war
    
    • 1
    • 2
    • 3
    • 4
    • 5

    重启tomcat应用

    [root@web01 conf]# /soft/tomcat/bin/shutdown.sh
    [root@web01 conf]# /soft/tomcat/bin/startup.sh
    
    • 1
    • 2

    在/zrlog目录下的解压.war包

    自动部署ROOT.war包 (自动生成ROOT目录)

    检查是否部署ok

    [root@web01 conf]# tail -f /soft/tomcat/logs/catalina.out
    11-May-2020 11:33:32.577 信息 [main] org.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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    配置远程数据库连接

    MariaDB [(none)]> create  database zrlog charset utf8;
    MariaDB [(none)]> grant all privileges on *.* to 'all'@'%' identified by 'xxxxxx';
    
    • 1
    • 2

    访问zrlog站点

    在这里插入图片描述

    Tomcat集群实战

    tomcat集群架构图解

    在这里插入图片描述

    lb0110.0.0.6 172.16.1.6
    web1172.16.1.7
    web2172.16.1.8
    其他后端节点

    安装tomcat

    [root[@web02 ~]# `yum install java -y`
    
    • 1

    拷贝代码和文件 (注意是在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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    web02操作如下

    [root[@web02 ]# ln -s /soft/apache-tomcat-9.0.34/ /soft/tomcat
    [root@web02 ~]# systemctl daemon-reload
    [root@web02 ~]# systemctl start tomcat
    [root@web02 ~]# systemctl enable tomcat
    Created symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /usr/lib/systemd/system/tomcat.service.
    
    • 1
    • 2
    • 3
    • 4
    • 5

    共享静态资源

    [root@web02 ~]# `yum install nfs-utils -y
    [root[@nfs ](https://www.yuque.com/nfs) ~]# `cat /etc/exports`
    /data/blog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
    /data/zrlog 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
    [root[@nfs ~]# mkdir /data/zrlog
    [root[@nfs ~]# chown -R www.www /data/zrlog/
    [root[@nfs ~]# systemctl restart nfs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    所有web节点都需要挂载

    mount -t nfs 172.16.1.31:/data/zrlog /zrlog/ROOT/attached/
    
    • 1

    重启tomcat

    [root@web01 ~]# `/soft/tomcat/bin/shutdown.sh && /soft/tomcat/bin/startup.sh`
    
    • 1

    注意: 在Nginx做代理时 Nginx代理后端
    Nginx头部信息默认丢弃
    Nginx代理后端Tomcat 头部信息自动携带,不管前面任何域名解析到负载 始终携带代理文件的头部信息

    Nginx_proxy

    [root@lb01 ~]# cat /etc/nginx/conf.d/proxy_zrlog.ahui.com.conf
    upstream zrlog {
    	server 172.16.1.7:8080;
    	server 172.16.1.8:8080;
    }
    
    server {
    	listen 80;
    	server_name zrlog.ahui.com;
    
    
    	location / {
    		proxy_pass http://zrlog;    	#tomcat启动的java程序,可以直接通过proxy_pass进行负载均衡
    		include proxy_params;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    为tomcat日志,获取http的Header信息

    ...
    
    <Host name="zrlog.ahui.org"  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  %{User-Agent}i %{X-Forwarded-For}i" />
    </Host>
    
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Tomcat+Nginx+HTTPS

    Tomcat单节点 -–【了解项-安装PFX格式证书

    修改tomcat配置: server.xml

    1. 首先需要有证书 ( 必须 )
    2. 将http的默认监听端口8080 修改为 80,redirect至 443
    3. 开启https监听器,配置证书即可。
    4. 将http强制跳转https ( tomcat操作,与nginx无关。)

    使用新机器web03演示

    [root @nfs ~]# `yum install java -y`
    [root @nfs ~](https://www.yuque.com/nfs) ~]# mkdir /soft
    [root @nfs ~](https://www.yuque.com/nfs) ~]# tar xf apache-tomcat-9.0.34.tar.gz -C /soft/
    [root @nfs ~](https://www.yuque.com/nfs) ~]# ln -s /soft/apache-tomcat-9.0.34/ /soft/tomcat
    [root @nfs ~]# cat /soft/tomcat/conf/server.xml
    
    • 1
    • 2
    • 3
    • 4
    • 5

    修改 localhost

    <Host name="aliyun.ahui.com"  appBase="webapps"
    
    • 1

    全栈https

    web1web2lb3
    172.16.1.7172.16.1.810.0.0.5
    [root @lb01 conf.d]# cat /etc/nginx/conf.d/proxy_zrlog.ahui.com.conf
    
    
    upstream zrlog {
    	server 172.16.1.7:8080;
    	server 172.16.1.8:8080;
    }
    
    server {
    	listen 443 ssl;
    	server_name zrlog.ahui.com;
    	ssl_certificate ssl_key/server.crt;
    	ssl_certificate_key ssl_key/server.key;
    
    	#tomcat启动的java程序,可以直接通过proxy_pass进行负载均衡
    	location / {
    		proxy_pass http://zrlog;
    		include proxy_params;
    	}
    }
    
    server {
    	listen 80;
    	server_name zrlog.ahui.com;
    	return 302 https://$server_name$request_uri;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    Tomcat+Nginx+Redis会话保持

    多种会话方式:1.ip_hash 2.mysql 3.redis 4.tomcat自带的cluster session复制 ( 官方建议不要超过4个tomcat节点 )

    准备web01 和 web02

    1.配置虚拟主机 (所有节点都需要配置)

    [root@web02 ~]# vim /soft/tomcat/conf/server.xml
            <!--session.ahui.org-->
          <Host name="session.ahui.org"  appBase="/code/session"
                unpackWARs="true" autoDeploy="true">
          </Host>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.创建目录,编写代码(所有节点都需要配置)

    [root@web02 ~]# mkdir /code/session/ROOT -p
    [root@web02 ~]# vi /code/session/ROOT/index.jsp
    <body>
    	<%
    	//HttpSession session = request.getSession(true);
    	System.out.println(session.getCreationTime());
    	out.println("<br> web01/WEB2 SESSION ID:" + session.getId() + "<br>");
    	out.println("Session created time is :" + session.getCreationTime()
    	+ "<br>");
    	%>
    </body>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3.接入负载均衡

    [root @lb01 conf.d]# cat >/etc/nginx/conf.d/proxy_session.ahui.com.conf<<'EOF'
    upstream session {
    	server 172.16.1.7:8080;
    	server 172.16.1.8:8080;
    }
    
    server {
    	listen 80;
    	server_name session.ahui.org;
    
    	location / {
    		proxy_pass http://session;
    		include proxy_params;
    	}
    }
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    无会话保持:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yx8tH4DY-1656649697317)(Tomcat 集群部署.assets/image-20210913161153434.png)]

    4.接入 TomcatClusterRedisSessionManager

    ( 参考官方地址: https://github.com/ran-jit/tomcat-cluster-redis-session-manager )

    0. [root@web01 ~]# wget https://github.com/ran-jit/tomcat-cluster-redis-session-manager/releases/download/4.0/tomcat-cluster-redis-session-manager.zip
    
    1.解压zip包   
    [root@web01 ~]# unzip tomcat-cluster-redis-session-manager.zip
    
    2.拷贝jars到tomcat的/lib目录中
    [root@web01 ~]# cp tomcat-cluster-redis-session-manager/lib/* /soft/tomcat/lib/
    
    3.拷贝conf下的redis.properties文件,到tomcat的conf文件
    [root@web01 ~]# cp tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties /soft/tomcat/conf/
    
    4.将配置文件中连接redis地址修改为如下地址即可
    [root@web01 ~]# vim /soft/tomcat/conf/redis-data-cache.properties
    redis.hosts=172.16.1.51:6379
    
    
    5.添加如下两行至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" />
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    Tomcat+Nginx+Redis+Java

    项目地址: https://gitee.com/mail_osc/wangmarket

    —> 已编译: git clone https://gitee.com/zheguabaoshu/tomcat-project-compilation.git

  • 相关阅读:
    字节跳动后端面经(17)
    Java题目汇总(二)
    中小型企业网络的组建
    MySQL数据类型介绍及使用场景
    【微信小程序】页面tab栏与页面内容联动
    【SQL报错注入】简介、相关函数、利用方法
    UNIX环境高级编程 第2章 UNIX标准化及实现
    PyQt5的安装
    科普:我就想写个爬虫,到底要学多少东西啊?
    数据结构-例题实训作业-二叉树相关
  • 原文地址:https://blog.csdn.net/AHui_CSDN/article/details/125556406