nginx+tomcat 另類負載均衡

1、部署背景html

        某服務器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。nginx

        ip_hash:可以將某個客戶端的ip的請求經過哈希算法定位到同一臺後端服務器。
web

        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問題。又能合理的將服務器鏈接請求進行負載處理。接下來我將個人配置文件貼出,供你們參考。     shell


2、配置修改apache

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

 #一、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;
                }
        }
#二、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
後端

  #一、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>
      
  #二、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>


3、測試瀏覽器

         首先申明,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,看能否負載。

            這是個人解決辦法。可能跟網上不少大神的有出入。小弟還在學習中~~~~,不喜勿噴!


4、個人疑問?

            配置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實現多域名配置」。 上述問題能夠忽略。

相關文章
相關標籤/搜索