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