Nginx通过IP Hash方式转发请求到多个Tomcat实现解决session共享问题

Tomcat配置

  Tomcat的安装就省略了,Tomcat配置主要说一下如果同一台机器的多台Tomcat的部分端口冲突问题,需要注意的地方。如果不同机器的Tomcat则可以直接跳过Tomcat相关的章节了。

配置server.xml

  如果是同一台机器多个Tomcat来模拟集群的Session共享,那么server.xml的端口以及部分脚本中配置的端口都需要修改,保证不冲突。这个例子中,博主使用的是同一台机器的Nginx和两台Tomcat,TomcatA的端口为:8081,TomcatB的端口为:8082,下面只贴出了TomcatA的server.xml的配置,TomcatB基本配置是一样的,只是端口的不同,就不贴出来了。

TomcatA的配置
<?xml version='1.0' encoding='utf-8'?>
<Server port="8006" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector executor="tomcatThreadPool"
               port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_tag_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

      </Host>
    </Engine>
  </Service>
</Server>

  Tomcat的核心配置都在server.xml,此外如果是同一台机器配置了多台tomcat,如果Tomcat不在同一台机器上的可以忽略,否则下面几点需要注意,环境变量的配置一般都在startup.sh,catalina.shsetclasspath.shsetenv.sh(推荐)中配置:

第一点,是否配置了远程调试(CATALINA_OPTS环境变量)

  如果配置了,则保证多个tomcat间的端口不要冲突,如下的address的值

CATALINA_OPTS="$CATALINA_OPTS -server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9001"

第二点,是否开启了JMX监控,一般都是开启了的

  如果配置了,则同样需要保证tomcat间的端口不要冲突,如下的jmxremote.port配置:

export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=9996 -Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false"

Nginx的安装和配置

  Nginx的安装方式,下面都是基于yum源安装的方式,也可以源码编译安装(未写文档)。

方式一(yum源安装)

  
1)配置Nginx的Yum源
  创建/etc/yum.repos.d/nginx.repo文件,并在文件用写入下列的内容,接着运行:yum list nginx 应该可以看到Nginx软件包;如果yum报repo有问题,很可能是本机没有配置$releasever$releasever有些系统没有,可以自己定义,例如CentOS6.5则$releasever值应该为6,另外的方式也可以直接硬编码修改下列连接中的$releasever为指定的值替代,例如:你的版本是centos6那么则将$releasever使用“6”替代,替换后则baseurl=http://nginx.org/packages/centos/6/$basearch/

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key

2)安装Nginx
  通过yum命令安装

 #查找安装包
 yum list  nginx
 #安装指定的安装包
 yum install -y [指定的安装包名]
方式二(源码安装)

  如果想要源码安装,可参考另外的一篇文章:https://blog.csdn.net/strive_or_die/article/details/98667605

Nginx基本命令

启动Nginx

#指定nginx.conf配置文件路径,如下的/path/to/nginx.conf 
nginx -c /path/to/nginx.conf  或者 nginx  (采用默认配置)

Nginx服务器重启命令,关闭

nginx -s reopen  #重新打开日志文件

nginx -t -c /path/to/nginx.conf #测试nginx配置文件是否正确

关闭Nginx

nginx -s stop  :快速停止nginx
         quit  :完整有序的停止nginx

其他的停止Nginx 方式

ps -ef | grep nginx
kill -QUIT 主进程号     :从容停止Nginx
kill -TERM 主进程号     :快速停止Nginx
kill -9 nginx          :强制停止Nginx

重新加载配置(修改配置文件后执行,可以让配置生效,不用重启Nginx)

nginx -s reload

Nginx日志

  Nginx的日志信息的位置,一般不是自己编译安装的方式,默认的日志配置文件在/var/log/nginx/目录下,日志对于排查问题很方便。Nginx的日志主要包括error.logaccess.log,error.log是错误日志,access.log是访问日志,这个日志很重要,用于排查错误。

配置Nginx

  非自行编译安装的方式,Nginx的配置一般在/etc/nginx目录下。安装好Nginx,下面主要的工作是针对上游服务器的场景怎么配置Nginx转发。在机器中有两台Tomcat服务器,分别为tomcatA,tomcatB,它们都运行着一个名为nginxdemo项目名。计划由Nginx监听80端口,然后转发到TomcatA(8081)和Tomcat(8082).

   基本的Nginx和Tomcat关系图,如下面的结构图所示
在这里插入图片描述
   Nginx安装完毕后,一般情况(除了自己编译或自己指定了安装位置),核心的配置文件都在/etc/nginx/config.d目录下,主要配置了default.confupstream.conf配置文件。

upstream.conf配置文件

  在这个文件主要是配置了所有需要代理的服务器的地址,下面是具体配置,主要定义多组的upstream地址:

#80端口(Nginx)映射为下列的上游服务器
upstream nginxdemoweb{#nginxdemoweb是一组上游服务器的地址,可以指定多台,其中还有许多的参数
    server 192.168.x.x:8081;#TomcatA,server 跟着的是具体的服务器地址和端口(默认是80端口)
    server 192.168.x.x:8082;#TomcatB
    ip_hash;#Nginx提供的一种保证会话共享的实现,同一个ip每次访问都会分配到指定的上游服务器。
}
default.conf配置文件

  defalut.conf主要配置了监听80端口,用于转发HTTP请求到TomcatA和TomcatB服务器,下面是详细的配置:

#默认的配置文件配置的是80的端口的监听,测试端口使用8888先
server {
    listen 80;#指定Nginx监听的端口,
    server_name  test;#指定服务器名字,一般是域名,不同的域名会通过请求头中的HOST字段,匹配到特定的server块,转发到对应的应用服务器中去.

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;
    #业务平台的系统
    location /nginxdemo {# location指定拦截那些请求,/nginxdemo 代表会拦截所有的/nginxdemo开头的请求,所以会拦截到测试的项目的请求。
        proxy_pass http://nginxdemoweb;#proxy_pass代表的拦截了的请求,Nginx转发的目标地址,这里的nginxdemoweb就是upstream.conf中定义的nginxdemoweb的服务器组名字。
        proxy_redirect default; #默认是default,此外还有指定地址等各种重定向。
        proxy_set_header Host $host:$server_port;#决定了上游服务器拿到的host和port,关键
        proxy_set_header X-Real-IP $remote_addr;#真实的IP地址
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto  $scheme;
        proxy_set_header Cookie $http_cookie;
        proxy_connect_timeout 100;#连接上游服务器的超时时间
        proxy_send_timeout 30;#发送数据到上游服务器的超时时间,如果超过了30秒,没有数据发送到上有服务器则会断开连接
        proxy_read_timeout 60;#与上面的配置相反,从上有服务器中读取响应的数据,超过60秒都还没响应的数据,则关闭与上游服务器的连接
   }
    #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   /usr/share/nginx/html;
    }
}

  执行nginx -s reload进行重新加载配置,保证启动了TomcatA和TomcatB,然后就可以通过Nginx的监听端口来访问nginxdemo项目,访问的地址为http://192.168.x.x:80/nginxdemo,这个IP和项目,需要修改为实际的IP,例子中的IP和项目都只是例子。

总结

  Nginx实现转发请求到多台上游服务器,基本的操作步骤,先准备两台Tomcat,可以是同一台机器,如果同一台机器则需要保证端口不要冲突;然后安装Nginx,安装后,进行配置upstrem和location,完成Nginx端口监听和转发的配置。然后通过Nginx监听端口访问项目能够访问成功,代表配置成功了。在这里的实例中,实现的session共享的方式,是在upstream中配置了ip_hash;,这个是Nginx提供的处理session会话问题的方式,这种方式保证了指定IP的用户访问的永远都是同一台上游服务器,这样就不会请求到了另外的服务器导致session失效的问题。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值