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教程有興趣的朋友有所幫助。