nginx+tomcat 另类负载均衡

jopen 9年前

一、部署背景

        某服务器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.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实现多域名配置”。 上述问题可以忽略。

        

来自:http://my.oschina.net/u/2322690/blog/498558