【转】nginx+tomcat集群负载均衡(实现 session复制)

Keywords:Nginx,Tomcat,集群,负载均衡

转自:http://blog.chinaunix.net/u2/83793/showart_1354266.html

 

架构描述

前端一台nginx 服务器做负载均衡器,后端放Ntomcat 组成集群处理服务,通过nginx 转发到后面(注:没做动静分离,静态动态全部都转给tomcat

优点:实现了可弹性化的架构,在压力增大的时候可以临时添加tomcat 服务器添 加到这个架构里面去

一,配置nginx

1,    下载包

Wget  http://sysoev.ru/nginx/nginx-0.6.32.tar.gz

扫描二维码关注公众号,回复: 801052 查看本文章

ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/

2,   安装nginx

     a. 安装pcre

     tar zxvf pcre-7.2.tar.gz

     cd pcre

  ./configure   --prefix = /pcre

  Make;make install

b, 安装nginx

tar zxvf nginx-0.6.32.tar.gz

cd nginx-0.6.32

./configure   --prefix=/nginx –with-pcre=/pcre   --with-http_rewrite_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;   

server    172.23.254.3:8080;

}

 

# 设定虚拟主机

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;   

        }

}

}

主要在配置proxyupstream

Upstream 具有负载均衡能力,可以自动判断下面的机器,并且自动踢出不能正常提供服务的机器。

 

 

4 ,启动程序

/nginx/sbin/nginx

5, 编写启动脚本

Vi nginx.sh

#!/bin/sh

CWD=`pwd`


case $1 in
        start)
                /nginx/sbin/nginx;
                        ;;
        stop)
                kill -2 `ps -ef|grep "/nginx/sbin/nginx"|grep -v "grep"|awk '{print $2}' `
                        ;;
        restart)
                cd "$CMD"
                $0 stop
                $0 start
        ;;
        *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
esac
exit 0

 

     二,配置tomcat

1,    下载tomcat5.59

tar zxvf tomcat5.59

         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

                 页面能访问则正常

2,    其他的tomcat 服务器也用同样的配置

三,做tomcat 集群

     两台机器 172.23.254.2   172.23.254.3

     做集群需要修改的文件配置有三个地方

     1 , 修改conf/server.xml 配置文件
         a. 
找到Engine 标签,加入属性 jvmRoute="worker1"

b. 找到Cluster 标签,去掉注释,同时修改tcpListenAddress 为本机ip 172.23.254.2  (注:这一段Cluster 必须放在hosts 里面)

      

2,    修 改应用的web.xml

修改web 应用里面WEB-INF 目录下的web.xml 文件,加入标签

<distributable/>

直接加在</web-app> 之 前就可以了

这个是加入tomcatsession 复制的,做tomcat 集群必须需要这一 步,否则用户的session 就无法正常使用。

3,    开 启防火墙

这两个tomcat 之间必须开启防火墙信 任。

分别启动两个tomcat ,查看每一个tomcat 是否都启动了8080 端口以及4001 端口

再用netstat –an  查看链接情况

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 复制。

 

 

可能存在的问题

1,    session 复 制问题

以前用apache 做负载均衡的时候,是选 择了用 session sticky 的模式,这样的话,用户每次进来都会是同一个服务器中的session ,不会被转发到其他的服务器上。在这样的情况下,tomcat 即 使不做session 复制也不会影响用户访问。但是nginx 并 不支持sticky 功能。所以必须要做session 复 制。否则很多地方就根本没法用。比如登录过程,先等到了第一个tomcat 上,产生了一个session ,在刷新页面,刷到另外一个tomcat 的 机器上,没有这个session ,就会出现问题了。所以程序员在写jsp 的时候也要注意这一点

   举个简单的例子,比如我们在单机应用情况下修改SESSION 中用户的某一个数据,那么通常就是:
User user = (User)request.getSession().getAttribute(“user”);
User.setName(“my name”);
    
这 样我们就是直接存取出来,然后进行修改,虽然在单机情况下没有问题,但是在集群条件下,这样就导致了多台WEB 服 务器上的SESSION 不同步的问题,因为SESSION 并 没有改变,Tomcat 无法监视session 中 某个数据的值是否发生了变化。因此,我们还需要执行如下操作以保证SESSION 的同步:
Request.getSession().setAttribute(“user”, user);
    
所以,我们在操作SESSION 的时候要特别注意!另外的建议就是,我们应该尽可 能的不要修改SESSION 中的数据。

 

   可能经常会遇到session 复 制不正常的情况。除了在服务端找原因再也程序上找下原因。都是有可能导致session 复制不正常 的

 

2. 页面同步

      为确保后面tomcat 的 服务器上的页面程序是一致的,可以采用如下方式

      a,rsync 同步,或者做成页面按钮,提供给编辑,修改了程序即使点击同步

      b, 共享区域存储,或者采取drbd 网 络raid 模式

 

3 ,确认nginx 可以转发成功,

nginxwget 一下后面转发的url (包过端口),如果可以打 开,那就可以转发过去。如果不能打开,则无法转发

猜你喜欢

转载自soartju.iteye.com/blog/767463