nginx+tomcat+session复制(linux)

 

Nginx+tomcat+session复制

说明:Server1:nginx+tomcat1

      Server2:tomcat2

1.安装nginx

tar zxf pcre-8.12.tar.gz
cd pcre-8.12
./configure
make;make install

下载下面的插件安装,否则nginx无法识别tomcat中jvmRoute,从而无法达到session复制的效果。(本插件暂时只支持linux,好像在windows下不能使用,所以在win下无法实现基于本架构的session复制)

Wgethttp://friendly.sinaapp.com//LinuxSoft/nginx-upstream-jvm-route-0.1.tar.gz 
tar xzf nginx-upstream-jvm-route-0.1.tar.gz
tar xzf nginx-1.0.5.tar.gz 
cd nginx-1.0.5
patch -p0 <../nginx_upstream_jvm_route/jvm_route.patch---加载upstream
/configure --prefix=/usr/local/nginx --with-http_stub_status_module  --with-pcre=/root/pcre-8.12 --add-module=../nginx_upstream_jvm_route/

make;make install

2.配置nginx

vim /usr/local/nginx/conf/nginx.conf

#user nobody;
worker_processes  8;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

Pid   /usr/local/nginx/logs/nginx.pid; 
worker_rlimit_nofile 51200;

events {
 worker_connections 5000;
}

http {
#设定负载均衡列表

 upstream backend {
server 192.168.0.20:8080 weight=1; //在tomcat的配置里会配置jvmRoute为tomcat1
 server 192.168.0.30:8080 weight=1; ---------weight代表权重,可以设置的
 jvm_route $cookie_JSESSIONID|sessionid reverse;    session复制的配置
 }

include  mime.types;
default_type  application/octet-stream;
#charset  gb2312;
charset UTF-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 20m;
limit_rate  1024k; 
sendfile on;
tcp_nopush     on;
keepalive_timeout 60;
tcp_nodelay on;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on; 
#gzip_min_length  1k;
gzip_buffers     4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types     text/plain application/x-javascript text/css application/xml; 
gzip_vary on;

server
{
 #设定虚拟主机

 listen       80;
 server_name  www.baiying.com; 最好设置为ip地址
 index index.jsp index.htm index.html;
 root /usr/www;

 location / {
 proxy_pass  http://backend;
 proxy_redirect off;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header  X-Real-IP $remote_addr;
 proxy_set_header Host $http_host;
 }

主要在配置proxy与upstreamUpstream具有负载均衡能力,可以自动判断下面的机器,并且自动踢出不能正常提供服务的机器。


 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
 {
    expires   30d;
 }
 location ~ .*\.(js|css)?$
 {
 expires  1h;
 }
 location /Nginxstatus {
 stub_status on;
 access_log off;
 }
 log_format access '$remote_addr - $remote_user [$time_local] "$request" '
 '$status $body_bytes_sent "$http_referer" '
 '"$http_user_agent" $http_x_forwarded_for';

}
}

 

[root@slave conf]# /usr/local/bin/nginx.sh stop
[root@slave conf]# /usr/local/bin/nginx.sh start

3.安装tomcat
1)安装tomcat_1
tar zxf apache-tomcat-6.0.33.tar.gz
mv apache-tomcat-6.0.33/usr/local/tomcat
cp tomcat-replication.jar /usr/local/tomcat/lib
2)安装tomcat_2,步骤同1)

4.分别在tomcat服务器安装jdk

chmod 755 jdk-6u26-linux-i586-rpm.bin
./jdk-6u26-linux-i586-rpm.bin

cat >>/etc/profile <<EOF
export JAVA_HOME=/usr/java/jdk1.6.0_26
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOMR/bin

EOF;

source /etc/profile  //使环境变量立即生效

JDK最好是1.5以上的版本

5.tomcat集群配置
tomcat1配置:
修改conf/server.xml配置文件

Cluster,最好是在host中间

&lt;Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
 <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="224.0.0.4"
 port="45564"
 frequency="500"
 dropTime="3000"/>
 <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
 address="192.168.0.20"
 port="4001"
 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"/>
 <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
 </Channel>
 <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
 filter=""/>
 <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/> <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
 tempDir="/tmp/war-temp/"
 deployDir="/tmp/war-deploy/"
 watchDir="/tmp/war-listen/"
 watchEnabled="false"/>
 <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
 <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
 </Cluster>

tomcat2配置:
修改conf/server.xml配置文件

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
 <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="224.0.0.4"

 port="45564" 
 frequency="500"

 dropTime="3000"/>
 <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
 address="192.168.0.30"

 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"/>
 <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
 </Channel>
 <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
 filter=""/>
 <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
 deployDir="/tmp/war-deploy/"
 watchDir="/tmp/war-listen/"
 watchEnabled="false"/>
 <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
 <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>

6.session配置

修改web应用里面WEB-INF目录下的web.xml文件,加入标签 
<distributable/>
直接加在</web-app>之前 
开启网卡组播功能:
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 ----注意这个一定要跟上面一样

先启动tocmat1,等tomcat1启动完全的时候再启动tomcat2,等两个tocmat全启动之后,再启动nginx

7.创建jsp测试页面
在tomcat1安装路径下建立目录test
mkdir /usr/local/tomcat/webapps/ROOT/配置项目的路径

下面编写一个小的测试程序

vi index.jsp
<html>
<title>
tomcat1 jsp
</title>
<% 
 String showMessage="Oh My God 192.168.0.20 华仔!";
 out.print(showMessage);
%>
</html>
---------------------------- 
在tomcat2安装路径下建立目录test 
mkdir /usr/local/tomcat/webapps/ROOT/test/
vi index.jsp
<html>
<title>
tomcat2 jsp
</title>
<% 
 String showMessage="Oh My God 192.168.0.30 华仔!";
 out.print(showMessage);
%>
</html>

 

 

可能存在的问题

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(包过端口),如果可以打开,那就可以转发过去。如果不能打开,则无法转发

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值