how2j.cn

步骤 1 : 负载均衡 session问题   
步骤 2 : 解决办法一: ip_hash   
步骤 3 : 解决办法二: redis+tomcat-sessoin-manager   
步骤 4 : 接下来进行具体操作   
步骤 5 : 启动redis   
步骤 6 : jar包   
步骤 7 : 修改context.xml   
步骤 8 : 重启tomcat   
步骤 9 : 测试访问tomcat8111   
步骤 10 : 测试访问tomcat8222   
步骤 11 : 下载已经配置好了的tomcat   

步骤 1 :

负载均衡 session问题

通过负载均衡课程,我们可以把请求分发到不同的 Tomcat 来缓解服务器的压力,但是这里存在一个问题: 当同一个用户第一次访问tomcat_8111 并且登录成功, 而第二次访问却被分配到了tomcat_8222, 这里并没有记录他的登陆状态,那么就会呈现未登录状态了,严重伤害了用户体验。
负载均衡 session问题
步骤 2 :

解决办法一: ip_hash

通过ip地址标记用户,如果多次请求都是从同一个ip来的,那么就都分配到同一个tomcat.
这样就不会出现负载均衡 session问题了. 处理手段也很简单,如图所示在upstream最后加上ip_hash;就行了。

不过这种方案并不完美,当如下几种情况发生时就有问题:
1. 大量请求来之某个局域网,那么相当于就没有负载均衡了
2. 如果tomcat_8111 挂了,那么此时nginx只能把请求交给tomcat_8222,但是这里却没有记录session,用户体验依然受影响。
解决办法一: ip_hash
步骤 3 :

解决办法二: redis+tomcat-sessoin-manager

既然第一种解决办法有问题,那么就采用第二种解决办法:用Redis来存取session.
Redis是什么呢?说简单点就是个独立的Hashmap,用来存放键值对的。
这样当tomcat1需要保存session值的时候,就可以把它放在Redis上,需要取的时候,也从Redis上取。
那么考虑这个情景:
1. 用户提交账号密码的行为被分配在了tomcat8111上,登陆信息被存放在redis里。
2. 当用户第二次访问的时候,被分配到了tomcat8222上
3. 那么此时tomcat8222就会从redis去获取相关信息,一看有对应信息,那么就会呈现登陆状态。

这样就规避了解决办法一: ip_hash里会出现的两种问题了。

注: 对 redis 不熟悉的同学,请先了解下 redis教程
解决办法二: redis+tomcat-sessoin-manager
步骤 4 :

接下来进行具体操作

接下来进行具体操作,分几个步骤
1. 启动redis
2. 给两个tomcat使用jar包
3. 配置两个tomcat
4. 重启两个tomcat
5. 测试
步骤 5 :

启动redis

下载右上角的redis-2.4.5-win32-win64.zip,解压后运行对应(32位或者64位)的redis-server.exe程序
启动redis
步骤 6 :

jar包

Tomcat需要链接 redis,所以需要专门的jar包,这些包都放在了右上角的tomcat-redis.rar里。 一共有3个jar包:
jedis-2.5.2.jar,
commons-pool2-2.0.jar,
tomcat-redis-session-manager1.2.jar。
下载解压后,放在tomat8111的lib目录下。注:不要放在webapp里面去了哦
下载解压后,放在tomat8222的lib目录下。注:不要放在webapp里面去了哦
两个tomcat都要放
jar包
步骤 7 :

修改context.xml

然后修改tomcat/conf/context.xml ,增加下面这坨东西

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="127.0.0.1"
port="6379"
database="0"
maxInactiveInterval="60" />

两个tomcat都要改
<?xml version='1.0' encoding='utf-8'?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- The contents of this file will be loaded for each web application --> <Context> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) --> <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> --> <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" /> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="127.0.0.1" port="6379" database="0" maxInactiveInterval="60" /> </Context>
步骤 8 :

重启tomcat

两个tomcat都要重启
步骤 9 :

测试访问tomcat8111

Redis session共享机制和nginx其实无关,是发生在nginx之后的事情,所以直接访问login.jsp,然后登陆,并观察到已登陆状态

http://127.0.0.1:8111/login.jsp
测试访问tomcat8111
步骤 10 :

测试访问tomcat8222

然后直接访问tomcat8222

http://127.0.0.1:8222/login.jsp


虽然没有在tomcat8222上登陆,但是可以观察到已经呈现为登陆状态了
测试访问tomcat8222
步骤 11 :

下载已经配置好了的tomcat

如果对上述tomcat配置办法吃不准,请直接使用右上角的已经配置好了的:tomcat-redis-8111-8222.rar


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-10-26 2个tomcat 单独都能访问,但是使用nginx后就显示空白
SmallCxl



RT,两个tomcat7单独部署项目都是可以访问的,但是使用了nginx后,访问对应nginx端口就显示空白,不知道是什么原因。 另,我使用两个tomcat9的话,nginx就能正确访问,并且配置什么的都是没有改的。难道是tomcat的配置有问题?都是从官网下载的。求解
nginx配置如下:
#user root owner;
worker_processes  1;

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

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       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"';

    error_log logs/error.log warn;
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    upstream yhpc_server {
     server 127.0.0.1:8080 weight=6;
     server 127.0.0.1:8081 weight=4;	
    }

    server {
        listen      9999;
        server_name  localhost;

        #charset koi8-r;

        access_log  logs/host.access.log  main;

        location /yhpc {
            proxy_pass http://yhpc_server;        
            #index  index;
        }
        location /yhpc/~\.(css|js|eot|svg|ttf|woff|woff2)$ {
	 root /Users/chenxiaolong/Documents/apache-tomcat-9.0.2/webapps/ROOT;
	}
        #error_page  404              /404.html;

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




    }



}

							


1 个答案

SmallCxl 答案时间:2018-10-26
折腾半天,自己解决了…… 解决方法:查看各种log,包括nginx的log,和tomact的catalina.log…… 出错原因,使用tomcat7的时候,nginx配置中的 upstream yhpc_server { server 127.0.0.1:8080 weight=6; server 127.0.0.1:8081 weight=4; } 有问题,服务器集群的名称不能包含下划线…… catalina.log如下: 信息: The host [yhpc_server] is not valid Note: further occurrences of request parsing errors will be logged at DEBUG level. java.lang.IllegalArgumentException: The character [_] is never valid in a domain name. at org.apache.tomcat.util.http.parser.HttpParser$DomainParseState.next(HttpParser.java:1048) at org.apache.tomcat.util.http.parser.HttpParser.readHostDomainName(HttpParser.java:944) at org.apache.tomcat.util.http.parser.Host.parse(Host.java:66) at org.apache.tomcat.util.http.parser.Host.parse(Host.java:40) at org.apache.coyote.AbstractProcessor.parseHost(AbstractProcessor.java:219) at org.apache.coyote.http11.AbstractHttp11Processor.prepareRequest(AbstractHttp11Processor.java:1531) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1112) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:844) 但是使用tomcat 9的话,可能高级一点,能识别这个下划线定义的服务器群名…… 好坑。不过学会了怎么从源头解决问题,不亏。




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-10-25 tomcat 9.0好像不通用上面的jar包,但是不知道在哪里找对应的jar,只能使用tomcat8来做了吗?
SmallCxl
RT








答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2018-10-16 少一个步骤,站长!
2018-08-14 session共享问题
2018-07-11 redis没有运行,怎么也可以
2018-07-11 强!通俗易懂
2018-06-26 楼主牛逼,已买全站通,长期支持~~
2018-06-26 楼主牛逼,已买全站通,长期支持~~
2018-06-05 楼主能不能出个对负载均衡更深层次的引用。
2017-12-13 访问 http://127.0.0.1:8111/login.jsp——http://127.0.0.1:8222/login.jsp 连接超时




提问之前请登陆
关于 工具和中间件-Nginx-session共享 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 902680467
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图