在現代的 Web 開發和運維中,一個系統往往由多個后端服務組成,每個服務負責不同的功能模塊。例如,一個電商網站可能包括用戶服務、訂單服務和支付服務,每個服務都運行在獨立的服務器或容器中。為了高效地管理這些服務并提供統一的訪問接口,Nginx 作為反向代理服務器的角色變得至關重要。
場景概述
假設我們有以下三個后端服務,每個服務對應不同的域名:
- A 服務:域名
demoai.cn
,后端運行在http://127.0.0.1:8815
- B 服務:域名
bb.demoai.cn
,后端運行在http://127.0.0.1:8816
- C 服務:域名
cc.demoai.cn
,后端運行在http://127.0.0.1:8817
我們的目標是通過 Nginx 配置,將用戶對這些域名的請求正確地轉發到對應的后端服務,并確保整個過程安全、高效。
Nginx 配置詳解
1. 全局配置
首先,我們定義 Nginx 的全局配置,包括工作進程數和每個進程的最大連接數:
worker_processes 1;
events {worker_connections 1024;
}
worker_processes
:設置 Nginx 使用的工作進程數。對于小型應用或開發環境,設置為1
是足夠的。在生產環境中,通常會設置為 CPU 核心數。worker_connections
:每個工作進程可以處理的最大連接數。根據你的服務器性能和預期流量調整此值。
2. HTTP 配置
接下來,我們定義 HTTP 配置塊,包含一些通用的設置:
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;
include mime.types
:加載 MIME 類型配置文件,確保 Nginx 能夠正確處理各種文件類型。default_type
:設置默認的 MIME 類型。sendfile on
:啟用高效文件傳輸,適用于靜態文件服務。keepalive_timeout
:設置客戶端連接保持活動的時間。
3. HTTP 重定向到 HTTPS
為了確保所有 HTTP 請求都被重定向到 HTTPS,我們配置一個 server
塊:
server {listen 80;server_name demoai.cn bb.demoai.cn cc.demoai.cn;rewrite ^(.*)$ https://$host$1 permanent;
}
listen 80
:監聽 HTTP 端口 80。server_name
:包含所有可能的域名。rewrite
:將所有 HTTP 請求重定向到 HTTPS,使用 301 永久重定向。
4. HTTPS 配置
為每個域名配置一個獨立的 server
塊,指定不同的 proxy_pass
目標,將請求轉發到對應的后端服務。
A 服務(demoai.cn
)
server {listen 443 ssl;server_name demoai.cn;ssl_certificate /root/card/demoai.cn_bundle.pem;ssl_certificate_key /root/card/demoai.cn.key;location / {proxy_pass http://127.0.0.1:8815; # A服務的后端地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}
B 服務(bb.demoai.cn
)
server {listen 443 ssl;server_name bb.demoai.cn;ssl_certificate /root/card/demoai.cn_bundle.pem;ssl_certificate_key /root/card/demoai.cn.key;location / {proxy_pass http://127.0.0.1:8816; # B服務的后端地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}
C 服務(cc.demoai.cn
)
server {listen 443 ssl;server_name cc.demoai.cn;ssl_certificate /root/card/demoai.cn_bundle.pem;ssl_certificate_key /root/card/demoai.cn.key;location / {proxy_pass http://127.0.0.1:8817; # C服務的后端地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}
5. 通用配置
每個 server
塊中都包含了以下通用配置:
proxy_set_header
:設置轉發的 HTTP 頭,確保后端服務可以獲取正確的客戶端信息。error_page
:定義錯誤頁面的路徑。location = /50x.html
:指定錯誤頁面的根目錄。
后端服務部署
確保每個后端服務(如 Docker 容器)正在運行,并且監聽在指定的端口上。例如:
# 啟動 A 服務
docker run -d --name a-service -p 8815:80 aa-website:latest# 啟動 B 服務
docker run -d --name b-service -p 8816:80 bb-website:latest# 啟動 C 服務
docker run -d --name c-service -p 8817:80 cc-website:latest
測試與驗證
-
檢查 Nginx 配置
nginx -t
確保配置文件沒有語法錯誤。
-
重新加載 Nginx
nginx -s reload
-
訪問服務
- 訪問
https://demoai.cn
,應轉發到http://127.0.0.1:8815
。 - 訪問
https://bb.demoai.cn
,應轉發到http://127.0.0.1:8816
。 - 訪問
https://cc.demoai.cn
,應轉發到http://127.0.0.1:8817
。
- 訪問
常見問題與解決方法
1. 網絡問題
如果你在訪問某些服務時遇到問題(如無法解析 http://127.0.0.1:8815
),可能是由于以下原因之一:
- 后端服務未運行:確保 Docker 容器正在運行。
docker ps
- 網絡問題:確保本地網絡沒有問題,可以嘗試直接訪問后端服務的地址。
curl http://127.0.0.1:8815
- 防火墻限制:確保沒有防火墻規則阻止訪問指定端口。
sudo ufw allow 8815/tcp sudo ufw allow 8816/tcp sudo ufw allow 8817/tcp
2. 配置錯誤
檢查 Nginx 配置文件是否有拼寫錯誤或邏輯問題。可以使用以下命令測試配置文件:
nginx -t
3. SSL 證書問題
確保 SSL 證書和私鑰路徑正確,并且文件權限正確。例如:
ls -l /root/card/demoai.cn_bundle.pem
ls -l /root/card/demoai.cn.key
結論
通過合理配置 Nginx,可以高效地管理多個后端服務,確保每個域名的請求都被正確轉發到對應的后端服務。這種配置不僅提高了系統的可維護性,還增強了安全性(通過 HTTPS)。希望本文的示例和解決方法能幫助你在實際項目中快速實現高效的多后端服務管理。