nginx+tomcat集群负载均衡(实现session复制)
转自:http://talangniao.iteye.com/blog/341512
架构描述
前端一台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复制)的更多相关文章
- Apache+Tomcat +mod_proxy集群负载均衡及session
序言: 在玩Apache+Tomcat +mod_jk集群负载均衡及session的时候发现,还有一种方式可以实现,就是网上各位大牛们说的mod_proxy反向代理. 实在弄的我的知识细胞洋洋.实 ...
- ngnix apache tomcat集群负载均衡配置
http://w.gdu.me/wiki/Java/tomcat_cluster.html 参考: Tomcat与Apache或Nginx的集群负载均衡设置: http://huangrs.blog. ...
- Apache + Tomcat集群 + 负载均衡
Part I: 取经处: http://www.ramkitech.com/2012/10/tomcat-clustering-series-simple-load.html http://blog ...
- keepalived+nginx+tomcat+redis实现负载均衡和session共享(原创)
keepalived+nginx+tomcat+redis实现负载均衡和session共享 直接上链接,码了一天,就不再重写了,希望能帮到大家,有问题欢迎留言交流.
- 【Nginx(三)】Nginx配置集群 负载均衡策略
Nginx配置集群 负载均衡策略 一.安装环境 1.安装JDK8的环境,配置JDK8的环境变量 2.上传jar包demo-1.jar 和 demo-2.jar demo-1.jar 监听8080端口; ...
- 使用Nginx实现Tomcat集群负载均衡
概述 要解决的问题 环境准备以及问题解决思路 配置 测试 小结 一.概述 使用Nginx主要是来解决高并发情况下的负载均衡问题. 二.要解决的问题 1.最主要是负载均衡请求分发. 2.文件上传功能,只 ...
- Ubuntu下基于Nginx实现Tomcat集群负载均衡
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] Nginx是一款HTTP和反向代理服务器,有关它的介绍可以到网上搜一下,很多很多,不再累述.这里,我们记录一下Nginx ...
- Nginx+tomcat集群使用redis共享session
一 :nginx负载均衡 当Tomcat当做独立的Servlet容器来运行时,可看做是能运行Java Servlet的独立Web服务器. 此外 Tomcat还可以作为其他Web服务器进程内或者进程外的 ...
- Nginx+Tomcat+Memcache实现负载均衡及Session共享
第一部分 环境介绍 部署环境: Host1:Nginx.Memcached.Tomcat1 Host2:Tomcat2 Tomcat_version:8.0.38 第二部分 Nginx+Tomcat实 ...
随机推荐
- jmeter、java自动化学习地址
自动化学习社区地址:http://www.hordehome.com/c/14-category jmeter学习地址(范丰平博客):http://www.cnblogs.com/fengpingfa ...
- 使用PCA + KNN对MNIST数据集进行手写数字识别
首先引入需要的包 %matplotlib inline import numpy as np import scipy as sp import pandas as pd import matplot ...
- TCP/IP笔记(六)TCP与UDP
终于来到了传输层,这个面试问的最多了,内容比较多,要分两篇来总结,这是第一篇
- Linux - PCB之task_struct结构体
task_struct结构描述 1. 进程状态(State) 进程执行时,它会根据具体情况改变状态 .进程状态是调度和对换的依据.Linux中的进程主要有如下状态,如表4.1所示. 内核表示 含义 ...
- Spring Boot 配置文件 – 在坑中实践
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 仓廪实而知礼节,衣食足而知荣辱 - 管仲 』 本文提纲 一.自动配置 二.自定义 ...
- node-ejs-mongodb结合的项目案例-----引用mongoose和未引用mongoose模块
本项目个人尝试了2种方法,一个是直接用mongod,一个是引用mongod里的mongoose. nodejs-ejs-mogondb- nodej+ejs模板,通过mogondb数据查询数据实现简单 ...
- 使用 rsync 同步
原文地址 http://www.howtocn.org/rsync:use_rsync 选项 说明 -a, ––archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等价于 -rlpt ...
- 【react】利用prop-types第三方库对组件的props中的变量进行类型检测
1.引言--JavaScript就是一个熊孩子 1.1对于JSer们来说,js是自由的,但同时又有许多让人烦恼的地方.javascript很多时候就是这么一个熊孩子,他很多时候并不会像C和java ...
- 蓝桥杯- 移动距离-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- hdu2819二分图匹配
Given an N*N matrix with each entry equal to 0 or 1. You can swap any two rows or any two columns. C ...