nginx+tomcat 另類負載均衡

jopen 9年前發布 | 10K 次閱讀 Nginx Web服務器

一、部署背景

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!