nginx+tomcat在一台服务器上实现负载均衡

本文介绍了如何在一台服务器上通过nginx实现tomcat的负载均衡,并详细阐述了配置过程,包括nginx.conf的修改和tomcat的session持久化设置。此外,还涉及了redis的安装和配置,以解决session共享问题。

为什么要这么做

      源于最近一个新项目上线运行,项目初期的磨合阶段,问题肯定源源不断,版本迭代也就比较频繁,但是为了不影响用户使用,只能选择大半夜更新(大家都睡了,唯有你挑灯夜战),为了保证睡眠,自然就得想解决方案了。

准备阶段

       服务器系统:ubuntu14.04

       tomcat版本:tomcat7

       nginx

       1)由于项目是基于tomcat运行的,那么首先我们需要在服务器上安装两个tomcat,官网下载tar.gz包,拷贝到服务器的两个文件夹下解压即可(这个文件夹的位置,名称可按照自己的习惯随意创建)。

       2)解压之后,其中一个tomcat保持不动,另一个需要修改conf文件夹下server.xml文件中四个端口。

          8005:负责监听关闭tomcat的请求

          8080:服务器连接器的端口号,该连接器将在指定端口侦听来自客户端的请求

          8009:负责和其他HTTP服务器建立连接,把Tomcat和其他http服务器集成时需要用到此连接器

          8443:服务器扎鞥在处理http请求时收到一个SSL传输请求后重定向的端口号

           本人的习惯都是在原来的基础上加1

       3)安装nginx,直接apt -get即可安装

配置阶段

       1)nginx配置

               修改etc/nginx目录下的nginx.conf文件,在http{}中增加如下内容:

                upstream tomcat {

                       #ip_hash

                        server  localhost:8080 weight=1;

                        server  localhost:8081 weight=1;

                }

                server {

                         listen 89;

                         server_name localhost 127.0.0.1;                        

                         location / {

                                   location ~*/项目名/  {

                                            proxy_next_upstream  http_502 http_504 error timeout invalid_header;

                                            proxy_set_header Host $host:89;

                                            proxy_set_header X-Forwarded-For  $remote_addr;

                                             proxy_pass http://tomcat;

                                   }

                          }

                }

        以上配置有两点需要注意的

        A.反向代理的地址与upstream命名的需保持一致;

        B.当你不想使用nginx默认的80端口时,$host后面必须显式的加上端口号,否则你会发现你的项目跑不起来。

                

       有很多人建议自己新增加一个conf文件,不要再原来的文件中修改,这也是个很好的提议,避免改动比较乱造成不必要的麻烦。

       好了,至此负载均衡已经实现,但是这并不能解决问题,我们的session呢,停了一个服务,session就没了,这时候我们就要来实现session的持久化了。

         2) tomcat的session赋值

          修改tomcat安装路径conf文件夹下的server.xml文件

           在<Engine name= "Catalina" defaultHost="localhost">下方增加如下内容:

          <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"  channelSendOptions="8">
                <Manager className="org.apache.catalina.ha.session.DeltaManager"
                        expireSessionOnShutdown="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"
                         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>

        另个tomcat的server.xml均需要修改,Receiver的port端口需设置的不一样,老习惯,我又是加1.

       同时项目的web.xml需增加<distributable>以支持集群。    

       配置完成了,下一步是要改成用redis。


----------------------------------------分割线----------------------------------------------

redis安装

1.ubutun命令行直接从官网下载

      wget  http://download.redis.io/releases/redis-4.0.2.tar.gz

2.解压后,进入目录编译

    cd redis-4.0.2

    make

3.安装

    make install

4.运行测试

    make test 

    运行时可能会报错:You need tcl 8.5 or newer in order to run the Redis test需要安装tcl

     1)wget  http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz

     2)解压 tar xzcf tcl8.6.1-src.tar.gz

     3) cd /usr/local/tcl8.6.1/unix

     4) sudo ./configure

     5) sudo make

     6) sudo make install

    还会有其他的报错,但是我都没管(2017-11-6 目前是菜鸟,redis的具体使用还不了解,所以出了错也没管,反正后面的session共享可以实现了)


开启redis

make之后,在redis-4.0.2/src目录下会出现redis-server服务程序和redis-cli客户端程序,将redis-4.0.2/redis.conf复制到src目录下

1)启动服务端 ./redis-server redis.conf

打开另一个终端测试 ./redis-cli

测试运行  

127.0.0.1:6379>setname 111
OK
127.0.0.1:6379> get name
"111"
127.0.0.1:6379>

2)启动

make install之后会安装目录到/usr/local/bin下,新建一个/etc/redis目录,将配置文件redis.conf拷贝到该目录下,将daemonize no改为daemonize yes

执行命令

/usr/local/bin/redis-server /etc/redis/redis.conf   


redis配置

1.需要以下几个jar包

     

标红的jar包,需要将源码在自己需要的编译环境下编译成jar包,源码在github可以搜到

     如果是tomcat8,需要修改一下源码

    将 initializeSerializer()方法中如下语句:

     Loader loader = null;
        if (getContainer() != null) {
            loader = getContainer().getLoader();
        }

    替换成:

      Loader loader = null;
        Context context = this.getContext();
        if (context != null) {
            loader = context.getLoader();
        }

   将上述3个jar放在项目发布的tomcat文件夹的lib文件夹下,重新启动项目就配置成功了

2.要实现session共享,需要修改tomcat安装路径/conf/context.xml文件

  在<Context> </Context>之间增加如下内容:

   <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"  
         host="localhost"  
         port="6379"  
         database="0"  
         maxInactiveInterval="60" /> 


注意value和manger的classname哦,需要和tomcat-redis-session-manager-1.0.jar的名称一致

同时不要忘了redis的原理哦,session中的对象需要被序列化!

      






    

    

                

                 

           



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值