tomcat的一些配置

一台主机nginx做代理,两台tomcat主机做负载均衡
首先两台tomcat主机安装对应的安装包
yum install -y java-1.8.0-openjdk-devel tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp
修改tomcat_users.xml增加三段,以便使用自带的两个应用

<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user name="admin" password="admin" roles="admin-gui,manager-gui"/>

在tomcat服务器上创建一个应用

mkdir -pv /var/lib/tomcat/webapps/test/{WEB-INF,META-INF,calsses,lib}
然后创建应用程序jsp文件
在A主机上

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

在B主机上
            <%@ page language="java" %>
                    <html>
                        <head><title>TomcatB</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> 

在httpd代理服务器上配置httpd服务

基于httpd的代理
<VirtualHost *:80>
        ServerName  node1.lvqing.com
        ProxyRequests Off #关闭正向代理
        ProxyVia on #是否在响应报文中加via
        ProxyPreserveHost On #是否将请求报文首部一并转给后端
                <Proxy *>
                        Require all granted
                </Proxy>
        ProxyPass / http://192.168.31.200:8080/ #把根反代给指定主机
        ProxyPassReverse / http://192.168.31.200:8080/ #如果后端主机返回重定向>是否让客户端知道
                <Location />
                        Require all granted
                </Location>
</VirtualHost>

访问没有问题


换一种代理方式ajp代理,使用前可使用httpd -M查看是否启用proxy-ajp模块,没有的话需要手动加载
注意:ajp的代理端口是8009

          <VirtualHost *:80>
                ServerName     node2.lvqing.com             ProxyRequests Off
                ProxyVia        On
                ProxyPreserveHost On
                <Proxy *>
                    Require all granted
                </Proxy>
                    ProxyPass / ajp://192.168.31.200:8009/ 
                    ProxyPassReverse / ajp://192.168.31.200:8009/ 
                <Location />
                    Require all granted
                </Location>
            </VirtualHost>

同样代理到了,ajp代理相对于httpd代理更安全,客户端除非经过代理服务器否则无法与tomcat通信


image.png

但是前面都没有实现负载均衡的功能,接下来我们来编辑配置
首先是nginx的负载均衡,编辑配置文件添加一段

upstream tcservs {
        hash $request_uri consistent; #使用uri一致性哈希算法保持会话粘性
        #hash $cookie_name consistent 对cookie做哈希也可以
        server 192.168.31.200:8080;
        server 192.168.31.201:8080;
    }
vim /etc/nginx/conf.d/lvqin.conf
server {
        listen 80;
        server_name node1.lvqing.com;

        location / {
                proxy_pass http://tcservs;
        }
}

然后是httpd的负载均衡需要proxy_balancer_module模块
balancer的详细语法可以查看http://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
#相当于在cookie中加上ROUTEID以求实现session sticky
如果第一次访问的是tomcatA则下次再访问cookie会被注入route=TomcatA以便绑定
            <proxy balancer://tcsrvs>
                BalancerMember http://172.18.100.67:8080 route=TomcatA loadfactor=1
                BalancerMember http://172.18.100.68:8080 route=TomcatB loadfactor=2
                ProxySet lbmethod=byrequests
                ProxySet stickysession=ROUTEID
            </Proxy>



            <VirtualHost *:80>
                ServerName node1.lvqing.com                     
                ProxyVia On
                ProxyRequests Off
                ProxyPreserveHost On
                <Proxy *>
                    Require all granted
                </Proxy>
                ProxyPass / balancer://tcsrvs/
                ProxyPassReverse / balancer://tcsrvs/
                <Location />
                    Require all granted
                </Location>
             </VirtualHost> 

还可以启用balancer的管理接口

在上面定义的虚拟主机中添加
                <Location /bstatus>
                        SetHandler balancer-manager
                        ProxyPass !
                        Require all granted
                </Location>

可以看到图片


image.png

然后负载均衡的目的就达到了很简单,难题是如何保持会话,一共三种方式:

会话保持:
       (1) session sticky
           source_ip
               nginx: ip_hash
               haproxy: source
               lvs: sh
           cookie:
               nginx:hash 
               haproxy: cookie
       (2) session cluster:delta session manager
       (3) session server:redis(store), memcached(cache)

tomcat自己支持第二种会话集群的方式内部有一个cluster的组件,但这种方式只适用于较小规模的集群。
编辑两台主机的配置文件server.xml添加cluser组件
注意:cluster组件应当放在host或engine组件中,多播地址应该一致


        <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="225.0.0.4"
                                port="45564"
                                frequency="500"
                                dropTime="3000"/>
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                                address="auto"
                                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>

这样子我们前端代理的会话绑定就可以取消了
注意:绑定的地址为auto时,会自动解析本地主机名,并解析得出的IP地址作为使用的地址;

需要为test提供一个web.xml配置文件并添加上distribution,属性,意思是为test做分布式会话
因为这个test是我们自己创建的没有web.xml所以复制一个到/var/lib/tomcat/webapps/test/WEB-INF中添加一段<distributable/>
查看TomCatA的日志信息可以发现B已经成问会话集群的成员了

image.png

接下来不管我们代理到后端的哪一台主机但session的ID都不会变

httpd除了http,ajp还有第三种协议连接jk,但现在已经不怎么使用了,这里实验测试一下安装httpd第三方模块提供服务

得到源码
tar xvf tomcat-connectors-1.2.40-src.tar.gz
./configure --with-apxs=/usr/bin/apxs
安装时需要指定apxs的位置,这个服务是为httpd的第三方模块提供一个接口
make && make install
最后提示我们修改模块的执行权限,照做
chmod 755 /usr/lib64/httpd/modules/mod_jk.so
但现在还不会自动装载进去,需要我们手动编辑一个模块加载文件
vim /etc/httpd/conf.modules.d/mod_jk.conf
loadModule jk_module /usr/lib64/httpd/modules/mod_jk.so

然后我们httpd -M就可以看到这个模块了


image.png

接下来我们实验使用memcache来做第三方会话管理器msm
在两台tomcat主机上安装memcache,然后去网站上下载管理器软件http://repo1.maven.org/maven2/de/javakaffee/msm/
下载后的jar类文件放在tomcat的类文件目录即可
/user/share/java/tomcat
然后修改server.xml文件在host或者context中添加一个manager

<Context path="/var/lib/tomcat/webapps/test" docBase="/var/lib/tomcat/webapps/test" reloadable="true">                                
              <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                memcachedNodes="n1:192.168.31.200:11211,n2:192.168.31.201:11211"
                failoverNodes="n2"
                requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
                transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
              />
             </Context>
ls
javolution-5.5.1.jar
memcached-session-manager-1.8.2.jar
memcached-session-manager-tc7-1.8.2.jar
msm-javolution-serializer-1.8.2.jar
spymemcached-2.10.2.jar
#全都放在/user/share/java/tomcat文件中
mv *.jar /user/share/java/tomcat

启动tomcat后接下来我们就可以看到实验效果了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,509评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,806评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,875评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,441评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,488评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,365评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,190评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,062评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,500评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,706评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,834评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,559评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,167评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,779评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,912评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,958评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,779评论 2 354

推荐阅读更多精彩内容