50. Tomcat 集群部署

1.JVM基本介绍

JAVA业务都是运行在java虚拟机上的,简称 jvm ( java virtual machine )

为什么java需要jvm虚拟机?

早期:

C语言 不支持跨域平台 (游戏)

Windows:在编译一次

MACOS:还需要编译

LINUX: 编译一次

可移植性比较的差。

JAVA: 可以做到一次编译,多处运行。

windows、linux、macos。

需要我们在操作系统上启动运行一个jvm虚拟机,这样我们将java编译好的war、jar包

在windows、linux、macos平台上运行起来。无需我们重复编译。

jvm是由谁提供的呢?

jre:java运行环境 java runtime environment,包含了jvm。

jdk:java开发环境 会包含java的运行环境 jre。(yum install java -y 会安装jdk)

如果我们只是单纯运行java代码,jre足够。 jdk。

2.Tomcat是什么,与Nginx的区别。

Tomcat是一个web服务,提供动态程序的解析(java),支持静态资源。

企业nginx+tomcat模型, nginx处理静态资源,tomcat处理动态资源(java),能加速网站的访问和降低访问的延迟。

Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

3.Tomcat安装、配置、启动

1.安装jdk

yum install java -y

2.安装Tomcat ( 下载 Tomcat、解压、启动 )

wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz
mkdir /soft
tar xf apache-tomcat-9.0.34.tar.gz -C /soft/
ln -s /soft/apache-tomcat-9.0.34/ /soft/tomcat

3.目录结构

bin 主要包含启动和关闭tomcat的脚本(启停java脚本依赖jar包文件)

  conf tomcat配置文件的目录

  lib tomcat运行时需要加载的jar包

  logs tomcat日志存放位置

  temp tomcat临时存放文件路径

  webapps tomcat默认站点目录

  work tomcat运行时产生的缓存文件

4.Tomcat的HTTP请求过程

img

img

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

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

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

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

4.使用tomcat部署web服务

  1. 定义虚拟主机
vim /soft/tomcat/conf/server.xml
    <!--站点zrlog.oldxu.com-->
  <Host name="zrlog.oldxu.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. 上传war包至指定目录
[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. 重启tomcat应用
1.自动加压.war包
2.自动部署,war包  (自动生成ROOT目录)
[root@web01 conf]# /soft/tomcat/bin/shutdown.sh
[root@web01 conf]# /soft/tomcat/bin/startup.sh
  1. 检查是否部署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

配置远程数据库连接信息

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

5.使用tomcat部署多节点web服务

web1 172.16.1.7

web2 172.16.1.8

1.安装tomcat

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

3.拷贝代码 (注意是在web01节点操作的)

[root@web01 ~]# scp -rp /soft root@10.0.0.8:/

[root@web01 ~]# scp -rp /zrlog root@10.0.0.8:/

4.web02操作如下

[root@web02 ~]# rm -rf /soft/tomcat/

[root@web02 ~]# ln -s /soft/apache-tomcat-9.0.34/ /soft/tomcat

5.共享静态资源。

yum install nfs-utils -y

[root@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

所有web节点都需要挂载

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

6.tomcat的base的基础认证

配置Tomcat网页管理页面。 ( nginx basic auth)

  1. vim /soft/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="oldxu" password="123456" roles="manager-gui,admin-gui"/>

  1. 还需要配置该项目的访问权限,因为Tomcat默认管理页面仅允许本机访问,如果希望其他网段能正常访问,需要配置允许规则。
    vim /soft/tomcat/webapps/manager/META-INF/context.xml
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+" />

  • 为zrblog添加/admin/添加base认证

1.需要找到项目下的WEB-INF/web.xml进行配置。(了解)

[root@es-node1 tomcat]# vim /zrlog/ROOT/WEB-INF/web.xml

<web-app>
...
    <security-constraint>
    <!--定义资源名称以及需要认证的url-->
        <web-resource-collection>
            <web-resource-name>zrlog</web-resource-name>
            <url-pattern>/admin/*</url-pattern>
        </web-resource-collection>
    
       <!--给对应资源关联角色名-->
        <auth-constraint>
            <role-name>zrlog_role</role-name>
        </auth-constraint>
    </security-constraint>
    
    <!--调用BASIC方法来实现认证-->
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>Default</realm-name>
    </login-config>
...
</web-app>

2.配置用户名密码,关联对应的角色(多个role不要使用相同用户)

[root@es-node1 tomcat]# vim /soft/tomcat/conf/tomcat-users.xml

<role rolename="zrlog_role"/>
<user username="tomcat" password="123456" roles="zrlog_role"/>

img

重启tomcat

[root@es-node1 ~]# /soft/tomcat/bin/shutdown.sh && /soft/tomcat/bin/startup.sh

7.java源码包、jar包、war包的关系、联系、区别?

1.什么是源码包?

由java工程师编写的java代码,称为java源码包。

编译( maven 方式去编译java的源代码 )

编译之后会得到一个包裹:

war jar

2.什么是war包?

由源码编译后生成的产物,可以直接放入 tomcat运行起来。( 比较广泛 )

3.什么是jar包?

由源码编译后生成的产物。

1.不能独立运行起来,它可能被某个java程序依赖运行。或者war包运行所依赖。

2.可独立运行起来的, java -jar xxx.jar 直接启动运行,无需tomcat

4.源码包、jar、war:

1.源码包编译后会产生war包、jar包

2.war通常是直接由tomcat运行启动,启动加载项目时会依赖一些jar包。

3.jar包,

分为不可独立运行(被java程序依赖运行、或者是被war包依赖运行)

分为可独立运行:可以直接对外提供服务。只需要有java环境即可。启动命令: java -jar xx.jar

8. tomcat集群部署

img

8.1 Nginx_proxy

[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_zrlog.oldxu.com.conf

upstream zrlog {
    server 172.16.1.7:8080;
    server 172.16.1.8:8080;
}

server {
    listen 80;
    server_name zrlog.oldxu.com;

    #tomcat启动的java程序,可以直接通过proxy_pass进行负载均衡
    location / {
        proxy_pass http://zrlog;
        include proxy_params;
    }
}

8.2 单节点Tomcat实现HTTPS ( 了解 )

1.修改tomcat配置: server.xml

0.首先需要有证书 ( 必须 )

1.将http的默认监听端口8080 修改为 80,redirect至 443

2.开启https监听器,配置证书即可。

3.将http强制跳转https ( tomcat操作,与nginx无关。)

使用新机器web03演示

[root@nfs ~]# yum install java -y

[root@nfs ~]# mkdir /soft

[root@nfs ~]# tar xf apache-tomcat-9.0.34.tar.gz -C /soft/

[root@nfs ~]# ln -s /soft/apache-tomcat-9.0.34/ /soft/tomcat

vim /soft/tomcat/conf/server.xml

    <Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="443" />

    <Connector port="443"
    protocol="HTTP/1.1"
    SSLEnabled="true"
    scheme="https"
    secure="true"
    keystoreFile="/ssl/3434295_aliyun.xuliangwei.com.pfx"
    keystoreType="PKCS12"
    keystorePass="OpI94943"
    clientAuth="false"
    SSLProtocol="TLSv1+TLSv1.1+TLSv1.2"
    ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_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"/> mkdir /ssl/------>>>放入证书

2.1 修改 localhost

<Host name="aliyun.xuliangwei.com"  appBase="webapps"

2.2 配置http跳转 https

在负载均衡上配置证书就可以实现全栈https

web1 web2 lb3
172.16.1.7 172.16.1.8 10.0.0.5

[root@lb01 conf.d]# cat /etc/nginx/conf.d/proxy_zrlog.oldxu.com.conf

upstream zrlog {
    server 172.16.1.7:8080;
    server 172.16.1.8:8080;
}

server {
    listen 443 ssl;
    server_name zrlog.oldxu.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.oldxu.com;
    return 302 https://$server_name$request_uri;
}

8.3 Nginx+Tomcat+Redis实现集群会话共享

多种方式:

1.ip_hash

2.mysql

3.redis

4.tomcat自带的cluster session复制 ( 官方建议不要超过4个tomcat节点 )

  • 准备web01 和 web02
    支持redis session共享----->>>下载 tomcat-cluster-redis-session-manager
  • 解压
    img
  • 1.拷贝所有的jar包
    [root@web01 ~]# cp tomcat-cluster-redis-session-manager/lib/* /soft/tomcat/lib/
  • 2.拷贝redis配置文件,并且更新redis配置文件
    [root@web01 ~]# cp tomcat-cluster-redis-session-manager/conf/redis-data-cache.properties /soft/tomcat/conf/
  • 3.Add the below two lines in your tomcat/conf/context.xml file.
  • 4.准备web01 和web02 一个session测试页面
  <!--站点session.oldxu.com-->
      <Host name="session.oldxu.com"  appBase="/session"
            unpackWARs="true" autoDeploy="true">
      </Host>

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

[root@web02 ~]# vi /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>

  • 5.接入负载均衡
    [root@lb01 conf.d]# cat /etc/nginx/conf.d/proxy_session.oldxu.com.conf
upstream session {
    server 172.16.1.7:8080;
    server 172.16.1.8:8080;
}

server {
    listen 80;
    server_name session.oldxu.com;

    location / {
        proxy_pass http://session;
        include proxy_params;
    }
}

建议:

1.先配置session的网站

2.搭建nginx+tomcat集群

3.测试访问,演示是否web01和web02的session不一致

4.接入redis,实现tomcat共享会话信息

5.再次测试,请求web01和web02 看session是否是一致的。

6.登陆redis查看是否存在对应的session的key

原文地址:https://www.cnblogs.com/hypj/p/13332275.html