nginx+haproxy做负载均衡到后端2台tomcat服务器

1台nginx(haproxy)+2台tomcat主机做负载均衡
步骤1:拓扑图

tomcat A 主机的配置
安装必要的软件:
yum -y install java-1.8.0-openjdk-devel tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp

创建tomcat存放数据目录
mkdir -pv /data/webapps/ROOT/{classes,lib,WEB-INF,META-INF}
具体目录的说明:

WEB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和context.xml配置文件;
META-INF/:类似于WEB-INF/;
classes/:类文件,当前webapp所提供的类;
lib/:类文件,当前webapp所提供的类,被打包为jar格式;
配置tomcat的文件server.xml

配置主配置文件
vim /etc/tomcat/server.xml 中的<host>标签中添加如下配置,该配置主要是配置tomcat主机的路径、主机名以及日志格式

  <Host name="www.ilinux.io" appBase="/data/webapps" unpackWARs="true" autoDeploy="true" >
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="ilinux_access_log." suffix=".log"
               pattern="%h %l %u %t "%r" %s %b" />
        </Host>

添加tomcatA的测试文件
vim /data/webapps/ROOT/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>

为了测试方便,把默认的测试目录修改下路径
cp -r /data/webapps/ROOT/ /usr/share/tomcat/webapps/test
重启tomcat服务
systemctl start tomcat
查看下端口是否开启
ss -tnl

tomcatB 主机的配置和comcatA一样,此处省略

测试主页
输入ip地址为:192.168.100.205/test

到此,两台tomcat主机已经配置完成!

使用haproxy做负载均衡

安装haproxy
yum -y install haproxy
配置haproxy.cfg
vim /etc/haproxy/haproxy.cfg 添加如下内容,即可!

frontend http-in
    bind *:80
    default_backend appsrvs # 定义默认后端服务
backend appsrvs
    balance roundrobin    #轮询
        server  app1 192.168.100.203:8080 check  #开启健康检查
        server  app2 192.168.100.204:8080 check  #开启健康检查

listen stats   #开启状态管理接口
    bind *:9009
    stats enable

启动haproxy服务
systemctl start haproxy
查看端口
ss -tnl
80和9009端口启动证明服务正常。

测试,输入如下ip地址:192.168.100.205/test
查看状态页输入地址:192.168.100.205:9009/haproxy?stats 即可

使用nginx做负载均衡

安装nginx服务
yum install nginx
配置配置文件
vim /etc/nginx/conf/nginx.conf 增加一组webapps即可

    upstream appsrvs {
        server 192.168.100.203:8080;
        server 192.168.100.204:8080;
 }

启动服务
systemctl start nginx
查看端口
ss -tnl

http负载均衡实验(有两种方式:http模式和ajp模式 )

首先使用httpd做负载均衡

安装httpd服务
yum install httpd -y
配置httpd服务 ,新建一个虚拟主机

vim /etc/httpd/con.d/comcat-httpd.conf 添加如下配置

            <proxy balancer://appsrvs>
                BalancerMember http://192.168.100.203:8080
                BalancerMember http://192.168.100.204:8080
                ProxySet lbmethod=byrequests
            </Proxy>

            <VirtualHost *:80>
                ServerName  www.ilinux.io
                ProxyRequests Off
                ProxyVia        On
                ProxyPreserveHost On
                <Proxy *>
                    Require all granted
                </Proxy>
                ProxyPass / balancer://appsrvs/
                ProxyPassReverse / balancer://appsrvs/
                <Location />
                    Require all granted
                </Location>
            </VirtualHost>

启动httpd服务
systemctl start httpd
测试:输入ip地址:192.168.100.205/test

ajp模式的负载均衡

修改配置文件

vim /etc/httpd/http.d/tomcat.ajp.conf
            <proxy balancer://appsrvs>
                BalancerMember ajp://192.168.100.203:8009
                BalancerMember ajp://192.168.100.204:8009
                ProxySet lbmethod=byrequests
            </Proxy>

            <VirtualHost *:80>
                ServerName  www.ilinux.io
                ProxyRequests Off
                ProxyVia        On
                ProxyPreserveHost On
                <Proxy *>
                    Require all granted
                </Proxy>
                ProxyPass / balancer://appsrvs/
                ProxyPassReverse / balancer://appsrvs/
                <Location />
                    Require all granted
                </Location>
            </VirtualHost>
注意:端口一定要写出8009,否则方向代理不到后端服务器

使用cookie实现sessions绑定

在tomcat-apj-conf 中添加一些配置即可

vim /etc/httpd/conf.d/tomcat-ajp.conf



Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED  新增加的信息   
                        <proxy balancer://appsrvs>
                                BalancerMember ajp://192.168.100.203:8009 route=TomcatA  新增加的信息
                                BalancerMember ajp://192.168.100.204:8009 route=TomcatB 新增加的信息
                                ProxySet lbmethod=byrequests
                                ProxySet stickysession=ROUTEID  新增加的信息
                        </Proxy>

                        <VirtualHost *:80>
                                ServerName  www.ilinux.io
                                ProxyRequests Off
                                ProxyVia        On
                                ProxyPreserveHost On
                                <Proxy *>
                                        Require all granted
                                </Proxy>
                                ProxyPass / balancer://appsrvs/
                                ProxyPassReverse / balancer://appsrvs/
                                <Location />
                                        Require all granted
                                </Location>
                        </VirtualHost>

如果需要启动管理接口功能,在以上配置下添加如下配置。

                <Location /balancer-manager>
                    SetHandler balancer-manager
                    ProxyPass !
                    Require all granted
                </Location> 

以下为:管理接口的图形界面

使用session culster 做会话绑定

在原有的tomcatA的server.xml 配置中,把配置放置在host标签中

<Engine name="Catalina" defaultHost="localhost" "> 中添加如下信息jvmRoute="tcA"
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tcA">

vim /etc/tomcat/server.xml
        <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="192.168.100.203"  atuo改成本地对外的通讯地址 
                      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>

为了安全,需要把web.xml 文件放在下如下目录,
cp /etc/tomcat/web.xml /usr/share/tomcat/webapps/test/WEN-INF目录中,WEN-INF目录私有目录,在web.xml中添加如下一行配置,是为了能够两个后端的两台tomcat可以同步数据。
编辑该文件

vim web.xml  
在<server>标签外添加一行信息;        <distributable/>即可

在tomcatB 中配置也需要添加<distributable/>信息。
在浏览器中输入:http://192.168.100.205/test 做测试,结果如下:

负载均衡两个节点都可以保持session一致。

使用memcache做session服务器

拓扑图如下:


下载如下jar文件至各tomcat节点的tomcat安装目录下的/usr/share/java/tomcat/
目录中,其中的${version}要换成你所需要的版本号,tc${6,7,8}要换成与tomcat版本相同的版本号。
这里我使用的是tomcat7.0 ,其他没有版本对应要求,需要的软件包如下


memcached-session-manager-${version}.jar
    memcached-session-manager-tc7-${version}.jar
    spymemcached-${version}.jar
    msm-javolution-serializer-${version}.jar
    javolution-${version}.jar

分别在两个tomcat上的某host上定义一个用于测试的context容器,并在其中创建一个会话管理器

        <Context path="/test" docBase="test" reloadable="true">
              <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
                memcachedNodes="n1:192.168.100.203:11211,n2:192.168.100.204:11211"
                failoverNodes="n1"
                requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
                transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
              />
        </Context>

配置完成,启动memcached服务
systemctl start memcached
在浏览器中输入测试地址:http://192.168.100.205/test
测试结果:nginx(haproxy)调度,都可以保持session。

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

推荐阅读更多精彩内容