首頁  >  文章  >  後端開發  >  Nginx+Tomcat做負載平衡

Nginx+Tomcat做負載平衡

WBOY
WBOY原創
2016-07-30 13:31:14977瀏覽

Nginx負載平衡

最近專案要設計到並發,所以設計專案架構時考慮到用Nginx搭建Tomcat集群,再用Redis搭建分佈式Session,下面將一步步分享我摸索的過程。

    Nginx雖然小,但是功能方面確實非常的強大,支援反向代理,負載平衡,資料緩存,URL重寫,讀寫分離,動靜分離等方面。下面最要說一下負載平衡的配置,下一篇將試驗與Redis的結合。

Nginx負載平衡調度的方法

     Nginx的負載平衡模組upstream模組主要支援如下4中調度演算法:逐一分配到不同的伺服器端,如果後端某台伺服器當機時,故障系統會被自動的剔除,使用戶存取不受          影響。 Weight(權重)指定輪詢的權值,Weight值越大,分配到的存取幾率越高,主要用於伺服器端效能不均的情況。

     2、ip_hash:每個請求按照訪問的IP的Hash值進行分配,這行來自同一個IP的用戶將會固定到後端的一個伺服器,固定伺服器後可以有效的解決網頁存在的        的問題。

    

     3、fair:此演算法可依據頁大小及載入時間長短智能的進行決策負載平衡,即依據後端伺服器的回應時間來分配請求,回應時間段的優先分配。 Nginx本身未集           成fair模組,若需要此調度演算法,則必須下載Nginx的upstream_fair模組,然後在config中設定載入。

     4、url_hash:此調度演算法是根據存取的url的hash結果來分配請求,使每個url定向到同一個後端伺服器,可以進一步的提高後端伺服器的效率。 Nginx本身未整合            此模組,若使用需安裝Nginx的hash包,並編譯已載入到nginx。

Nginx的upstream模組支援的狀態參數

    在http的upstream模組中,可以透過server指令指定後端伺服器的IP位址和連接埠,同時也能設定每個後端伺服器在負載調度中的狀態。通常設定的狀態參數如下:

   1、down:表示目前的server暫時不參與負載平衡。

   2、backup:預留的備份伺服器。當其他的所有非backup機器發生故障或忙碌的時間,才會請求backup伺服器,因此這台伺服器的壓力最輕。

   3、max_fails:允許請求失敗的次數,預設為1。當超過最大次數時,傳回proxy_next_upstream 模組定義的錯誤。

   4、fail_timeout:經歷了max_fails次失敗後,暫停服務的時間。 max_fails可以和fail_timeout一起使用。

   註:當負載平衡調度演算法使用ip_hash時,後端伺服器在負載平衡調度中的狀態不能是weight和backup。

Nginx的參數配置以及說明

    

#user  nobody;
worker_processes  2;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip  on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_vary on;


    upstream andy {
		server 192.168.1.110:8080 weight=1 max_fails=2 fail_timeout=30s;
		server 192.168.1.111:8080 weight=1 max_fails=2 fail_timeout=30s;
        ip_hash;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

	location /andy_server {
	    proxy_next_upstream http_502 http_504 error timeout invalid_header;
	    proxy_set_header Host  $host;
	    proxy_set_header X-Real-IP $remote_addr;
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	    proxy_pass http://andy; #此处proxy_pass定义的name需要跟upstream 里面定义的name一致
	    expires      3d;
		
	   #以下配置可省略
	   client_max_body_size        10m;
	   client_body_buffer_size     128k;
	   proxy_connect_timeout       90;
	   proxy_send_timeout          90;
	   proxy_read_timeout          90;
	   proxy_buffer_size           4k;
	   proxy_buffers               4 32k;
	   proxy_busy_buffers_size     64k;
	   proxy_temp_file_write_size 64k;
	}

        error_page  404              /404.html;
		
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}

    

rrreee

註解:詳細的設定解釋請參閱上一篇。

Nginx負載平衡測試

     

      現在在192.168.1.110上部署的是Nginx,192.168681216819.168219.168219.18168521016812101919.102195.1816852102195.10168219191321951321325132021325.2195.

      1、當開啟http://192.168.1.110/andy_server/ 時,Nginx負載叢集採用預設方式時,每次都會輪詢伺服器。

            如下:

             能夠解決叢集的session問題。       

    

       2、當採用ip_hash  

         這種方式解決了session問題,如果192.168.1.110伺服器宕機掉的話,Nginx會將請求轉到未宕機的伺服器上面(經測試,將192.168.1.110請求此伺服器會跳到192.168.1.111伺服器)。但也存在個問題,當hash到的伺服器宕機,Nginx調到另一個伺服器,自然session會遺失。

    3.剩餘的兩種安裝Nginx所需對應的模組,和上面同理就不在測試。

    

總結

      無論是使用哪種負載平衡方式,都會出現session丟失問題。要解決該問題,要對session單另存放,無論是存庫,文件,還是分佈式內存伺服器存放,是集群搭建必不可少的。下篇將測試並解決session問題

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。

以上就介紹了Nginx+Tomcat做負載平衡,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn