微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Nginx+Tomcat的Session集群与旁挂式memcached实现

自2006年后Sun分拆Java技术为三个方向:Java 2 SE(标准版)  Java 2 EE(企业版)  Java 2 ME(移动端)  

TOMCAT是Java 2 EE技术体系的不完整实现,很多API仍然不能和J2EE相比拟,由于Sun在后TOMCAT算是Apache基金会中和apache并驱前行的顶级项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。

但TOMCAT并非唯一的选择,因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的JAVA应用服务器。

商业实现:

WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss, ...

开源实现:

Tomcat, Jetty, Resin, ...

其中JSP在Tomcat中运行由jasper将.jsp内容自动转化为java代码并加载入类库

    .jsp -->jasper--> .java --> javac --> .class --> jvm 

   

   注意:基于jasper将静态输出的数据转为java代码进行输出,结果为servlet规范的代码

今天主要为了实现Tomcat的会话保持,也就是会话粘性,其实实现Tomcat Cluster或者TOmcat+memcached之前就有很多方法,但大体上分为

    代理端会话粘性:若其中一个代理出现问题,会话粘性单点失效

            Nginx: ip_hash

            haproxy: source

            lvs: sh

    集群会话同步:Tocmat会话两两互为同步,单并不适合大流量,Tomcat性能下降

            Tomcat: delta session manager

    会话共享:高效,但配置较为麻烦依赖于第三方插件,淡然还有很多方案,只是这里不一一推荐

            Tomcat+Memcached/Redis

今天主要研究Tomcat+Memcached

环境:

        192.168.2.128   node1   Nginx

        192.168.2.129   node4   Tomcat1

        192.168.2.130   node5   Tomcat2

 

 

安装Tomcat

    安装Tomcat之前首先安装jdk环境,jdk分为openjdk和Oracle jdk,OracleJDK作为openjdk的稳定功能收录版

yum安装方式:

yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel ##java-1.8.0-openjdk-devel中包含了一些jvm状态分析工具,比如jps和jstat  

yum install tomcat tomcat-lib tomcat-admin-webapps  tomcat-webapps tomcat-docs-webapp

          tar包安装:

                  安装JDK:

                        rpm -ivh jdk-8u201-linux-x64.rpm

                        cat /etc/profile.d/jdk.sh 

                            export JAVA_HOME=/usr/java/default

                            export PATH=$JAVA_HOME/bin:$PATH

                        . /etc/profile.d/jdk.sh

                  安装Tomcat:

                        tar xf apache-tomcat-7.0.92.tar.gz -C /usr/local/

                        ln -s apache-tomcat-7.0.92 tomcat

                        cat tomcat.sh 

                            export TOMCAT_HOME=/usr/local/tomcat

                            export PATH=$TOMCAT_HOME/bin:$PATH

                        . /etc/profile.d/tomcat.sh

         配置Tomcat,编写jsp

         mkdir -pv /usr/local/tomcat/webapps/test/{classes,lib,meta-inf,WEB-INF}
         vim /usr/local/tomcat/webapps/test/index.jsp

                <%@ page language="java" %>
                <html>
                        <head><title>TomcatB</title></head>
                                <body>
                                <h1><font color="blue">TomcatB.ifan.com</font></h1>
                                <table align="centre" border="1">
                                        <tr>
                                                <td>Session ID</td>
                                        <% session.setAttribute("ifan.com","ifan.com"); %>
                                                <td><%= session.getId() %></td>
                                        </tr>
                                        <tr>
                                                <td>Created on</td>
                                                <td><%= session.getCreationTime() %></td>
                                        </tr>
                                </table>
                                </body>
                </html>

            检查配置文件

                [root@node2 test]# catalina.sh configtest

            启动服务:

                [root@node2 test]# catalina.sh start

            检查端口:8080  8009  8005(启动较慢)

            分别访问192.168.2.129:8080和192.168.2.130:8080以及http://url:8080/test正常即可

        由于与TOMCAT认通讯的方式有两种:

                http协议(认8080端口)支持Nginx,apache等http协议前端服务器

                ajp协议(认8009端口)仅Apache支持,如果不使用则可以关闭

            另外的8005端口为Tomcat的管理端口,据说还有jk的链接方式,不过这个项目好像已经被apache基金会废弃了,不在研究

        

安装Nginx

    安装Nginx

        yum install Nginx -y
        cat /etc/Nginx/conf.d/http-tomcat.conf

    配置Nginx服务:

        [root@node1 ~]# cat /etc/Nginx/conf.d/Nginx_tomcat.conf 
            upstream tcsrv {
            #    ip_hash;               ##这里采用Tomcat Cluster的会话复制来实现就不再使用ip_hash,使用基本轮训即可
                server 192.168.2.129:8080 weight=1;
                server 192.168.2.130:8080 weight=1;
            }
            
            server{
                    listen 80;
                    server_name http.ilinux.io;
                    proxy_set_header X-Forwarded-For $remote_addr;      ##将用户客户端真实IP传递给Tomcat,httpd2.4无需配置透传,Tomcat自动获得的就是真实IP
                    location / {
                    proxy_pass http://tcsrv;
                    }
            
            }

    配置ubuntu本地hosts:

        ifan@ifan-PC:~$ cat /etc/hosts

            127.0.0.1 localhost

            0.0.0.0 account.jetbrains.com 

            127.0.1.1   ifan-PC

            192.168.2.128 http.ilinux.io ajp.ilinux.io

    测试访问:

            http://http.ilinux.io   能够轮训看到TomcatA和B即可

Tomcat Cluster集群会话同步配置:

        编辑集群内每台tomcat主配置文件server.xml在需要配置的Host标签添加

                <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.0.4"         <!-- 在同一个组播地址则认为在一个集群范围内 -->
                                port="45564"
                                frequency="500"
                                dropTime="3000"/>
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                        address="auto"          <!-- auto需要将本机主机名在本机的hosts内做ip映射,否则会bind错误 -->
                        port="4000"
                        autoBind="100"
                        selectorTimeout="5000"
                        maxThreads="6"/>          <!-- 最大线程数,可以理解为集群服务器总数为N,则该值为N-1 -->

                <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>

        在test项目单独复制web.xml并在web-app标签内配置<distributable/>

                cp /usr/local/tomcat/conf/web.xml /usr/local/tomcat/webapps/test/WEB-INF/
                vim /usr/local/tomcat/webapps/test/WEB-INF/web.xml
                    <web-app>
                        ...
                        <distributable/>
                        ...
                    web-app/>

        配置tomcat主机对本机主机名hosts解析

            [root@node4 ~]# cat /etc/hosts

                192.168.2.129 node4

        

        检测配置:

            [root@node4 ~]# catalina.sh configtest

            [root@node4 ~]# catalina.sh start;tailf /usr/local/tomcat/logs/catalina.2019-02-22.log

        再次访问http://http.ilinux.io/test,可以留意到Session ID 是一致的,这就说明当前端HA/Nginx/LVS无论如何调度到集群中任何主机,那么会话都是持续保持的

        

image.png

image.png

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐