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; } }</pre>
其次,修改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></pre>
三、測試
首先申明,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