做一个勇于分享的php园丁

PHP开发园地

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; " />
原文链接

我也来参与讨论

  1. 回复 2012-5-17 11:48:33 by aaa

     
你还可以输入600/600个字符 发表评论
称呼: (必填) 登录 | 开通博客
邮箱: (选填) 你的邮箱地址不会被公开
网站: (选填)
验证码: (必填)
看不清换一张 看不清楚换一张