linux+nginx+tomcat负载均衡,实现session同步

linux+nginx+tomcat负载均衡,实现session同步

花了一个上午的时间研究nginx+tomcat的负载均衡测试,集群环境搭建比较顺利,但是session同步的问题折腾了几个小时才搞定,现把我的过程贴上来,以备用。
软件及环境是:
虚拟机上装centos 5.5
IP为:192.168.0.51 装上nginx和tomcat  6.0.32 命名为 Tomcat1
一台win7上装tomcat  6.0.32  IP为:192.168.0.50  命名为 Tomcat2

首先装nginx,我是参照http://blog.s135.com/nginx_php_v6/ 配了一个Nginx + PHP(FastCGI)环境,然后再加上Tomcat的转发。
我的nginx.conf 修改如下

#######################################################################
#
# This is the main Nginx configuration file.  
#
# More information about the configuration options is available on 
#   * the English wiki - http://wiki.nginx.org/Main
#   * the Russian documentation - http://sysoev.ru/nginx/
#
#######################################################################

#----------------------------------------------------------------------
# Main Module - directives that cover basic functionality
#
#   http://wiki.nginx.org/NginxHttpMainModule
#
#----------------------------------------------------------------------

user              nginx;
worker_processes  8;

error_log  /var/log/nginx/error.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;

pid        /var/run/nginx.pid;

#----------------------------------------------------------------------
# Events Module 
#
#   http://wiki.nginx.org/NginxHttpEventsModule
#
#----------------------------------------------------------------------

events {
    worker_connections  10240;
}

#----------------------------------------------------------------------
# HTTP Core Module
#
#   http://wiki.nginx.org/NginxHttpCoreModule 
#
#----------------------------------------------------------------------

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                      ‘$status $body_bytes_sent "$http_referer" ‘
                      ‘"$http_user_agent" "$http_x_forwarded_for"‘;

access_log  /var/log/nginx/access.log  main;

server_names_hash_bucket_size  128;
client_header_buffer_size  32k;
large_client_header_buffers  4  32K;
client_max_body_size 8m;

sendfile        on;
    tcp_nopush     on;

#keepalive_timeout  0;
    keepalive_timeout  65;

#gzip  on;

gzip_min_length 1k;
gzip_buffers 4  16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary  on;

upstream  tserver  {
        server   192.168.0.51:8080 weight=1;
        server   192.168.0.50:8080 weight=1;
 }
    
    #
    # The default server
    #
    server {
        listen       80;
        server_name  _;

#charset koi8-r;

#access_log  logs/host.access.log  main;

location ~ .*\.(php|php5)?$
        {
          root  /www/ROOT;      
          #fastcgi_pass  unix:/tmp/php-cgi.sock;
         fastcgi_pass  127.0.0.1:9000;
         fastcgi_index index.php;
         include fcgi.conf;
        }

location ~ \.(jsp|jspx|do|htm)?$ {
         proxy_set_header  Host $host;  
         proxy_set_header  X-Real-IP  $remote_addr;
         proxy_pass http://tserver;#转向tomcat处理       
        }

location ~ (/dwr/)? {
         proxy_set_header  Host $host;
         proxy_set_header  X-Real-IP  $remote_addr;
         proxy_pass http://tserver;#转向tomcat处理
        }

location / {
            root   /www/ROOT;
            index  index.html index.jsp default.jsp index.do default.do;
        }

error_page  404              /404.html;
        location = /404.html {
            root   /www/ROOT;
        }

# redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /www/ROOT;
        }

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

# deny access to .htaccess files, if Apache‘s document root
        # concurs with nginx‘s one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

# Load config files from the /etc/nginx/conf.d directory
    include /etc/nginx/conf.d/*.conf;

}

下一步是配置Tomcat集群。分别打开tomcat1和tomcat2下conf中server.xml
<Server port="8005" shutdown="SHUTDOWN">
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" maxHttpHeaderSize="8192"
   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
   enableLookups="false" redirectPort="8443" acceptCount="100"
   connectionTimeout="20000" disableUploadTimeout="true" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />

找到<Engine name="Catalina" defaultHost="localhost">
Tomcat1下的修改为<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
Tomcat2下的修改为<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

tomcat1找到
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
修改为

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" 
            channelSendOptions="6">

<Manager className="org.apache.catalina.ha.session.DeltaManager"
                expireSessionsOnShutdown="false"
                notifyListenersOnReplication="true"/>
            <!--
            <Manager className="org.apache.catalina.ha.session.BackupManager"
                expireSessionsOnShutdown="false"
                notifyListenersOnReplication="true"
                mapSendOptions="6"/>
            -->
            <Channel className="org.apache.catalina.tribes.group.GroupChannel">
                <Membership className="org.apache.catalina.tribes.membership.McastService" 
                    address="228.0.0.5" 
                    bind="192.168.0.51" 
                    port="45564" 
                    frequency="500" 
                    dropTime="3000"/>
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
                    address="192.168.0.51" 
                    autoBind="100" 
                    port="4001" 
                    selectorTimeout="100" 
                    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"/>
            </Channel>
            <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
            
            <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
            <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

tomcat2找到
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
修改为

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" 
            channelSendOptions="6">

<Manager className="org.apache.catalina.ha.session.DeltaManager"
                expireSessionsOnShutdown="false"
                notifyListenersOnReplication="true"/>
            <!--
            <Manager className="org.apache.catalina.ha.session.BackupManager"
                expireSessionsOnShutdown="false"
                notifyListenersOnReplication="true"
                mapSendOptions="6"/>
            -->
            <Channel className="org.apache.catalina.tribes.group.GroupChannel">
                <Membership className="org.apache.catalina.tribes.membership.McastService" 
                    address="228.0.0.5" 
                    bind="192.168.0.50" 
                    port="45564" 
                    frequency="500" 
                    dropTime="3000"/>
                <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver" 
                    address="192.168.0.50" 
                    autoBind="100" 
                    port="4000" 
                    selectorTimeout="100" 
                    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"/>
            </Channel>
            <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>
            
            <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
            <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

还需要在程序的web.xml里面</web-app>前面加入以下这句话
<distributable/> 
session同步到这里设置完毕

服务器的启动顺序如下: 
tomcat1 --> |tomcat2 --> |nginx

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

负载的时候可以用APACHE或NGINX,如果什么都不用,两台一接防问了话,可能会出错极session不同步的问题,网上也很多人介意不要做seeeion同步,这样会降低机器的性能,有一个方法可以,就是NGINX的ip_hash,这样至少可以保证客户端去防问同一台TOCMAT,除非那台TOCMAT挂了

posted on 2011-06-21 15:38 Alpha 阅读(14031) 评论(3)  编辑  收藏 所属分类: Java J2EE JSP 、Linux Nginx

评论:

# re: linux+nginx+tomcat负载均衡,实现session同步 2011-06-21 22:05 | CodeMe

不错,还可以考虑使用memcache存储Session  回复  更多评论

# re: linux+nginx+tomcat负载均衡,实现session同步 2011-06-22 15:33 | Alpha

一、下载下列几个 Jar包 
http://memcached-session-manager.googlecode.com/files/memcached-session-manager-1.3.0.jar 
http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-jodatime-1.3.0.jar 
http://memcached-session-manager.googlecode.com/files/msm-javolution-serializer-cglib-1.3.0.jar 
http://spymemcached.googlecode.com/files/memcached-2.4.2.jar 
http://memcached-session-manager.googlecode.com/files/javolution-5.4.3.1.jar

时间: 2024-10-26 02:04:28

linux+nginx+tomcat负载均衡,实现session同步的相关文章

linux+nginx+tomcat负载均衡,实现session同步

第一部分:nginx反向代理tomcat 一.软件及环境 软件 系统 角色 用途 安装的软件 ip地址 Centos6.5x86_64 nginx 反向代理用户请求 nginx 172.16.249.210 Centos6.5x86_64 tomcat1 处理jsp请求  jdk+tomcat 172.16.249.101 Centos6.5x86_64 tomcat2 172.16.249.100 Centos6.5x86_64 mog(ilefs/store) 分布式存储静态数据 mogil

Nginx+Tomcat负载均衡之session问题

Nginx与Tomcat做负载均衡的时候有一个重要的问题必须考虑,那就是Session. 试想一下,假设Nginx采用轮询策略,应用被部署到tomcat1和tomcat2上,用户访问tomcat1时被要求先登录,于是用户登录.接下来用户再次发起应用的请求时,会由tocmat2进行处理(因为轮询,请求被依次交替转发到tomcat1和tomcat2上),这次tomcat2发现用户没登录,于是要求用户登录,这是用户就很疑惑呀,我刚才登录成功了呀,怎样还要登录.造成这个现象的原因是用户session保存

nginx tomcat负载均衡 使用redis session共享

环境准备 1.准备一台nginx服务器 ip192.168.1.133 端口81 安装过程: #首先安装依赖: yum -y install gcc-c++ yum -y install pcre pcre-devel yum -y install zlib zlib-devel yum -y install openssl openssl-devel #注意 : 安装nginx必须使用 root 用户安装 #创建一个nginx目录 mkdir /usr/local/src/nginx #进入到

Nginx + Tomcat 负载均衡群集 【内附源码包】

前言: 1·在之前都学习 Linux 的一些服务和搭建,都很熟悉 !这篇文章主要讲Nginx.Tomcat与 Nginx + Tomcat 负载均衡群集.2·在各种网站服务器软件中,除了 Apache HTTP Server 外,还有一款轻量级的 HTTP 服务器软件--Nginx,它是由俄罗斯 Lgor Sysoev(伊戈尔·赛索耶夫)开发. Nginx 的优点: 1·稳定性2·系统资源消耗低3·高并发链接的处理能力 (30000~50000 个并发请求),核心优点!4·反向代理服务器5·安装

Nginx+Tomcat负载均衡集群

第3章:部署Tomcat及其负载均衡(案例) 防伪码:成功之前必须与孤独为伍! Tomcat应用场景:  Tomcat服务器是一个免费的开放源代码的web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的的场合下被普遍应用,是开始和调试JSP程序的首选.但是由于其处理静态HTML的能力远不及Apache或者Nginx,所以Tomcat通常是作为一个Servlet和JSP容器,单独运行在后端.如图所示 一.部署tomcat 1.安装JDK,配置Java环境 1)安装jdk,建立

Centos7搭建nginx+tomcat负载均衡

Nginx简介 Nginx是一种服务器软件,也是一种高性能的http和反向代理服务器,同时还是一个代理邮件服务器.也就是说,我们在Nginx上可以发布网站,可以实现负载均衡(提高应答效率,避免服务器崩溃),还可以作为邮件服务器实现收发邮件等功能.而最常见的就是使用Nginx实现负载均衡. Nginx与其他服务器的性能比较 Tomcat服务器面向Java语言,是重量级的服务器,而Nginx是轻量级的服务器.Apache服务器稳定.开源.跨平台,但是Apache服务器不支持高并发,Nginx能支持处

Nginx+Tomcat负载均衡群集(实战可跟做!)

Nginx+Tomcat负载均衡群集 nginx处理静态 tomcat处理动态 合并为动静分离(前后端分离) Tomcat重要目录 bin:存放启动和关闭Tomcat脚本conf:存放Tomcat不同的配置文件doc:存放Tomcat文档lib/japser/common:存放Tomcat运行需要的库文件logs:存放Tomcat执行时的LOG文件src:存放Tomcat的源代码webapps:Tomcat的主要Web发布目录 Demo前置知识点: Nginx静态处理优势 1.Nginx处理静态

Nginx+Tomcat负载均衡群集搭建

Tomcat简介 Tomcat最初是由Sun的软件构架师詹姆斯邓肯.戴维森开发 安装完Tomcat后安装路径下面的目录和文件,是使用或者配置Tomcat的重要文件 Tomcat重要目录 bin:存放启动和关闭Tomcat脚本 conf:存放Tomcat不同的配置文件 doc:存放Tomcat文档 lib/japser/common:存放Tomcat运行需要的库文件 logs:存放Tomcat执行时的LOG文件 src:存放Tomcat的源代码 webapps:Tomcat的主要Web发布目录 w

nginx+tomcat负载均衡策略

測试环境均为本地,測试软件为: nginx-1.6.0,apache-tomcat-7.0.42-1.apache-tomcat-7.0.42-2.apache-tomcat-7.0.42-3 利用nginx做负载均衡,三台tomcat做WEB详细业务处理. nginx配置nginx.conf: #Nginx所用用户和组.window下不指定 #user niumd niumd; #user nobody; #工作的子进程数量(通常等于CPU数量或者2倍于CPU) worker_processe