前言
在上一篇中介紹了Nginx的安裝,本篇文章主要介紹的是Nginx如何實作負載均衡,
負載均衡介紹
介紹
在介紹Nginx的負載均衡實作之前,先簡單的說下負載均衡的分類,主要分為硬體負載均衡和軟體負載均衡,硬體負載均衡是使用專門的軟體和硬體相結合的設備,設備商會提供完整成熟的解決方案,比如F5,在資料的穩定性以及安全性來說非常可靠,但是相比軟體而言造價會更加昂貴;軟體的負載均衡以Nginx這類軟體為主,實作的一種訊息佇列分發機制,
簡單來說所謂的負載均衡就是把很多請求進行分流,將他們分配到不同的服務器去處理,比如我有3個服務器,分別為A、B、C,然后使用Nginx進行負載均衡,使用輪詢策略,此時如果收到了9個請求,那么會均勻的將這9個請求分發給A、B、Cf服務器,每一個服務器處理3個請求,這樣的話我們可以利用多臺機器集群的特性減少單個服務器的壓力,
Nginx實作負載均衡的示例圖:

負載均衡策略
NGINX開源支持四種負載平衡方法,而NGINX Plus又增加了兩種方法,
1.Round Robin: 對所有的請求進行輪詢發送請求,默認的分配方式,
nginx.conf 配置示例:
upstream xuwujing {
server www.panchengming.com;
server www.panchengming2.com;
}
注:上面的域名也可以用IP替代,
2.Least Connections: 以最少的活動連接數將請求發送到服務器,同樣要考慮服務器權重,
nginx.conf 配置示例:
upstream xuwujing {
least_conn;
server www.panchengming.com;
server www.panchengming2.com;
}
3.IP Hash : 發送請求的服務器由客戶機IP地址決定,在這種情況下,使用IPv4地址的前三個位元組或整個IPv6地址來計算散列值,該方法保證來自相同地址的請求到達相同的服務器,除非該服務器不可用,
upstream xuwujing {
ip_hash;
server www.panchengming.com;
server www.panchengming2.com;
}
4.Generic Hash: 請求發送到的服務器由用戶定義的鍵決定,該鍵可以是文本字串、變數或組合,
upstream xuwujing {
hash $request_uri consistent;
server www.panchengming.com;
server www.panchengming2.com;
}
5.Least Time (NGINX Plus only) – 對于每個請求,NGINX Plus選擇具有最低平均延遲和最低活動連接數的服務器,其中最低平均延遲是根據包含least_time指令的下列引數計算的:
-
header : 從服務器接收第一個位元組的時間,
-
last_byte: 從服務器接收完整回應的時間,
-
last_byte inflight:從服務器接收完整回應的時間,
upstream xuwujing {
least_time header;
server www.panchengming.com;
server www.panchengming2.com;
}
6.Random:每個請求將被傳遞到隨機選擇的服務器,如果指定了兩個引數,首先,NGINX根據服務器權重隨機選擇兩個服務器,然后使用指定的方法選擇其中一個,
-
least_conn :活動連接的最少數量
-
least_time=header (NGINX Plus):從服務器接收回應標頭的最短平均時間 ($upstream_header_time),
-
least_time=last_byte (NGINX Plus) :從服務器接收完整回應的最短平均時間($upstream_response_time),
upstream xuwujing {
random two least_time=last_byte;
server www.panchengming.com;
server www.panchengming2.com;
}
Nginx+SpringBoot實作負載均衡
環境準備
- 依賴JDK1.8以上的版本;
- 依賴Nginx環境;
這里的專案就用本人之前的一個springboot專案,SpringBoot的專案地址: https://github.com/xuwujing/springBoot-study/tree/master/springboot-thymeleaf
首先我們下載這個專案,輸入:mvn clean package 將專案進行打包為jar檔案,然后將application.properties和此jar專案放在一個檔案夾中,然后復制該檔案夾(這里為了清晰所以進行復制,實際不復制更改埠重啟也行),修改復制檔案夾application.properties的埠,比如改為8086,
Nginx 配置
我們找到nginx的組態檔nginx.conf,該配置在nginx/conf/nginx.conf目錄下,然后我們來修改該配置,新增如下配置:
upstream pancm{
server 127.0.0.1:8085;
server 127.0.0.1:8086;
}
- upstream pancm:定義一個名稱,隨意就行;
- server + ip:埠 or 域名;
如果不想使用Round Robin策略,也可以換成其他的,
然后在server添加/修改如下配置:
server {
listen 80;
server_name 127.0.0.1;
location / {
root html;
proxy_pass http://pancm;
proxy_connect_timeout 3s;
proxy_read_timeout 5s;
proxy_send_timeout 3s;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
配置說明:
- server: 虛擬主機的名稱,一個http中可以配置多個server;
- listen:Nginx默認的埠;
- server_name:Nginx服務的地址,可以使用域名,多個用空格分隔,
- proxy_pass:代理路徑,一般配置upstream后面的名稱用于實作負載均衡,可以直接配置ip進行跳轉;
nginx.conf 完整的配置:
events {
worker_connections 1024;
}
error_log nginx-error.log info;
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream pancm{
server 127.0.0.1:8085;
server 127.0.0.1:8086;
}
server {
listen 80;
server_name 127.0.0.1;
location / {
root html;
proxy_pass http://pancm;
proxy_connect_timeout 3s;
proxy_read_timeout 5s;
proxy_send_timeout 3s;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
負載均衡測驗
在完成Nginx配置之后,我們啟動Nginx,
linux輸入/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf,如果已經啟動可以使用/usr/local/nginx/sbin/nginx -s reload命令進行熱加載組態檔,Windows直接點擊Nginx目錄下的nginx.exe或者 cmd運行start nginx進行啟動,如果啟動了依舊可以使用nginx -s reload進行熱加載,
Nginx啟動完成之后,我們依次啟動剛剛下載的springboot和復制更改埠的專案,輸入:java -jar springboot-jsp-thymeleaf.jar啟動,
都啟動成功之后,我們在瀏覽器輸入服務的ip即可進行訪問,
示例圖:

注:這里我使用的是windows系統做測驗,實際linux也是一樣的,
然后我們進行操作,并查看控制臺日志!

從上述示例圖中我們進行4次界面重繪請求,最終平均分配到兩個服務中去了,從上述的測驗結果中我們實作了負載均衡,
這里我在說一下使用Nginx的注意事項,在進行學習和測驗的時候,使用nginx默認的埠實作負載均衡一般沒有什么問題,但是當我們在專案中使用的時候,特別有登錄界面的并且埠不是80的時候,會出現登錄的界面無法跳轉,進行除錯的話會出現 net::ERR_NAME_NOT_RESOLVED這樣的錯誤,出現這個原因的是因為nginx默認的埠是80,那么默認跳轉的也是這個,所以出現這種情況的時候,需要在location 下添加proxy_set_header Host $host:port 這個配置,port 和listen 的埠保持一致就可以了,
其他
參考
https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
http://nginx.org/en/
相關文章
Nginx Linux和Windows安裝教程:https://www.cnblogs.com/xuwujing/p/11899890.html
SpringBoot+SpringCloud實作負載均衡: https://www.cnblogs.com/xuwujing/p/10273989.html
音樂推薦
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="330" height="86" src="https://www.cnblogs.com//music.163.com/outchain/player?type=2&id=30474763&auto=0&height=66"></iframe>原創不易,如果感覺不錯,希望點贊或推薦!您的支持是我寫作的最大動力!
著作權宣告:
作者:虛無境
博客園出處:http://www.cnblogs.com/xuwujing
CSDN出處:http://blog.csdn.net/qazwsxpcm
掘金出處:https://juejin.im/user/5ae45d5bf265da0b8a6761e4
個人博客出處:http://www.panchengming.com
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/151034.html
標籤:Linux
上一篇:linux硬鏈接和軟鏈接的區別
