`
pany
  • 浏览: 90304 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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 修改如下

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->#######################################################################
#
# 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"/>
修改为

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><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"/>
修改为




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

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

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

nginx

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

 

一、下载下列几个 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

将以下几个Jar包Copy到 $TOMCAT_HOME/lib目下,每个Tomcat节点都需要有。

二、配置Tomcat的Server.xml配置文件,样本可以点击这里下载,主要内容如下:
http://www.javabloger.com/images/2010-05/webcluster/server.xml.txt

<Context docBase="D:\webapp" path="" reloadable="true" >
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:localhost:11211"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
copyCollectionsForSerialization="false"
/>
</Context>

每个Tomcat的节点都需要修改。

 

 

 

分享到:
评论

相关推荐

    nginx+tomcat+redis完成session共享

    3. **配置Nginx**:在Nginx配置文件中,设置负载均衡策略,例如轮询、最少连接数或根据session ID进行粘滞会话。使用`proxy_pass`指令将请求转发到正确的Tomcat服务器,并配置`proxy_set_header`以传递session ID。 ...

    Linux下Nginx+Memcached+Tomcat负载均衡集群服务搭建所需jar包

    总结,构建Linux下Nginx+Memcached+Tomcat的负载均衡集群服务,需要深入了解每个组件的工作原理,正确配置和整合这些组件,以实现高效、稳定的Web服务。同时,不断优化和调整集群策略,以适应业务的增长和变化。

    nginx实现多个tomcat7直接session共享所需jar包

    这些缓存服务可以作为一个集中式的Session存储,Tomcat实例会将Session数据序列化后存储到Redis中,而Nginx则负责协调各个服务器之间的Session同步。 标签中的“session共享”指的就是上述的会话共享需求,“nginx...

    Nginx+Keepalived+Redis+Tomcat

    根据提供的文件信息,本文将详细解析如何在Linux环境下构建Nginx+Keepalived+Redis+Tomcat集群,实现session共享、负载均衡以及高可用性。以下内容将围绕集群规划与具体实施步骤展开。 ### 一、集群规划 在进行...

    tomcat+linux负载均衡集群配置

    ### Tomcat + Linux 负载均衡集群配置详解 #### 一、背景介绍与环境配置 在企业级应用中,为了提升系统的可用性与性能,通常会采用负载均衡技术进行多台服务器之间的流量分发。本文将详细介绍如何利用 Apache 和 ...

    nginx tomcat集群 session复制

    在高并发、高可用的Web应用环境中,使用Nginx作为负载均衡器,结合Tomcat集群是常见的架构选择。为了保证用户体验的连续性,Session复制技术用于在多个Tomcat实例之间共享用户会话状态。本文将详细介绍如何在Nginx和...

    Nginx+tomcat+ssl安装配置手册.pdf

    在Nginx上配置负载均衡,将请求转发到各个Tomcat实例,同时在Tomcat的`server.xml`中设置`jvmRoute`以实现Session同步。 **环境安装:** 1. **Windows安装**:解压Nginx的.zip文件,运行`nginx.exe`启动服务,通过...

    apache+tomcat负载

    Apache 通过集成JK模块(mod_jk)来实现与Tomcat的交互,JK模块是一个负载均衡器,可以根据预设策略将请求分发到多个Tomcat实例,实现集群化部署,从而提升系统处理能力并提供故障转移的能力。 **实现目标:** 在...

    互联网综合项目系统软件集成解决专项方案.docx

    Tomcat 集群配置需要实现多个 Tomcat 服务器的连接,以便实现负载均衡和 session 同步。首先,需要配置 Tomcat 服务器,以便实现集群式的 Web 应用程序。然后,需要配置 Nginx,以便将请求分发到多个 Tomcat 服务器...

    Linux下Nginx搭建

    为了实现Tomcat集群之间的Session同步,这里引入了Memcached作为共享Session存储。下载Memcached的1.4.10版本,链接为http://memcached.googlecode.com/files/memcached-1.4.10.tar.gz。安装完成后,启动Memcached...

    Nginx+Tomcat关于Session的管理的实现

    在Nginx与Tomcat的集成环境中,Session管理是一个关键环节,尤其是在高可用性和负载均衡的设置中。本文将深入探讨如何在Nginx+Tomcat架构下有效地管理Session。 首先,我们来看Nginx的安装配置。在CentOS系统上,...

    tomcat 通过Redis,nginx实现多机热备

    总的来说,这个配置方案利用了Redis的高速缓存能力实现了session的跨服务器共享,通过Nginx的负载均衡能力保证了服务的高可用性。在Windows环境下,虽然相比Linux环境可能需要更多的配置工作,但仍然能够实现高效的...

    Linux系统-Linux中安装JDK/TOMCAT/MYSQL/linux中项目部署/集群搭建

    2. 使用Nginx或HAProxy等负载均衡器分配请求到各个服务器。 3. 对于MySQL,可以考虑使用主从复制或者MySQL Cluster实现数据同步。 4. 配置Tomcat的session复制以保持用户状态。 5. 使用监控和管理工具(如Zabbix、...

    linux下tomcat集群及配置文档

    所有到达Nginx的请求会被自动分发到不同的Tomcat实例,实现了负载均衡。 注意,实际部署中,Tomcat集群需要考虑session复制、应用同步、故障转移等高级特性,确保高可用性和一致性。另外,可以根据需求调整Nginx的...

    tomcat集群配置

    总结来说,配置Linux上的Tomcat集群涉及安装多个Tomcat实例,分配不同端口,设置负载均衡器(如Nginx)进行请求分发,以及处理session同步问题。这不仅能提高系统的可用性,还能通过负载均衡提升服务性能。在实际...

    tomcat 集群搭建

    5. **配置负载均衡器**:在Linux服务器上安装并配置负载均衡器,如HAProxy或Nginx,根据需求设置负载均衡策略。 6. **防火墙与安全**:记得打开必要的端口,如Tomcat的8009(AJP)和8080(HTTP),以及负载均衡器...

    tomcat集群部署

    2. **复制和负载均衡器**:通常使用Nginx或Apache做反向代理,实现请求的负载均衡,并且负责实例间的session复制。 3. **共享存储**:如使用NFS(网络文件系统)或分布式文件系统,实现配置文件和应用资源的共享。 ...

    tomcat8压缩包

    - **复制和session同步**:通过集群配置,可以实现多个Tomcat实例间的会话同步,提高可用性和可伸缩性。 - **负载均衡器**:可以结合外部负载均衡器如Nginx,实现请求的分发,提高系统整体性能。 7. **日志和监控...

    MSM非黏性安装配置手册

    MSM(Memcached Session Manager)是非黏性Session管理的一种实现,它通过将用户的Session数据存储在Memcached缓存系统中,实现多台Tomcat服务器之间的Session共享,从而达到负载均衡的目的。这种方案对于大型Web...

Global site tag (gtag.js) - Google Analytics