Nginx负载趟过的坑

    在项目中经常会碰到需要利用Nginx作负载,最近在利用Nginx作负载均衡器时碰到一个很奇葩的问题。

    本来按照以前的实现将打好的A.war包直接放到tomcat根目录(webapps)下,然后按照如下方式配置Nginx即可实现负载均衡:

upstream KV{
   ip_hash;
   server 10.68.234.160:8080;
   server 10.68.234.161:8080;
   server 10.68.234.162:8080;
   server 10.68.234.163:8080;
}

upstream KY{
   ip_hash;
   server 10.68.234.160:9080;
   server 10.68.234.161:9080;
   server 10.68.234.162:9080;
   server 10.68.234.163:9080;
}

server {
  listen   80;
  server_name localhost;
  charset utf-8;
  
  locaion ^~/mm/ {
      proxy_pass http://KV;
  }  

    locaion ^~/yy/ {
      proxy_pass http://KY;
  }  
  ...
}

   这样调用..../mm/yy即可通过Nginx即可实现负载均衡。

   然而在应用上线时,方案评审小组却告之二组不同的应用必须指定相应的上下文,假设我们都指定对应上下文为test,那么如果还按照上述方式配置Nginx就会发现容器始终匹配不到访问的URL。

  跟踪代码并经过多次测试发现:Nginx中的路径是通过#分割的,如果配置为/,那么Nginx是无法匹配到正确的访问路径的。

  根据上面的测试调整War布署方式:将编译生成的A.war重命名为test#A.war,然后放到tomcat的webapps根目录下,待tomcat启动后,我们发现webapps下产生test#A目录,此时对应的Nginx.conf依然可以参考上述配置:

upstream KV {
  ip_hash;
  server 10.63.79.170:9080;
  server 10.63.79.171:9080;
}

server {
  listen 80;
  server_name localhost;
}

location / {
  proxy_pass http://KV;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

 另外:基于DubboX框架利用Tomcat+Nginx布署应用时,需要注意如下几点:

<dubbo:protocol name="rest" port="7090" threads="1000" contextpath="mmservice/test" server="servlet" accepts="500" extension="com.test.provider.ExceptionMapperProvider"/>

 DubboX中的port与conextpath必须与tomcat中的port和contextpath保持一致(tomcat中的port在server.xml中进行配置;conextpath即为上文所描述的mmservice#test.war)

posted @ 2016-09-26 22:27  moonandstar08  阅读(1315)  评论(0)    收藏  举报