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

负载的时候可以用APACHE或NGINX,如果什么都不用,两台一接防问了话,可能会出错极session不同步的问题,网上也很多人介意不要做seeeion同步,这样会降低机器的性能,有一个方法可以,就是NGINX的ip_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+Redis+Tomcat实现负载均衡项目session共享 本篇文章是继前三篇文章实现的基础上完成的,如果在阅读过程中,有没安装或没实现的功能,请参考前两篇博客。 Linux系统下Nginx的安装 :讲述nginx在Linux系统下的安装工程,以及设置为自启动服务。 Nginx反向代理转发tomcat :讲述nginx反向代理原理,转发tomcat实现过程以及动、静资源分离处理。 Nginx+Tomcat搭建高性能负载均衡集群:讲述nginx 阅读详情

相关推荐

nginx+tomcat负载均衡(含session共享)

Nginx+Tomcat负载均衡(含Session共享)案例

甘蓝的专栏 9557

Linux—nginx负载均衡实现Session一致性操作(六)

Linux 实现Session一致性 为什么要实现Ssesion一致性问题呢?负载均衡虽然解决了服务器的压力问题,不过http请求是无状态的,这次你在A电脑请问访问服务器,那么会话记录会保存在A电脑,不过你在B电脑就无法获取到会话记录,这对我们的操作是致命性的,所以要让Session在不同的服务器都能共享到,就要如何解决共享Session的问题。 一、准备工作 (1)两台虚拟机配置tomcat和n...

nine_million_ITdream的博客 510

手把手教你用EGM96模型校正DEM数据(含在线工具推荐)

本文详细介绍了如何使用EGM96地球重力场模型校正DEM数据中的高程偏差。通过对比WGS84椭球面与大地水准面的差异,解释了校正原理,并提供了从在线工具快速验证到Python脚本批量处理的全流程实战指南,帮助GIS开发者和数据分析师确保高程数据基准一致,提升空间分析精度。

ttt77的博客 1007

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

提示:关于nginx 和tomcat 己经在前面的博文己在介绍过了第一部分:nginx反向代理tomcat 一、软件及环境软件系统角色用途安装的软件ip地址Centos6.5x86_64nginx 反向代理用户请求nginx172.16.249.210Centos6.5x86_64tomcat1处理jsp请求 jdk+tomcat 172.16.249.101Centos6....

weixin_33836223的博客 138

【PyTorch版本兼容性指南】如何在不同版本中正确使用torch.nn.attention

本文详细解析了PyTorch版本兼容性问题,特别是torch.nn.attention模块在不同版本中的使用差异。针对常见的ModuleNotFoundError错误,提供了三种实用解决方案:升级PyTorch版本、使用自定义实现和源码移植方案,并分享了最佳实践建议,帮助开发者有效避免兼容性问题。

weixin_29084231的博客 471

【专栏导引贴】100+智能优化算法:从背景原理到代码实战(持续更新)

本专栏系统整理100+种现代优化算法,涵盖粒子群优化(PSO)、遗传算法(GA)、鲸鱼优化(WOA)等经典方法,以及白鲸优化(BWO)、非洲秃鹫优化(AVOA)等新兴算法。每篇详解包含生物启发原理、数学模型、代码实现及工程应用,采用统一编程风格,提供可直接运行的实例代码。专栏持续更新,旨在为研究者提供系统化的智能优化算法参考资料,实现从理论到实践的完整知识链。目前已收录23种算法,包括蚁群系统(ACS)、蝙蝠算法(BA)、天牛须搜索(BAS)等自然启发式优化方法。

qq_42212808的博客 3643

Linux中集群Tomcat和Nginx详细步骤

在Linux中集群Tomcat和Nginx的详细步骤,包括更改Linux配置、上传JDK并配置环境变量、安装Tomcat、部署web项目、以及Tomcat集群、配置Nginx并部署多台Tomcat等操作。

Alon的博客 1123

Spring AI Alibaba实战训练营-13语音生成应用开发指南

本文介绍了如何基于Spring AI Alibaba创建DashScope语音应用,支持文本转语音(TTS)和语音转文本(STT)功能。主要内容包括:1)环境准备要求Java 17+、Maven 3.6+及阿里云DashScope API Key;2)通过Spring Initializr创建项目并配置相关依赖;3)设置API密钥的安全配置方法;4)实现语音合成的同步和流式功能,包括创建控制器类、调用API接口及保存语音文件。文章提供了详细的代码示例和配置说明,帮助开发者快速搭建语音处理应用。

program哲学 403

Linux系统下apache+tomcat整合完整步骤

[size=xx-large]http://hi.baidu.com/qiuyuanyang/blog/item/0a64d210ed34975af819b835.html http://hi.baidu.com/qiuyuanyang/blog/item/5e0caa369d251745251f1434.html Nginx作为负载均衡前端 配置可以参照apache httpd ...

tianyihuyidao9的博客 144

innovus:set_clock_latency与insertion_delay

当1ns clock latency设置在capture上,在report_timing报告中体现在other end arrival time以及capture clock path的Arrival Time上。因为-1ns的insertion delay存在,所以skew group报告中显示的Arrival (ns)是减1ns的结果,即1.819-1=0.819 ns。CTS阶段create_ccopt_clock_tree_spec之后,spec中会产生对应的insertion_delay命令。

m0_61544122的博客 1614

虚拟化 之三 详解 ARM 平台 jailhouse 的移植适配、构建及使用(飞腾派)

本文将探索学习通过在飞腾官方提供的 Buildroot 构建系统移植适配 openEuler 内核以及 jailhouse 源码 Package 进而直接构建一个适用于飞腾派开发板的带有 jailhouse 的 openEuler 发行版。

技术干货 1000

nginx +多个tomcat实现负载均衡和session共享(完整教程,图文并茂)

使用nginx和tomcat配置负载均衡和session共享 文章目录使用nginx和tomcat配置负载均衡和session共享安装nginx安装多个tomcat设置负载均衡设置session共享 安装nginx ubuntu安装nginx centOs安装nginx 安装多个tomcat ubuntu和centOs的安装规则一样,故不作区分 设置负载均衡 设置session共享 ...

小雪的博客 8598

【Claude】Not logged in 错误:未登录状态的判断与 /login 认证路径 bug报错已解决

login 是首选修复:大多数 "Not logged in" 只需重新执行 /login检查系统时间:时间偏差是 Token 验证失败的常见原因避免密钥库被清理:将 Claude Code 添加到系统清理工具的白名单企业环境用 API Key:如果组织禁用 OAuth,使用 API Key 认证区分凭证类型:理解 Not logged in(无凭证)vs Invalid key(有但无效)

博客 7306
上一篇: Hibernate 迫切左外连接 left join fetch
下一篇: 网站的静态化处理
Epiphone
博客等级 码龄20年 90粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值