博威---云架构决胜云计算

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2244|回复: 0

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

[复制链接]
发表于 2010-3-14 13:46:07 | 显示全部楼层 |阅读模式
nginx+tomcat集群负载均衡(实现session复制)tomcat, session, 集群, 负载, nginx

说明: 当前已经支持 Windows 版本的服务器了.


Nginx+tomcat 做负载均衡
架构描述
前端一台nginx服务器做负载均衡器,后端放N台tomcat组成集群处理服务,通过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/
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;


}
}
}
主要在配置proxy与upstream
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>之前就可以了
这个是加入tomcat的session复制的,做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可以转发成功,
在nginx上wget一下后面转发的url(包过端口),如果可以打开,那就可以转发过去。如果不能打开,则无法转发
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|boway Inc. ( 冀ICP备10011147号 )

GMT+8, 2024-11-22 07:07 , Processed in 0.283201 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表