天天看點

如何使用 Nginx 配置負載均衡

作者:科技改變世界5436
如何使用 Nginx 配置負載均衡

負載均衡的優點

負載平衡是擴充應用程式并提高其性能和備援的絕佳方法。Nginx 是一種流行的 Web 伺服器軟體,可以配置為簡單但功能強大的負載均衡器,以提高伺服器的資源可用性和效率。

Nginx 是如何工作的?Nginx 充當在多個獨立伺服器上運作的分布式 Web 應用程式的單一入口點。

本指南介紹了負載平衡的優點。了解如何使用 nginx 為雲伺服器設定負載平衡。

作為先決條件,您需要至少有兩台安裝并配置了 Web 伺服器軟體的主機才能看到負載均衡器的優勢。如果您已經設定了一台 Web 主機,請通過建立自定義映像并将其部署到UpCloud 控制台上的新伺服器來複制它。

免費試用UpCloud!

安裝nginx

要做的第一件事是設定一個新主機作為負載均衡器。如果您尚未部署新執行個體,請在 UpCloud 控制台中部署。目前,nginx 軟體包可在最新版本的 CentOS、Debian 和 Ubuntu 上使用。是以,請選擇您喜歡的其中一個。

按照您喜歡的方式設定伺服器後,安裝最新的穩定版 nginx。使用以下方法之一。

# Debian 和 Ubuntu
sudo apt-get update
# 然後安裝Nginx開源版本
sudo apt-get install nginx           
sudo yum install epel-release
sudo yum update
sudo yum install nginx           

安裝後,将目錄更改為 nginx 主配置檔案夾。

cd /etc/nginx/           

現在,根據您的作業系統,Web 伺服器配置檔案将位于兩個位置之一。

Ubuntu 和 Debian 遵循在/etc/nginx/sites-available/中存儲虛拟主機檔案的規則 ,這些檔案通過/etc/nginx/sites-enabled/ 的符号連結啟用 。您可以使用以下指令啟用任何新的虛拟主機檔案。

sudo ln -s /etc/nginx/sites-available/ vhost  /etc/nginx/sites-enabled/ vhost           

CentOS 使用者可以在 /etc/nginx/conf.d/ 下找到其主機配置檔案,其中 加載任何.conf類型的虛拟主機檔案。

檢查是否至少找到預設配置,然後重新啟動 nginx。

sudo systemctl restart nginx           

測試伺服器是否響應 HTTP 請求。在 Web 浏覽器中打開負載均衡器伺服器的公共 IP 位址。當您看到 nginx 的預設歡迎頁面時,說明安裝成功。

如何使用 Nginx 配置負載均衡

如果您在加載頁面時遇到問題,請檢查防火牆是否阻止您的連接配接。例如,在 CentOS 7 上,預設防火牆規則不允許 HTTP 流量,請使用以下指令啟用它。

sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload           

然後嘗試重新加載您的浏覽器。

将 nginx 配置為負載均衡器

當nginx安裝并測試完畢後,開始配置其負載均衡。本質上,您所需要做的就是設定 nginx,并使用說明來偵聽哪種類型的連接配接以及将它們重定向到何處。使用您喜歡的文本編輯器建立新的配置檔案。以納米為例:

sudo nano /etc/nginx/conf.d/load-balancer.conf           

在load-balancer.conf中,您需要定義以下兩個部分,上遊和伺服器,請參閱下面的示例。

# 定義負載均衡方案中包含哪些伺服器。
# 最好使用伺服器的私有IP以獲得更好的性能和安全性。
# 你可以在你的網站上找到私有IP上雲控制台網絡部分。
http {
   upstream backend {
      server 10.1.0.101; 
      server 10.1.0.102;
      server 10.1.0.103;
   }


   server {
      listen 80; 

      location / {
          proxy_pass http://backend;
      }
   }
}           

然後儲存檔案并退出編輯器。

接下來,禁用您之前測試過的安裝後有效的預設伺服器配置。同樣,根據您的作業系統,這部分略有不同。

在 Debian 和 Ubuntu 系統上,您需要從啟用站點的檔案夾中删除預設的符号連結。

sudo rm /etc/nginx/sites-enabled/default           

CentOS 主機不使用相同的連結。相反,隻需将conf.d/目錄中的default.conf重命名為不以.conf結尾的名稱,例如:

sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.disabled           

然後使用以下指令重新啟動 nginx。

sudo systemctl restart nginx           

檢查nginx是否啟動成功。如果重新啟動失敗,請檢視 您剛剛建立的/etc/nginx/conf.d/load-balancer.conf以確定沒有錯誤或缺少分号。

當您在 Web 浏覽器中輸入負載均衡器的公共 IP 位址時,您應該傳遞到您的後端伺服器之一。

負載均衡方法

如果沒有定義其他方法,nginx 的負載平衡預設使用循環算法,如上面的第一個示例。使用循環方案時,将根據您在load-balancer.conf 檔案中設定的順序輪流選擇每個伺服器。這可以平衡短操作的請求數量。

基于最少連接配接的負載平衡是另一種簡單的方法。顧名思義,此方法将請求定向到當時活動連接配接最少的伺服器。對于請求有時需要更長時間才能完成的應用程式,它比循環法更公平。

要啟用最少連接配接平衡方法,請将參數least_conn添加到上遊 部分,如下例所示。

upstream backend {
   least_conn;
   server 10.1.0.101; 
   server 10.1.0.102;
   server 10.1.0.103;
}           

循環法和最少連接配接平衡方案是公平的并且有其用途。但是,它們無法提供會話持久性。如果您的 Web 應用程式要求使用者随後被定向到與上次連接配接期間相同的後端伺服器,請改用 IP 哈希方法。IP 散列使用通路者的 IP 位址作為确定應選擇哪個主機來服務請求的關鍵。這允許通路者每次都被定向到同一伺服器,前提是該伺服器可用且通路者的 IP 位址未更改。

要使用此方法,請将ip_hash參數添加到上遊 段,如下面的示例所示。

upstream backend {
   ip_hash;
   server 10.1.0.101; 
   server 10.1.0.102;
   server 10.1.0.103;
}           

在不同主機之間的可用資源不相等的伺服器設定中,可能需要優先考慮某些伺服器而不是其他伺服器。定義伺服器權重允許您進一步微調 nginx 的負載平衡。負載均衡器中權重最高的伺服器最常被選擇。

upstream backend {
   server 10.1.0.101 weight=4; 
   server 10.1.0.102 weight=2;
   server 10.1.0.103;
}           

例如,在上面顯示的配置中,選擇第一個伺服器的頻率是第二個伺服器的兩倍,與第三個伺服器相比,第二個伺服器再次獲得兩倍的請求。

啟用 HTTPS 的負載平衡

為您的網站啟用 HTTPS,這是保護通路者及其資料的好方法。如果您尚未在網絡主機上實作加密,我們強烈建議您檢視我們的指南,了解如何在 nginx 上安裝 Let's Encrypt。

将加密與負載均衡器結合使用比您想象的要容易。您需要做的就是将另一個伺服器部分添加到負載均衡器配置檔案中,該檔案使用 SSL 偵聽端口 443 上的 HTTPS 流量。然後為您的上遊段設定 proxy_pass,就像上面示例中的 HTTP 一樣。

再次打開您的配置檔案進行編輯。

sudo nano /etc/nginx/conf.d/load-balancer.conf           

然後将以下伺服器段添加到檔案末尾。

server {
   listen 443 ssl;
   server_name domain_name;
   ssl_certificate /etc/letsencrypt/live/domain_name/cert.pem;
   ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

   location / {
      proxy_pass http://backend;
   }
}           

然後儲存檔案,退出編輯器并再次重新啟動 nginx。

sudo systemctl restart nginx           

當您使用專用網絡連接配接到後端時,在負載均衡器上設定加密具有一些巨大的優勢。

  • 由于隻有您的 UpCloud 伺服器可以通路您的專用網絡,是以它允許您在負載均衡器處終止 SSL,進而僅傳遞轉發 HTTP 連接配接。
  • 它還極大地簡化了您的證書管理。您可以從單個主機擷取和續訂證書。

啟用 HTTPS 後,您還可以選擇對負載均衡器的所有連接配接強制加密。隻需使用伺服器名稱偵聽端口 80 并重定向到您的 HTTPS 端口即可更新您的伺服器段。然後删除或注釋掉不再需要的位置部分。請參閱下面的示例。

server {
   listen 80;
   server_name domain_name;
   return 301 https://$server_name$request_uri;

   #location / {
   #   proxy_pass http://backend;
   #}
}           

進行更改後再次儲存檔案。然後重新開機nginx。

sudo systemctl restart nginx           

現在,與負載均衡器的所有連接配接都将通過加密的 HTTPS 連接配接提供服務。對未加密 HTTP 的請求也将被重定向為使用 HTTPS。這提供了到加密的無縫過渡。您的訪客不需要做任何事情。

健康檢查

為了了解哪些伺服器可用,Nginx 的反向代理實作包括被動伺服器健康檢查。如果伺服器無法響應請求或回複錯誤,nginx 将指出伺服器已失敗。它将嘗試暫時避免将連接配接轉發到該伺服器。

可以在負載均衡器配置檔案中定義在特定時間段内連續嘗試連接配接失敗的次數。将參數max_fails設定為伺服器線路。預設情況下,當未指定max_fails時,該值設定為 1。(可選)将max_fails設定為 0 将禁用對該伺服器的運作狀況檢查。

如果max_fails設定為大于 1 的值,則後續失敗必須在特定時間範圍内發生,以便對失敗進行計數。該時間範圍由參數fail_timeout指定,該參數還定義伺服器應被視為失敗的時間長度。預設情況下,fail_timeout設定為 10 秒。

當伺服器被标記為失敗并且超過了fail_timeout設定的時間後,nginx将開始通過用戶端請求優雅地探測伺服器。如果探測成功傳回,伺服器将再次标記為活動狀态并正常包含在負載平衡中。

upstream backend {
   server 10.1.0.101 weight=5;
   server 10.1.0.102 max_fails=3 fail_timeout=30s;
   server 10.1.0.103;
}           

使用健康檢查。它們允許您根據需要打開或關閉主機電源,使伺服器後端适應目前需求。當您在高流量期間啟動額外的伺服器時,當新資源自動可供負載均衡器使用時,可以輕松提高應用程式性能。

繼續閱讀