tomcat

作者: 不知岁月惜 | 来源:发表于2017-12-12 21:54 被阅读0次

    在centos7.3虚拟机环境下

    nginx服务器
    www      172.18.70.60
    
    tomcat服务器
    node1    172.18.70.40
    node2    172.18.70.50
    
    同步时间
    dns解析
    

    yum 源安装: 端口号(http协议端口:8080、管理接口:8005、AJP协议端口:8009)

    [root@node1 ~]#yum -y install java-1.8.0-openjdk-devel tomcat tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
    

    手动提供一测试类应用,并冷部署:

    [root@node1 ~]#mkdir -pv /usr/share/tomcat/webapps/myapp/{lib,classes,WEB-INF}
    [root@node1 ~]#vim /usr/share/tomcat/webapps/myapp/index.jsp
    
    <%@ page language="java" %>
    <html>
            <head><title>TomcatA</title></head>
            <body>
                    <h1><font color="red">TomcatA.magedu.com</font></h1>     首部是红色的
                    <table align="centre" border="1">
                            <tr>
                                    <td>Session ID</td>
                            <% session.setAttribute("magedu.com","magedu.com"); %>
                                    <td><%= session.getId() %></td>
                            </tr>
                            <tr>
                                    <td>Created on</td>
                                    <td><%= session.getCreationTime() %></td>
                            </tr>
                    </table>
            </body>
    </html>
    
    [root@node2 ~]#mkdir -pv /usr/share/tomcat/webapps/myapp/{lib,classes,WEB-INF}
    [root@node2 ~]#vim /usr/share/tomcat/webapps/myapp/index.jsp
    
    <%@ page language="java" %>
    <html>
            <head><title>TomcatA</title></head>
            <body>
                  <h1><font color="blue">TomcatB.magedu.com</font></h1>     首部是蓝色的
                    <table align="centre" border="1">
                            <tr>
                                    <td>Session ID</td>
                            <% session.setAttribute("magedu.com","magedu.com"); %>
                                    <td><%= session.getId() %></td>
                            </tr>
                            <tr>
                                    <td>Created on</td>
                                    <td><%= session.getCreationTime() %></td>
                            </tr>
                    </table>
            </body>
    </html>
    

    配置调度器nginx
    配置nginx

    [root@www /etc/nginx]#vim nginx.conf
    
     default_type        application/octet-stream;
        upstream tcsrvs {      定义服务器组
            server 172.18.70.40:8080;
            server 172.18.70.50:8080;
            }
    
            location / {
                    proxy_pass http://tcsrvs;   传递后端服务器地址
            }
    
    [root@www /etc/nginx]#nginx -t
    [root@www /etc/nginx]#systemctl start nginx
    由于网页有缓存,有时刷不出来最好使用curl 命令看到更清楚
    [root@www /etc/nginx]#for i in {1..10}; do curl -s http://172.18.70.60/myapp/index.jsp |grep -i tomcat ;done
    

    负载均衡效果没有问题了
    nginx转换成http测试下效果

    httpd + tomcat集群基于balancer实现

    [root@www /etc/nginx]#yum install httpd
    [root@www /etc/httpd/conf.d]#vim http-tomcat.conf     基于http模块反向代理的负载均衡配置
    <proxy balancer://tcsrvs>                                          
                                    BalancerMember http://172.18.70.40:8080      # loadfactor=1  添加权重
                                    BalancerMember http://172.18.70.50:8080      # loadfactor=2
                                    ProxySet lbmethod=byrequests    
                            </Proxy>
    
                            <VirtualHost *:80>
                                    ServerName www.centos.com
                                    ProxyVia On
                                    ProxyRequests Off
                                    ProxyPreserveHost On
                                    <Proxy *>
                                            Require all granted
                                    </Proxy>
                                    ProxyPass / balancer://tcsrvs/
                                    ProxyPassReverse / balancer://tcsrvs/
                                    <Location />
                                            Require all granted
                                    </Location>
                            </VirtualHost>
    
    [root@www /etc/httpd/conf.d]#httpd -t
    [root@www /etc/httpd/conf.d]#systemctl start httpd
    [root@www /etc/httpd/conf.d]#ss -ntl
    
    跟之前测试一样用curl测试相对准确点,页面访问有缓存不容易出效果
    [root@www /etc/httpd/conf.d]#for i in {1..10}; do curl -s http://172.18.70.60/myapp/index.jsp |grep -i tomcat ;done
    

    基于ajp模块实现会话粘性:

    [root@www /etc/httpd/conf.d]#killall httpd
    [root@www /etc/httpd/conf.d]#cp http-tomcat.conf ajp-tomcat.conf
    [root@www /etc/httpd/conf.d]#mv http-tomcat.conf{,.bak}
    
    [root@www /etc/httpd/conf.d]#vim ajp-tomcat.conf 
    
    <proxy balancer://tcsrvs>
            BalancerMember ajp://172.18.70.40:8009      # status=D 标记某个服务不可用   在A主机出现问题的时候,访问信息会调度到B主机
            BalancerMember ajp://172.18.70.50:8009       
            ProxySet lbmethod=byrequests
    </Proxy>
    
    <VirtualHost *:80>
            ServerName www.centos.com
            ProxyVia On
            ProxyRequests Off
            ProxyPreserveHost On
            <Proxy *>
                    Require all granted
            </Proxy>
            ProxyPass / balancer://tcsrvs/
            ProxyPassReverse / balancer://tcsrvs/
            <Location />
                    Require all granted
            </Location>
    </VirtualHost>
    
    [root@www /etc/httpd/conf.d]#systemctl restart httpd
    [root@www /etc/httpd/conf.d]#for i in {1..10}; do curl -s http://172.18.70.60/myapp/index.jsp |grep -i tomcat ;done
    

    启用管理接口:內建管理接口,专用于bakancer ,不要开放此端口给别人,http也可以使用,效果一样

    [root@www /etc/httpd/conf.d]#vim ajp-tomcat.conf 
    
    <proxy balancer://tcsrvs>
            BalancerMember ajp://172.18.70.40:8009
            BalancerMember ajp://172.18.70.50:8009
            ProxySet lbmethod=byrequests
    </Proxy>
    
    <VirtualHost *:80>
            ServerName www.centos.com
            ProxyVia On
            ProxyRequests Off
            ProxyPreserveHost On
            <Proxy *>
                    Require all granted
            </Proxy>
            ProxyPass / balancer://tcsrvs/
            ProxyPassReverse / balancer://tcsrvs/
            <Location />
                    Require all granted
            </Location>
    </VirtualHost>
                      #管理接口设置
    <Location /balancer-manager>
            SetHandler balancer-manager
            ProxyPass !
            Require all granted
    </Location>
    
    [root@www /etc/httpd/conf.d]#httpd -t
    [root@www /etc/httpd/conf.d]#systemctl reload httpd
    

    可以看到有两个后端主机状态

    LoadBalancer Status for

    被访问次数

    修改调度算法

     LoadBalancer Status for [balancer://tcsrvs] [p9f66a393_tcsrvs]
    
    [root@node1 /etc/tomcat]#vim server.xml
     <Engine name="Catalina" defaultHost="localhost" jvmRoute="tcA">        #jvmRoute="ctA"
    
    [root@node1 ~]#systemctl restart tomcat
    
    [root@node2 ~]#vim /etc/tomcat/server.xml
     <Engine name="Catalina" defaultHost="localhost" jvmRoute="tcB">        #jvmRoute="ctB"
    
    [root@node2 ~]#systemctl restart tomcat
    

    基于Cookie会话源地址绑定
    修改虚拟主机配置

    [root@www /etc/httpd/conf.d]#vim ajp-tomcat.conf
    
    添加响应报文首部,额外附加键值ROUTEID替换挑选出来的服务器 ,path=/是Cookie适用范围    什么时候修改对应值生效
    env=如果调度的后端服务器改变了,routeid就会发生改变,否则就不变就不做重新调度,后端服务器宕机了需要重新调度,
    后端服务器没有宕机ROUTEID值就不会变
    
    Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
    <proxy balancer://tcsrvs>
            BalancerMember ajp://172.18.70.40:8009 route=tcA        #route=tcA映射标识符
            BalancerMember ajp://172.18.70.50:8009 route=tcB
            ProxySet lbmethod=byrequests
            ProxySet stickysession=ROUTEID      定义基于什么绑定会话
    </Proxy>
    
    <VirtualHost *:80>
            ServerName www.centos.com
            ProxyVia On
            ProxyRequests Off
            ProxyPreserveHost On
            <Proxy *>
                    Require all granted
            </Proxy>
            ProxyPass / balancer://tcsrvs/
            ProxyPassReverse / balancer://tcsrvs/
            <Location />
                    Require all granted
            </Location>
    </VirtualHost>
    
    <Location /balancer-manager>
            SetHandler balancer-manager
            ProxyPass !
            Require all granted
    </Location>
    
    [root@www /etc/httpd/conf.d]#httpd -t
    [root@www /etc/httpd/conf.d]#systemctl reload httpd
    

    网页测试基于Cookie绑定成功 F12

    delta-manager实现会话复制集群实现
    配置启用集群,将下列配置放置于或中;

    [root@node1 ~]#vim /etc/tomcat/server.xml 
    
     <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
            <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                     channelSendOptions="8">
    
              <Manager className="org.apache.catalina.ha.session.DeltaManager"
                       expireSessionsOnShutdown="false"
                       notifyListenersOnReplication="true"/>
    
              <Channel className="org.apache.catalina.tribes.group.GroupChannel">
                <Membership className="org.apache.catalina.tribes.membership.McastService"
                            address="228.0.70.40"      修改默认多播地址
                            port="45564"
                            frequency="500"
                            dropTime="3000"/>
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                          address="172.18.70.40"        设置后端服务器地址 
     #获取本机地址,建议写固定IP,绑定的地址为auto时,会自动解析本地主机名,并解析得出的IP地址作为使用的地址
                          port="4000"
                          autoBind="100"
                          selectorTimeout="5000"
                          maxThreads="6"/>
    
                <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
                  <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
                </Sender>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>  
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>    "
              </Channel>
    
    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                     filter=""/>
              <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
    
              <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                        tempDir="/tmp/war-temp/"
                        deployDir="/tmp/war-deploy/"
                        watchDir="/tmp/war-listen/"
                        watchEnabled="false"/>
    
              <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>官网文档上面缺少" / "
              <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>官网文档上面缺少" / "
            </Cluster>
    
    [root@node1 ~]#scp /etc/tomcat/server.xml node2:/etc/tomcat/
    
    [root@node2 ~]#vim /etc/tomcat/server.xml
    
     <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
            <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                     channelSendOptions="8">
    
              <Manager className="org.apache.catalina.ha.session.DeltaManager"
                       expireSessionsOnShutdown="false"
                       notifyListenersOnReplication="true"/>
    
              <Channel className="org.apache.catalina.tribes.group.GroupChannel">
                <Membership className="org.apache.catalina.tribes.membership.McastService"
                            address="228.0.70.40"
                            port="45564"
                            frequency="500"
                            dropTime="3000"/>
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                          address="172.18.70.50"
                          port="4000"
                          autoBind="100"
                          selectorTimeout="5000"
                          maxThreads="6"/>
    
                <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
                  <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
                </Sender>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
              </Channel>
    
    <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                     filter=""/>
              <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
    
              <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                        tempDir="/tmp/war-temp/"
                        deployDir="/tmp/war-deploy/"
                        watchDir="/tmp/war-listen/"
                        watchEnabled="false"/>
    
              <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>官网文档上面缺少" / "
              <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>官网文档上面缺少" / "
            </Cluster>
    
    官方配置示例有语法问题,倒数2,3行行尾>前没有“/”符号,添加即可
    http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html
    配置webapps:将/etc/tomcat/WEB-INF/web.xml(tomcat yum安装路径)
    拷贝到当前使用的根目录下的WEB-INF下,
    编辑在<web-app配置段内添加<distributable/>元素;
    以上内容两台RS-tomcat配置相同,区别在与Receiver className下的address的ip需写RS本机地址。
    
    [root@node1 ~]#cp /etc/tomcat/web.xml /usr/share/tomcat/webapps/myapp/WEB-INF/
    [root@node1 ~]#vim /usr/share/tomcat/webapps/myapp/WEB-INF/web.xml
    [root@node1 ~]#systemctl restart tomcat
    
    [root@node2 ~]#cp /etc/tomcat/web.xml /usr/share/tomcat/webapps/myapp/WEB-INF/
    [root@node2~]#vim /usr/share/tomcat/webapps/myapp/WEB-INF/web.xml
    [root@node2 ~]#systemctl restart tomcat、
    

    重启tomcat服务
    测试发现尽管负载均衡切换了主机,但是session不会改变


    使用msm实现session服务器实现:
    http+tomcat7+memcached集群

    memcached

    安装memcached
    [root@node1 ~]#yum install memcached -y
    [root@node1 ~]#systemctl start memcached.service
    [root@node1 ~]#yum -y install libmemcached    专用克隆工具
    [root@node1 ~]#lftp 172.18.0.1/pub    需要安装的jar    
    cd ok, cwd=/pub
    lftp 172.18.0.1:/pub> cd Sources/7.x86_64/msm/
    lftp 172.18.0.1:/pub/Sources/7.x86_64/msm> ls
    -rw-r--r--    1 0        0          452748 Aug 21 09:14 javolution-5.4.3.1.jar
    -rw-r--r--    1 0        0          147025 Aug 21 09:14 memcached-session-manager-1.8.3.jar    
    -rw-r--r--    1 0        0           11284 Aug 21 09:14 memcached-session-manager-tc7-1.8.3.jar    
    -rw-r--r--    1 0        0           10407 Aug 21 09:14 memcached-session-manager-tc8-1.8.3.jar
    -rw-r--r--    1 0        0           71051 Aug 21 09:14 msm-javolution-serializer-1.8.3.jar
    -rw-r--r--    1 0        0          459447 Aug 21 09:14 spymemcached-2.11.1.jar   
    lftp 172.18.0.1:/pub/Sources/7.x86_64/msm> mget *
    
    [root@node1 ~]#cp *.jar /usr/share/java/tomcat/    添加缓存会话管理器到Tomcat
    [root@node1 ~]#scp *.jar node2:/usr/share/java/tomcat/
    [root@node1 ~]#systemctl stop tomcat
    [root@node1 ~]#vim /etc/tomcat/server.xml        删除原有的Cluster
    
     <Host name="localhost"  appBase="webapps"
                 unpackWARs="true" autoDeploy="true">
     编辑server.xml文件Host上下文中定义context
     <Context path="/myapp" docBase="myapp" reloadable="ture" >
       <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
         memcachedNodes="m1:172.18.70.40:11211,m2:172.18.70.50:11211"
         failoverNodes="m2"    node1宕机了node2就接替工作
         requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
         transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
         />
     </Context>
    

    搭建Java 开源博客 Solo
    下载安装包

    将war包发布到tomcat服务器的webapps目录下    solo-2.4.0.war
    [root@node1 ~]#cp solo-2.4.0.war /usr/share/tomcat/webapps/      自动解压
    [root@node1 ~]#scp /etc/tomcat/solo-2.4.0.war node2:/usr/share/tomcat/webapps/      复制到node2 tomcat机器上面
    [root@node1 ~]#vim /etc/tomcat/server.xml
    <Context path="/solo-2.4.0" docBase="solo-2.4.0" reloadable="ture" >    修改路径文件名字    node2也做修改
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
          memcachedNodes="m1:172.18.70.40:11211,m2:172.18.70.50:11211"
          failoverNodes="m2"
          requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
          transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
         />
     </Context>
    
    [root@node1 ~]#vim /usr/share/tomcat/webapps/solo-2.4.0/WEB-INF/classes/latke.properties
    
    #### Server ####
     # Browser visit protocol
     serverScheme=http
     # Browser visit domain name
     serverHost=172.18.70.40          修改成本主机ip       node2也进行修改
     # Browser visit port, 80 as usual, THIS IS NOT SERVER LISTEN PORT!
     serverPort=8080
     
    #### Cookie ####
    cookieName=solo
    cookieSecret=Beyond
     
    #### Runtime Mode ####
    #runtimeMode=DEVELOPMENT
     runtimeMode=PRODUCTION
    

    [root@node1 ~]#systemctl restart tomcat
    测试输入 tomcat 主机ip,文件存放路径

    测试www代理服务器

    测试成功
    OK

    相关文章

      网友评论

          本文标题:tomcat

          本文链接:https://www.haomeiwen.com/subject/wcqrmxtx.html