# 前言
html
本篇文章主要介紹的是Nginx如何實現負載均衡。java
# 負載均衡介紹
介紹
在介紹Nginx的負載均衡實現以前,先簡單的說下負載均衡的分類,主要分爲硬件負載均衡和軟件負載均衡,硬件負載均衡是使用專門的軟件和硬件相結合的設備,設備商會提供完整成熟的解決方案,好比F5,在數據的穩定性以及安全性來講很是可靠,可是相比軟件而言造價會更加昂貴;軟件的負載均衡以Nginx這類軟件爲主,實現的一種消息隊列分發機制。linux
簡單來講所謂的負載均衡就是把不少請求進行分流,將他們分配到不一樣的服務器去處理。好比我有3個服務器,分別爲A、B、C,而後使用Nginx進行負載均衡,使用輪詢策略,此時若是收到了9個請求,那麼會均勻的將這9個請求分發給A、B、Cf服務器,每個服務器處理3個請求,這樣的話咱們能夠利用多臺機器集羣的特性減小單個服務器的壓力。
Nginx實現負載均衡的示例圖:git
NGINX開源支持四種負載平衡方法,而NGINX Plus又增長了兩種方法。github
1.Round Robin: 對全部的請求進行輪詢發送請求,默認的分配方式。web
nginx.conf 配置示例:spring
upstream xuwujing { server www.panchengming.com; server www.panchengming2.com;}
注:上面的域名也能夠用IP替代。windows
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.htmlSpringBoot+SpringCloud實現負載均衡: https://www.cnblogs.com/xuwujing/p/10273989.html
來源:http://8rr.co/LSUH
本文分享自微信公衆號 - 會呼吸的Coder(BreathCoder)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。