Nginx + Spring Boot 實現負載均衡

2021-02-14 一個優秀的廢人
前言

本篇文章主要介紹的是 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 指令的下列參數計算的:

last_byte inflight:從伺服器接收完整響應的時間。
upstream xuwujing {
least_time header;
server www.panchengming.com;
server www.panchengming2.com;
}

6.Random:每個請求將被傳遞到隨機選擇的伺服器。如果指定了兩個參數,首先,NGINX 根據伺服器權重隨機選擇兩個伺服器,然後使用指定的方法選擇其中一個。

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 實現負載均衡環境準備

這裡的項目就用本人之前的一個 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:定義一個名稱,隨意就行;

如果不想使用 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;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

相關焦點

  • Nginx+SpringBoot實現負載均衡
    前言本篇文章主要介紹的是Nginx如何實現負載均衡。負載均衡介紹介紹在介紹Nginx的負載均衡實現之前,先簡單的說下負載均衡的分類,主要分為硬體負載均衡和軟體負載均衡,硬體負載均衡是使用專門的軟體和硬體相結合的設備,設備商會提供完整成熟的解決方案,比如F5,在數據的穩定性以及安全性來說非常可靠,但是相比軟體而言造價會更加昂貴;軟體的負載均衡以Nginx這類軟體為主
  • nginx實現請求的負載均衡 + keepalived實現nginx的高可用
    做負載均衡keepalived實現nginx高可用(HA)注意點參考前言使用集群是網站解決高並發、海量數據問題的常用手段。摘自《大型網站技術架構_核心原理與案例分析》另外,大家可以看我的這兩篇博客:LVS + keepalived + nginx + tomcat 實現主從熱備 + 負載均衡http://www.cnblogs.com/youzhibing/p/5061786.html和主從熱備+負載均衡(LVS + keepalived)http://www.cnblogs.com/youzhibing
  • Nginx+SpringBoot 實現負載均衡
    在介紹Nginx的負載均衡實現之前,先簡單的說下負載均衡的分類,主要分為硬體負載均衡和軟體負載均衡,硬體負載均衡是使用專門的軟體和硬體相結合的設備
  • Nginx如何優雅的實現負載均衡!(建議收藏)
    負載均衡介紹在介紹Nginx的負載均衡實現之前,先簡單的說下負載均衡的分類,主要分為硬體負載均衡和軟體負載均衡,硬體負載均衡是使用專門的軟體和硬體相結合的設備,設備商會提供完整成熟的解決方案,比如F5,在數據的穩定性以及安全性來說非常可靠,但是相比軟體而言造價會更加昂貴;軟體的負載均衡以
  • Docker+nginx實現負載均衡
    Docker是一個開源的,輕量級容器引擎。
  • Nginx七層的負載均衡
    協議配置這裡我們舉例,在nginx做負載均衡,負載多個服務,部分服務是需要7層的,部分服務是需要4層的,也就是說7層和4層配置在同一個配置文件中。在 1.9.0 的時候,增加了一個 stream 模塊,用來實現四層協議(網絡層和傳輸層)的轉發、代理、負載均衡等。
  • .Net分布式架構:Nginx實現負載均衡
    一:負載均衡簡介  負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP
  • Nginx 反向代理與負載均衡
    作者:chenhongdong連結:juejin.im/post/5b01336af265da0b8a67e5c9什麼是反向代理與負載均衡
  • Docker(二)-在Docker中部署Nginx實現負載均衡【完整教程】
    在本文中,我們將繼續介紹利用Docker部署Nginx服務實現負載均衡。文章最後附有Nginx部署的視頻全過程。註:查看公眾號歷史文章,獲知Asp.Net Core應用部署視頻教程二、環境CentOS7, Docker-ce三、Nginx服務部署1.
  • 使用NGINX和NGINX Plus進行Docker Swarm負載均衡
    此外,內置了DNS服務發現和負載均衡,您可以設置覆蓋集群範圍的網絡。Docker Swarm負載均衡拓撲圖6 Docker Swarm負載均衡器將客戶端請求轉發到NGINX Plus用以實現服務實例之間負載均衡類似地,Swarm負載均衡器接收服務間請求,而NGINX Plus實際上在服務之間分發它們(圖7)。
  • Nginx代理功能與負載均衡詳解
    ,再說明負載均衡詳細。有哪些中負載均衡算法。到這裡你是不是感覺nginx的負載均衡配置特別簡單與強大,那麼還沒完,咱們繼續哈,這裡扯下蛋。關於nginx負載均衡配置的幾個狀態參數講解。down,表示當前的server暫時不參與負載均衡。backup,預留的備份機器。
  • Nginx 反向代理、負載均衡圖文教程 !
    當然很多都是隨便一說的玩笑話,聽過一笑便可,不必當真,也不必抱怨了好了,今天就直接來說一下主題吧,前端要了解一些運維的Nginx用法,內容不多,簡單看看就好,這兩個功能在工作當中就夠用了,那麼首先來看個問題,什麼是反向代理與負載均衡什麼是反向代理與負載均衡什麼是反向代理當我們有一個伺服器集群,並且伺服器集群中的每臺伺服器的內容一樣的時候,同樣我們要直接從個人電腦訪問到伺服器集群伺服器的時候無法訪問
  • 圖文講解,如何使用 Nginx 反向代理、負載均衡
    來源:http://t.cn/AiKual8Y學到老活到老什麼是反向代理與負載均衡Nginx反向代理與負載均衡的實現nginx配置proxy_passUpstream模塊實現負載均衡工作中的簡單使用學到老活到老前端圈一直很新
  • 使用Spring Session實現Spring Boot水平擴展
    有兩種方式可以實現。複製會話的缺點是每次會話改變需要複製到多臺Web伺服器上,效率較低。因此Spring Boot應用採用第二種方式(集中式會話方式),結構如下圖所示。2.1  安裝Nginx打開Nginx網站(http://nginx.org/),進入下載頁面,根據自己的作業系統選擇下載,以Windows系統為例,下載nginx/Windows-1.11.10版本,直接解壓,然後運行Nginx即可。
  • (實用篇)詳解 Nginx代理功能與負載均衡
    本篇文章主要介紹了詳解 Nginx代理功能與負載均衡,先描述一些關於代理功能的配置,再說明負載均衡詳細,有興趣的可以了解一下。 序言Nginx的代理功能與負載均衡功能是最常被用到的,關於nginx的基本語法常識與配置已在上篇文章中有說明,這篇就開門見山,先描述一些關於代理功能的配置,再說明負載均衡詳細。
  • 編譯安裝nginx並實現反向代理負載均衡和緩存功能
    disable ngx_mail_imap_module --without-mail_smtp_module disable ngx_mail_smtp_module --with-stream enable TCP/UDP proxy module #stream模塊用於tcp/udp和負載均衡
  • 使用Nginx進行四層負載均衡
    而TCP負載均衡,就是我們通常所說的"四層負載均衡",工作在"網絡層"和"傳輸層"。例如,LVS(Linux Virtual Server,Linux虛擬服務)和F5(一種硬體負載均衡設備)是屬於"四層負載均衡"的。
  • Nginx四層負載均衡—《億級流量網站架構核心技術》
    相關章節:Nginx負載均衡與反向代理—《億級流量網站架構核心技術》使用Nginx實現HTTP動態負載均衡—《億級流量網站架構核心技術》Nginx 1.9.0版本起支持四層負載均衡,從而使得Nginx變得更加強大。
  • Nginx 反向代理和負載均衡策略實戰案例
    存在即合理,那為什麼要使用nginx呢?這得看看nginx能幫我們做些什麼。首先,nginx能做反向代理【關於反向代理和正向代理此處不做說明了,感興趣的小夥伴自行谷歌】;比方說,我想在本地使用 www.glmapper1.com 的域名去訪問www.taobao.com。 那麼這個時候我們就可以通過nginx去實現。
  • 10分鐘學會windows中iis搭建伺服器集群實現負載均衡和nginx代理轉發
    進入熊澤的百貨小店鋪目錄前言nginx概述nginx反向代理實現負載均衡