• 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

  • 相关阅读:
    Java 对象和类
    Java main方法解释
    Android点击EditText文本框之外任何地方隐藏键盘的解决办法
    页面跳转回来之后,网络请求自动刷新
    《买红薯的故事》醍醐灌顶,警钟长鸣。
    字符串比较器,例如按照时间的升序降序,或者姓氏排序
    android中用Intent传数据,如果用传递的是一个类,就将类实现Parcelable接口
    view在使用shape属性加圆角的同时,用代码修改其他background属性(例如颜色)不生效
    android基础学习之布局
    详解安卓项目-闹钟
  • 原文地址:https://www.cnblogs.com/hypj/p/13332275.html
Copyright © 2020-2023  润新知