1.Nginx介紹
Nginx是一款開源的、高性能的HTTP和反向代理服務器
1.正向代理和反向代理
正向代理(代理客戶端)是一種位于客戶端和目標服務器之間的中間服務器。客戶端通過正向代理服務器向目標服務器發送請求,代理服務器將請求轉發給目標服務器,并將目標服務器的響應返回給客戶端
反向代理(代理服務端)客戶端的請求首先發送到反向代理服務器,反向代理服務器再將請求轉發到后端的服務器。后端服務器處理請求后,將響應返回給反向代理服務器,反向代理服務器再將響應返回給客戶端。
2.負載均衡(Load Balancing)
負載均衡用于在多個服務器之間分配客戶端的請求,以優化資源利用、提高系統的可用性和可靠性。
主要功能
-
流量分配:
-
根據預設的算法(如輪詢、最少連接、加權等),將客戶端的請求分配到不同的服務器上,避免某一臺服務器過載。
-
常見的算法包括:
-
輪詢(Round Robin):按順序依次分配請求。
-
最少連接(Least Connections):優先分配到當前連接數最少的服務器。
-
加權輪詢(Weighted Round Robin):根據服務器的權重分配請求。
-
加權最少連接(Weighted Least Connections):結合權重和連接數分配請求。
-
IP哈希(IP Hash):根據客戶端的IP地址進行哈希計算,將請求分配到固定的服務器。
-
-
-
故障轉移(Failover):
-
當某一臺服務器出現故障時,能夠自動將流量切換到其他健康的服務器上,確保服務的持續可用。
-
負載均衡器會定期檢查后端服務器的健康狀態,自動移除故障服務器,并重新分配流量。
-
3.Nginx
主要特點
-
高性能:
-
Nginx采用事件驅動的異步非阻塞架構,能夠處理大量的并發連接,性能優于傳統的Apache服務器。
-
它可以輕松處理數萬個并發連接,適合高流量的網站。
-
-
反向代理和負載均衡:
-
Nginx可以作為反向代理服務器,將客戶端請求轉發到后端的多個服務器上,并根據配置的策略進行負載均衡。
-
支持多種負載均衡算法,如輪詢、最少連接、IP哈希等。
-
-
靜態文件服務:
-
Nginx對靜態文件(如HTML、CSS、JavaScript、圖片等)的處理非常高效,可以直接從磁盤讀取文件并返回給客戶端,減少后端服務器的負擔。
-
?2.Nginx啟動和停止
1.?啟動 Nginx
sudo systemctl start nginx
sudo nginx
-
說明:啟動 Nginx 服務。
2.?停止 Nginx
bash復制
sudo systemctl stop nginx
或者
bash復制
sudo nginx -s stop
-
說明:立即停止 Nginx 服務。
3.?重啟 Nginx
bash復制
sudo systemctl restart nginx
或者
bash復制
sudo nginx -s reload
-
說明:重新加載 Nginx 配置文件而不中斷現有連接。
4.?重新加載配置文件
bash復制
sudo nginx -s reload
-
說明:重新加載 Nginx 配置文件而不中斷現有連接。如果配置文件有語法錯誤,Nginx 會拒絕加載。
3.Nginx配置
/etc/nginx/nginx.conf
nginx.conf
├── 全局塊
├── events 塊
└── http 塊
? ? ├── 通用設置(日志、MIME等)
? ? ├── server 塊(一個網站)
? ? │ ? ├── listen / server_name
? ? │ ? ├── location /(靜態文件或反向代理)
? ? │ ? └── error_page
? ? └── ...
?
# 全局塊
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;# 事件塊
events {worker_connections 1024;
}# HTTP 塊
http {include mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;keepalive_timeout 65;# 1?? 定義后端服務集群(upstream)upstream my_backend {server 127.0.0.1:8081 weight=3 max_fails=3 fail_timeout=30s;server 127.0.0.1:8082 weight=1;}# 服務器塊server {listen 80;server_name localhost;# 位置塊location / {root /usr/share/nginx/html;index index.html index.htm;}# 錯誤頁error_page 404 /404.html;location = /404.html {root /usr/share/nginx/html;}# 反向代理示例location /api/ {proxy_pass http://127.0.0.1:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
}
?proxy_set_header Host $host;
-
proxy_set_header
指令用于設置轉發請求時的 HTTP 頭。 -
Host $host;
表示在轉發請求時,將原始請求的Host
頭設置為$host
(即客戶端請求的域名或 IP 地址)。這確保后端服務器能夠正確處理請求,因為它知道請求原本是針對哪個域名的。
proxy_set_header X-Real-IP $remote_addr;
-
這行配置設置了
X-Real-IP
頭,值為$remote_addr
,即客戶端的真實 IP 地址。 -
由于 Nginx 作為代理服務器,后端服務器看到的請求來源是 Nginx 的 IP 地址(通常是
127.0.0.1
)。通過設置X-Real-IP
,后端服務器可以知道實際發起請求的客戶端 IP 地址。
用途 | 配置示例 |
---|---|
靜態文件服務 | location / { root /path/to/html; } |
反向代理 | proxy_pass http://backend; |
負載均衡 | upstream backend { server 127.0.0.1:8001; server 127.0.0.1:8002; } |
HTTPS 配置 | 使用 listen 443 ssl; 和 ssl_certificate 等參數 |
3.Nginx安裝
1. 什么是 --with-stream
?
這個參數是用來啟用 Nginx 的 Stream 模塊的。
-
默認情況下,Nginx 只支持 HTTP、HTTPS 等基于應用層的協議。
-
加上
--with-stream
,你就可以讓 Nginx 作為 TCP 或 UDP 的反向代理使用,比如:-
代理 MySQL、Redis、FTP 等 TCP 服務
-
或者代理 DNS、QUIC 等 UDP 服務
-
2. 源碼安裝 Nginx 并啟用 --with-stream
1 下載官方 Nginx 源碼包:
wget http://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0
2. 配置編譯選項(重點是加上 --with-stream
):
./configure --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-stream \ --with-stream_ssl_module
3. 編譯并安裝:
make -j$(nproc) sudo make install
安裝完成后,nginx 會被裝在 /usr/local/nginx
下。
4.驗證安裝是否成功
/usr/local/nginx/sbin/nginx -V
#啟動 nginx:sudo /usr/local/nginx/sbin/nginx#然后查看是否啟動成功:ps aux | grep nginx
5.設置 nginx 命令軟鏈接(可選)
sudo ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
以后就可以直接用 nginx
命令了。
4.Nginx使用
1.準備多個后端服務
方法1:使用?nc
(netcat)模擬 TCP 服務
使用 nc
模擬兩個簡單的 TCP 服務,分別在端口 5001
和 5002
上監聽。
# 模擬兩個 TCP 后端服務器(不同端口)
nc -lk 5001 <<< "hello from backend 1"
nc -lk 5002 <<< "hello from backend 2"
-
-l
:監聽模式。 -
-k
:在連接關閉后繼續監聽。 -
<<<
:將字符串作為輸入傳遞給nc
。
這樣,你就有兩個簡單的 TCP 服務,分別在 5001
和 5002
上監聽。
2. 配置 Nginx 的?stream
?負載均衡
編輯你的 Nginx 配置文件 /usr/local/nginx/conf/nginx.conf
,添加如下內容(保留原來的 events {}
塊):
stream {upstream backend_group {least_conn; # 負載均衡策略:最少連接,可改為 round-robin(默認)server 127.0.0.1:5001 weight=1 max_fails=2 fail_timeout=20s;server 127.0.0.1:5002 weight=2 max_fails=4 fail_timeout=40s;# fail_timeout 多長時間內允許服務器失敗的次數達到 max_fails}server {listen 6000;proxy_pass backend_group;proxy_connect_timeout 3s; # 設置 Nginx 與后端服務器建立連接的超時時間tcp_nodelay on; # 禁用 Nagle 算法}
}
nginx -t
sudo nginx -s reload
3.測試負載均衡是否生效
使用 telnet
或 netcat
連接 Nginx 暴露的端口:
nc 127.0.0.1 6000
多次連接,或者從多個終端連接,你應該會輪流連接到 5001
和 5002
,分別輸出不同的 "hello from backend"
。
for i in {1..10}; do nc 127.0.0.1 6000; done
觀察輸出是否輪流從兩個后端返回。
5.查看網絡連接狀態
sudo netstat -tanp
是一個常用的 Linux 命令,用于顯示當前系統中所有網絡連接的狀態。這個命令可以幫助你查看哪些進程正在監聽特定端口,以及當前的網絡連接情況。
命令解釋
-
netstat
:顯示網絡連接、路由表、接口統計等網絡相關信息。 -
-t
:顯示 TCP 連接。 -
-a
:顯示所有網絡連接(包括監聽和非監聽狀態)。 -
-n
:顯示數字形式的地址和端口,而不是解析為域名或服務名稱。 -
-p
:顯示每個連接的進程 ID 和進程名稱。