nginx+tomcat集群负载均衡(实现session复制)
2010-01-04 18:05
573 查看
http://talangniao.javaeye.com/blog/341512
Nginx
+tomcat
做负载均衡
http://blog.chinaunix.net/u2/83793/showart_1354266.html
架构描述
前端一台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
(包过端口),如果可以打开,那就可以转发过去。如果不能打开,则无法转发
Nginx
+tomcat
做负载均衡
http://blog.chinaunix.net/u2/83793/showart_1354266.html
架构描述
前端一台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
(包过端口),如果可以打开,那就可以转发过去。如果不能打开,则无法转发
相关文章推荐
- nginx+tomcat集群负载均衡(实现session复制)
- nginx+tomcat集群负载均衡(实现session复制)
- nginx+tomcat集群负载均衡实现session复制
- nginx+tomcat集群负载均衡(实现session复制)
- nginx+tomcat集群负载均衡(实现session复制)
- nginx+tomcat集群负载均衡(实现session复制)
- nginx+tomcat集群负载均衡(实现session复制)
- nginx+tomcat集群负载均衡(实现 session复制)
- nginx+tomcat集群负载均衡(实现session复制)
- nginx+tomcat集群负载均衡(实现session复制)
- nginx+tomcat集群负载均衡(实现session复制)
- nginx+tomcat集群负载均衡(实现session复制)
- nginx+tomcat集群负载均衡(实现session复制)
- nginx+tomcat实现集群负载均衡(实现session复制)
- nginx+tomcat实现集群负载均衡(实现session复制)
- Nginx学习教程之五:nginx+tomcat实现集群负载均衡(实现session复制)
- windows下nginx+tomcat集群,实现session复制共享
- apache+tomcat集群 实现负载均衡和session复制
- nginx+tomcat实现集群负载均衡(实现session复制)
- Nginx+Tomcat集群实现反向代理负载均衡和Session复制