- Nginx 負載均衡筆記
- 1. 概述
- 1.1 Nginx 簡介
- 1.2 負載均衡概述
- 2. 四層負載均衡(傳輸層)
- 2.1 工作原理
- 2.2 特點
- 2.3 優缺點
- 優點
- 缺點
- 2.4 示例場景
- 3. 七層負載均衡(應用層)
- 3.1 工作原理
- 3.2 特點
- 3.3 優缺點
- 優點
- 缺點
- 3.4 示例場景
- 4. Nginx 排程演算法
- 4.1 輪詢(Round Robin)
- 4.2 最小連線數(Least Connections)
- 4.3 IP 雜湊(IP Hash)
- 4.4 加權輪詢(Weighted Round Robin)
- 5. 四層負載配置示例
- 5.1 安裝並啟動資料庫
- 5.2 開啟root遠端連線許可權
- 5.3 配置Nginx
- 5.4 重啟nginx並測試
- 6. 七層負載配置示例
- 6.1 配置web伺服器
- 6.2 配置負載均衡
- 6.3 重啟nginx並測試
- 1. 概述
Nginx 負載均衡筆記
1. 概述
1.1 Nginx 簡介
Nginx 是一個高效能的 HTTP 和反向代理伺服器,也是一個 IMAP/POP3/SMTP 代理伺服器。Nginx 以其高效能、穩定性、豐富的功能集、簡單的配置檔案以及低系統資源消耗而聞名。
1.2 負載均衡概述
負載均衡是一種將工作負載分攤到多個伺服器上的技術,以提高網站、應用或資料庫的效能和可靠性。負載均衡器可以在不同的網路層級實現,最常見的是第 4 層(傳輸層)和第 7 層(應用層)負載均衡。
2. 四層負載均衡(傳輸層)
2.1 工作原理
第 4 層負載均衡基於傳輸層協議(如 TCP 和 UDP)進行負載均衡。Nginx 作為第 4 層負載均衡器時,會基於 IP 地址和埠將請求分發到後端伺服器。
2.2 特點
- 透明性: 第 4 層負載均衡器只處理網路層和傳輸層的資料包,不關心應用層的資料內容。
- 高效性: 因為不需要解析應用層資料包,處理速度快,效能高。
- 簡單性: 配置較為簡單,適用於不需要複雜應用層處理的場景。
2.3 優缺點
優點
- 高效能: 因為只處理傳輸層的資料包,Nginx 可以高效地轉發請求。
- 廣泛適用: 可以處理任何基於 TCP 或 UDP 的應用。
缺點
- 功能有限: 無法基於應用層內容(如 URL、頭資訊)進行負載均衡。
- 除錯複雜: 因為透明性,難以對應用層問題進行除錯。
2.4 示例場景
- TCP 負載均衡: 適用於需要將 TCP 流量分發到多個後端伺服器的場景,如資料庫連線池。
- UDP 負載均衡: 適用於需要將 UDP 流量分發到多個後端伺服器的場景,如 DNS 請求。
3. 七層負載均衡(應用層)
3.1 工作原理
第 7 層負載均衡基於應用層協議(如 HTTP 和 HTTPS)進行負載均衡。Nginx 作為第 7 層負載均衡器時,會解析 HTTP 請求,並基於請求的內容(如 URL、頭資訊、Cookies)將請求分發到後端伺服器。
3.2 特點
- 靈活性: 第 7 層負載均衡器可以基於應用層的任何資訊進行復雜的負載均衡決策。
- 可見性: 可以解析並記錄詳細的請求資訊,便於監控和除錯。
- 安全性: 可以基於請求內容進行安全過濾和許可權控制。
3.3 優缺點
優點
- 靈活性高: 可以基於 URL、頭資訊、Cookies 等進行復雜的負載均衡。
- 強大的功能: 支援 SSL 終結、快取、壓縮、請求重寫等高階功能。
- 可擴充套件性: 易於擴充套件和整合其他應用層服務,如 WAF、認證等。
缺點
- 效能開銷: 因為需要解析和處理應用層資料包,效能開銷較大。
- 配置複雜: 需要更多的配置和管理工作,特別是在複雜的應用場景中。
3.4 示例場景
- HTTP 負載均衡: 適用於需要將 HTTP 請求分發到多個後端 Web 伺服器的場景。
- HTTPS 負載均衡: 適用於需要處理 HTTPS 請求,並將其分發到多個後端伺服器的場景。
- 基於 URL 的負載均衡: 適用於需要將不同路徑的請求分發到不同伺服器的場景。
- 基於 Cookies 的會話保持: 適用於需要基於使用者會話將請求分發到同一伺服器的場景。
4. Nginx 排程演算法
4.1 輪詢(Round Robin)
- 簡介: 將請求依次分發給每個後端伺服器,迴圈進行。
- 特點: 簡單易用,適用於負載均衡較為均勻的場景。
4.2 最小連線數(Least Connections)
- 簡介: 將請求分發給當前活動連線數最少的後端伺服器。
- 特點: 適用於請求處理時間差異較大的場景。
4.3 IP 雜湊(IP Hash)
- 簡介: 基於客戶端 IP 地址計算雜湊值,將請求分發給對應的後端伺服器。
- 特點: 適用於需要會話保持的場景,確保同一客戶端的請求始終分發到同一伺服器。
4.4 加權輪詢(Weighted Round Robin)
- 簡介: 根據伺服器的權重進行輪詢,權重高的伺服器分配更多的請求。
- 特點: 適用於後端伺服器效能不一致的場景。
5. 四層負載配置示例
需求:使用nginx監聽8888埠,後端伺服器均為MySQL,並且MySQL為主從模式,客戶端將訪問nginx提供的8888埠來連線MySQL
我這裡只是模擬,所以資料庫裡面是空的,沒有任何庫,表
主機名/服務 | IP | 埠 |
---|---|---|
oe01 Nginx | 192.168.200.170 | 8888 |
oe02 Mysql01 | 192.168.200.171 | 3306 |
oe03 Mysql02 | 192.168.200.172 | 3306 |
5.1 安裝並啟動資料庫
[root@oe02~]# yum install mariadb-server -y
[root@oe03 ~]# yum install mariadb-server -y
[root@oe02 ~]# systemctl enable --now mariadb
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
[root@oe03 ~]# systemctl enable --now mariadb
Created symlink /etc/systemd/system/mysql.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/mysqld.service → /usr/lib/systemd/system/mariadb.service.
Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /usr/lib/systemd/system/mariadb.service.
# 初始化資料庫
[root@oe02 ~]# mysql_secure_installation
[root@oe03 ~]# mysql_secure_installation
5.2 開啟root遠端連線許可權
如果不開啟遠端連線許可權的話,是不能夠連線上資料庫的,此時的資料庫只能夠本地進行使用,所以我們需要開啟遠端許可權
[root@oe02 ~]# mysql -uroot -p123
MariaDB [(none)]> grant all privileges on *.* to 'root'@'123' identified by '123';
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.001 sec)
[root@oe03 ~]# mysql -uroot -p123
MariaDB [(none)]> grant all privileges on *.* to 'root'@'123' identified by '123';
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.001 sec)
5.3 配置Nginx
[root@oe01 ~]# vim /etc/nginx/nginx.conf
# 在末尾加上這一段配置
stream {
upstream db {
server 192.168.200.171:3306;
server 192.168.200.172:3306;
}
server {
listen 8888;
proxy_pass db;
}
}
配置解釋:
- 一定要在/etc/nginx/nginx.conf裡面加入這一段配置,如果在
conf.d
目錄下寫的話會報錯的,因為這個是四層負載,而你將配置寫在conf.d
下的話他是會被載入到http段落裡面去的,http屬於7層,所以他會報錯 - upstream db :表示定義一個後端伺服器組,這個組的名字叫做db,在這個段落裡面使用server來指定主機和埠
- server段落:這裡就是配置虛擬主機,監聽8888埠
5.4 重啟nginx並測試
[root@oe01 ~]# systemctl restart nginx
現在我們使用客戶端來連線mysql
[root@oe01 ~]# mysql -uroot -p123 -h 192.168.200.170 -P 8888
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.5.5-10.5.25-MariaDB MariaDB Server
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
客戶端成功的連線上了資料庫,並且使用的地址是Nginx的地址,埠也是Nginx監聽的埠
6. 七層負載配置示例
四層的負載是需要定義在http段落以外的,而七層的負載就可以定義在http段落內了,也就是說我們可以將負載的配置檔案單獨寫一個並放在/etc/nginx/conf.d/
下
需求:使用nginx輪詢的策略負載後端的web服務
主機名/服務 | IP |
---|---|
oe01 Nginx負載 | 192.168.200.170 |
oe02 Nginx01 | 192.168.200.171 |
oe03 Nginx02 | 192.168.200.172 |
從這個規劃來,第一個nginx不提供web服務,只提供對後端的負載
6.1 配置web伺服器
# 安裝nginx
[root@oe02 ~]# yum install nginx -y
[root@oe03 ~]# yum install nginx -y
# 啟動nginx
[root@oe02 ~]# systemctl start nginx
[root@oe03 ~]# systemctl start nginx
# 編寫index.html
[root@oe02 ~]# echo "hello nginx01" >/usr/share/nginx/html/index.html
[root@oe02 ~]# echo "hello nginx02" >/usr/share/nginx/html/index.html
我們的web伺服器就配置好了,接下來配置Nginx的負載均衡
6.2 配置負載均衡
[root@oe01 ~]# cd /etc/nginx/conf.d/
[root@oe01 conf.d]# vim load.conf
upstream webserver {
server 192.168.200.171:80;
server 192.168.200.172:80;
}
server {
listen 80;
location / {
proxy_pass http://webserver;
}
}
6.3 重啟nginx並測試
[root@oe01 conf.d]# systemctl restart nginx
客戶端測試
C:\Users\86156>curl 192.168.200.170
hello nginx01
C:\Users\86156>curl 192.168.200.170
hello nginx02
C:\Users\86156>curl 192.168.200.170
hello nginx01
C:\Users\86156>curl 192.168.200.170
hello nginx02