nginx+tomcat 另类负载均衡

一、部署背景

        某服务器A:10.68.4.198    域名:edi.qnb.com  ( tomcat应用,web 访问但须帐密认证,其他服务器连接查询却无须认证  ) 因业务需要,需要对A服务器做负载均衡。要求用nginx的upstream模块。A服务器上安装了tomcat和nginx,nginx做转发,将端口80接收到的请求,转发至本机的8080端口上,由tomcat处理。 现有相同配置的服务器B:10.68.4.248,用于做A的负载均衡。

        按照一般设置是直接在upstream块中添加如下两句,但是这样。web访问的就会出问题,session丢失。会一直是登陆界面。然而nginx完美解决了这个问题。那就是用ip_hash。

        ip_hash:能够将某个客户端的ip的请求通过哈希算法定位到同一台后端服务器。

        upstream edi.qnb.com {
                ip_hash;
                server 127.0.0.1:8080;
                server 10.68.4.248:8080;
        }

        通过ip_hash确实能够解决session丢失的问题。但是相同ip却永远只会调转到一台服务器上,web访问可以负载均衡,那么服务器访问呢?而服务器A大多是其他服务器连接访问。 所以ip_hash只能解决web访问,而不能解决服务器间的访问。  

         我的思路:和同事讨论后,决定在nginx上配置两个域名。一个用于web访问,不做负载处理(访问次数相对少)。另一个用作服务器间的访问,做负载处理。这样既解决了web访问session问题。又能合理的将服务器连接请求进行负载处理。接下来我将我的配置文件贴出,供大家参考。     


二、配置修改

        首先修改nginx的配置文件nginx.conf

 #1、qnb.edi.com这个域名用于用户web访问。
        upstream qnb.edi.com {
                server 127.0.0.1:8080;
        }

        server {
                listen  80;
                server_name  qnb.edi.com;
                proxy_redirect off;

                location / {
                        proxy_store off;
                        access_log /data/log/nginx/access.log main;
                        proxy_pass http://qnb.edi.com;
                }
        }
#2、edi.qnb.com这个域名用于服务器间的访问。服务器间不需要认证。
        upstream edi.qnb {
                server 127.0.0.1:8080;
                server 10.68.4.248:8080;
        }

        server {
                listen  80;
                server_name  edi.qnb.com;
                proxy_redirect off;

                location / {
                        proxy_store off;
                        access_log /data/log/nginx/access.log main;
                        proxy_pass http://edi.qnb;
                }
        }

        其次,修改4.198和4.248上的tomcat的配置文件server.xml

  #1、4.198上的tomcat的配置文件
     <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

      <Context path="" docBase="/data/www/html" reloadable="true" >
            <Valve className="org.apache.catalina.valves.AccessLogValve" buffered="false" 
             prefix="access_log." suffix=".txt" directory="/data/log/tomcat"  
             pattern="%h %l %u %t %r %s %b - %T"/>
      </Context>
      </Host>
      
  #2、4.248上的tomcat的配置文件
      <Host name="edi.qnb.com"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

      <Context path="" docBase="/data/www/html" reloadable="true" >
            <Valve className="org.apache.catalina.valves.AccessLogValve" buffered="false"  
            prefix="access_log."  suffix=".txt" directory="/data/log/tomcat"  
            pattern="%h %l %u %t %r %s %b - %T"/>
      </Context>
      </Host>


三、测试

         首先申明,edi.qnb.com和qnb.edi.com。这两个域名是我随便取得,实际并不存在。因此在用域名访问时,请在本机的hosts文件上添加如下信息。windows上hosts文件路径:C:\Windows\System32\drivers\etc      

10.68.4.198      qnb.edi.com
10.68.4.198      edi.qnb.com

        测试下访问edi.qnb.com,看可否负载。

nginx+tomcat 另类负载均衡_第1张图片

nginx+tomcat 另类负载均衡_第2张图片

nginx+tomcat 另类负载均衡_第3张图片

            这是我的解决办法。可能跟网上很多大神的有出入。小弟还在学习中~~~~,不喜勿喷!


四、我的疑问?

            配置nginx.conf和server.xml时,有一块我没有弄明白。网上搜索了很多资料,但是没找到能详细的说明这两者之间关系的文章。这里贴出,还望知道的大神为我解惑。

             nginx.conf中的虚拟主机。

server_name  edi.qnb.com;

            server.xml中的虚拟主机

<Host name="edi.qnb.com"  appBase="webapps"  unpackWARs="true" autoDeploy="true">

为啥这两个虚拟主机的名字必须要一样啊?有大神能给我个解释么。。。

            非官方解释:我当时是这样理解的,一台完整web服务器,有前端浏览器访问--nginx,后端处理请求数据--tomcat。这两个在一起后,就组成了一个完整的web服务器。所以主机名得要一样!!!

2015.8.28  11:46       原谅我放荡不羁没文化,刚刚看到有文章讲“tomcat实现多域名配置”。 上述问题可以忽略。

        

你可能感兴趣的:(nginx+tomcat 另类负载均衡)