一、普通輪詢算法
這是Nginx 默認的輪詢算法。
例子:兩台相同的Tomcat服務器,通過 localhost:8080 訪問Tomcat1,通過 localhost:8081訪問Tomcat2,現在我們要輸入 localhost 這個地址,可以在這兩個Tomcat服務器之間進行交替訪問。
1、分別修改兩個Tomcat服務器的端口為8080和8081。然后再修改Tomcat的首頁,使得訪問這兩個頁面時能夠區分。如下:
修改端口號文件為 server.xml :
修改首頁的路徑為:webapps/ROOT/index.jsp
修改完成之后,分別啟動這兩個Tomcat服務器,然后分別輸入相應的地址端口號:
輸入地址:localhost:8081
輸入地址:localhost:8080
2、修改 nginx 的配置文件 nginx.conf
upstream OrdinaryPolling {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://OrdinaryPolling;
index index.html index.htm index.jsp;
}
}
3、啟動 nginx。然后在瀏覽器輸入localhost 地址,觀看頁面變化:
二、基於比例加權輪詢
上述兩台Tomcat服務器基本上是交替進行訪問的。但是這里我們有個需求:
由於Tomcat1服務器的配置更高點,我們希望該服務器接受更多的請求,而 Tomcat2 服務器配置低,希望其處理相對較少的請求。
那么這時候就用到了加權輪詢機制了。
nginx.conf 配置文件如下:
upstream OrdinaryPolling {
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:8081 weight=2;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://OrdinaryPolling;
index index.html index.htm index.jsp;
}
}
其實對比上面不加權的輪詢方式,這里在 upstream 指令中多了一個 weight 指令。該指令用於配置前面請求處理的權重,默認值為 1。
也就是說:第一種不加權的普通輪詢,其實其加權值 weight 都為 1。
下面我們看頁面相應結果:
明顯 8080 端口號出現的次數更多,試驗的次數越多越接近我們配置的比例。
三、基於IP路由負載
我們知道一個請求在經過一個服務器處理時,服務器會保存相關的會話信息,比如session,但是該請求如果第一個服務器沒處理完,通過nginx輪詢到第二個服務器上,那么這個服務器是沒有會話信息的。
最典型的一個例子:用戶第一次進入一個系統是需要進行登錄身份驗證的,首先將請求跳轉到Tomcat1服務器進行處理,登錄信息是保存在Tomcat1 上的,這時候需要進行別的操作,那么可能會將請求輪詢到第二個Tomcat2上,那么由於Tomcat2 沒有保存會話信息,會以為該用戶沒有登錄,然后繼續登錄一次,如果有多個服務器,每次第一次訪問都要進行登錄,這顯然是很影響用戶體驗的。
這里產生的一個問題也就是集群環境下的 session 共享,如何解決這個問題?
通常由兩種方法:
1、第一種方法是選擇一個中間件,將登錄信息保存在一個中間件上,這個中間件可以為 Redis 這樣的數據庫。那么第一次登錄,我們將session 信息保存在 Redis 中,跳轉到第二個服務器時,我們可以先去Redis上查詢是否有登錄信息,如果有,就能直接進行登錄之后的操作了,而不用進行重復登錄。
2、第二種方法是根據客戶端的IP地址划分,每次都將同一個 IP 地址發送的請求都分發到同一個 Tomcat 服務器,那么也不會存在 session 共享的問題。
而 nginx 的基於 IP 路由負載的機制就是上訴第二種形式。大概配置如下:
upstream OrdinaryPolling {
ip_hash;
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:8081 weight=2;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://OrdinaryPolling;
index index.html index.htm index.jsp;
}
}
注意:我們在 upstream 指令塊中增加了 ip_hash 指令。該指令就是告訴 nginx 服務器,同一個 IP 地址客戶端發送的請求都將分發到同一個 Tomcat 服務器進行處理。
四、基於服務器響應時間負載分配
根據服務器處理請求的時間來進行負載,處理請求越快,也就是響應時間越短的優先分配。
upstream OrdinaryPolling {
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:8081 weight=2;
fair;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://OrdinaryPolling;
index index.html index.htm index.jsp;
}
}
通過增加了 fair 指令。
五、對不同域名實現負載均衡
通過配合location 指令塊我們還可以實現對不同域名實現負載均衡。
upstream wordbackend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
upstream pptbackend {
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
server {
listen 80;
server_name localhost;
location /word/ {
proxy_pass http://wordbackend;
index index.html index.htm index.jsp;
}
location /ppt/ {
proxy_pass http://pptbackend;
index index.html index.htm index.jsp;
}
}