nginx+tomcat集群负载均衡实现session复制

架构描述
前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务(并对session处理),通过nginx转发到后面(注:没做动静分离,静态动态全部都转给tomcat――最好要做动静文件分离)
优点:实现了可弹性化的架构,在压力增大的时候可以临时添加tomcat服务器添加到这个架构里面去
一,配置nginx
1,  下载包
Wget  http://sysoev.ru/nginx/nginx-0.6.32.tar.gz
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/
http://nginx-upstream-jvm-route.googlecode.com/files/nginx-upstream-jvm-route-0.1.tar.gz
2,  安装nginx包并安装jvm_route( session复制用)包
    安装pcre
    tar zxvf pcre-7.2.tar.gz
    cd pcre
 ./configure  &&  Make && make install
b, 安装nginx
tar zxvf nginx-0.6.32.tar.gz
cd nginx-0.6.32
patch -p0 < ../nginx_upstream_jvm_route/jvm_route.patch 
./configure  --prefix=/usr/local/nginx --add-module=../../nginx_upstream_jvm_route --with-http_stub_status_module 
Make;make install
3,  修改配置文件
Vi /nginx/conf/nginx.conf
#用户组
user nobody nobody;                 
#cpu个数,可以按照实际服务器来计算
worker_processes  8;                
worker_rlimit_nofile 51200;         
events {
    use epoll;
#连接数
    worker_connections  8192 ;      
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    server_names_hash_bucket_size 128;
#    access_log  off;
#    access_log  logs/access.log;
#缓存的时间,(可以根据不同文件设置不同时间)
 #   expires           2h;      
    tcp_nodelay on;
    keepalive_timeout  30;      
    gzip  on;
    gzip_min_length  10;
    gzip_buffers     4 8k;
    gzip_http_version 1.1;
    gzip_types       text/plain application/x-javascript text/css text/html application/xml;
        sendfile         on;
        tcp_nopush       on;
        reset_timedout_connection  on;
     client_max_body_size 30m; 
#设定负载均衡列表
upstream  backend           
 {                      
server   172.23.254.2:8080 srun_id=a;  
server   172.23.254.3:8080 srun_id=b;
jvm_route $cookie_JSESSIONID reverse;
}
#设定虚拟主机
server {
        listen       80;
        server_name   www.abc.com;
#对 / 所有做负载均衡 (本机nginx采用完全转发,所有请求都转发到后端的tomcat集群)
       location / {       
        root /web/www ;
       index index.jsp index.htm index.html;
            proxy_redirect         off;
#保留用户真实信息
            proxy_set_header       Host $host;
              proxy_set_header  X-Real-IP  $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_pass  http://backend;   
       }
}
}
主要在配置proxy与upstream
Upstream具有负载均衡能力,可以自动判断下面的机器,并且自动踢出不能正常提供服务的机器。
4,启动程序
/nginx/sbin/nginx
    二,配置tomcat
1、安装tomcat 6.0(详情略)
 2,修改配置文件
            a,配置数据源
            b,优化tomcat最大并发数
                    <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="2048" minSpareThreads="100" maxSpareThreads="200"
               enableLookups="false" redirectPort="8443" acceptCount="500"
               connectionTimeout="20000" disableUploadTimeout="true" />
            c,添加虚拟主机
(注,主转发的虚拟主机必须用localhost,否则nginx不能通过内网ip转发,而只有通过域名转发
            d,测试
                打开 http://ip:8080 页面能访问则正常
三, 做tomcat集群――主要处理session复制
    两台机器 172.23.254.2  172.23.254.3
    做集群需要修改的文件配置有三个地方
    1,修改conf/server.xml配置文件
        a. 找到Engine标签,加入属性 jvmRoute="a"并添加tomcat/conf/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="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"/>
          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
          </Cluster>
     注释: 蓝色字体部分可以忽略掉(我的实验环境是在一个机器上安装了两个tomcat
3,  开启防火墙
这两个tomcat之间必须开启防火墙信任。
分别启动两个tomcat,查看每一个tomcat是否都启动了8080端口以及4001端口
再用netstat �Can 查看链接情况
tcp        0      0 172.23.254.2:43320      172.23.254.3:4001      ESTABLISHED
tcp        0      0 172.23.254.2:46544      172.23.254.3:4001      TIME_WAIT  
tcp        0      0 172.23.254.2:40118      172.23.254.3:4001      ESTABLISHED
tcp        0      0 172.23.254.2:4001       172.23.254.3:48804     ESTABLISHED
tcp        0      0 172.23.254.2:4001       172.23.254.3:34254     ESTABLISHED
如果两台机器的4001端口分别建立了连接,则说明集群配置成功,可以进行session复制。
不同机器之间的tomcat session sticky需要吧防火墙释放其端口! 
单独测试session复制成功!

 

你可能感兴趣的:(tomcat,nginx,负载均衡,session)