Nginx 反向代理 負載平衡 HTTPS 憑證管理 Web Server 架構

Nginx 反向代理,為什麼幾乎每個網站都會用到?

EZ Tech 編輯部

如果你去翻大多數正式上線的網站的伺服器架構,幾乎都會看到 Nginx 的身影。它有時是 Web Server,有時是反向代理,有時兩個角色同時扮演。

但 Nginx 到底在做什麼?為什麼不直接讓你的應用程式直接接受外部請求就好?


直連的問題

想像一個最簡單的架構:一台伺服器,上面跑著你的 Node.js 或 Python 應用程式,監聽某個 Port(比如 3000),外部請求直接打進來。

這個架構在開發測試時完全沒問題,但在正式環境會遇到幾件麻煩事:

HTTPS 怎麼做? 你的應用程式需要管理 SSL/TLS 憑證,每個服務都要自己處理,憑證到期、更新、設定都是工作量。

流量多了怎麼辦? 一個應用程式實例能處理的同時請求是有上限的。流量大了,只能啟動更多實例,但怎麼把請求分散到不同實例上?

靜態檔案怎麼處理? CSS、圖片、JS 這些靜態資源,其實不需要你的應用程式去處理,但如果請求都打到應用程式,它還是要跑這些不必要的邏輯。

多個服務怎麼共用同一個 IP? 你在同一台機器上跑了前端、後端 API、文件系統三個服務,但外部只有一個 IP,請求進來要怎麼分?

Nginx 解決的正是這些問題。


什麼是反向代理

代理(Proxy)的概念是「代替某人去做某件事」。

正向代理是你替客戶端代勞:客戶端的請求不直接出去,先到代理伺服器,代理去取得資源後再回傳。VPN 就是這種邏輯。

反向代理是你替伺服器端代勞:外部請求不直接到你的應用程式,先到反向代理,它再把請求轉發給內部的服務。

Nginx 作為反向代理,就是站在你的應用程式前面,幫它處理那些它不需要自己做的事。


Nginx 在實際架構裡做了什麼

HTTPS 終止(SSL Termination): 憑證管理統一在 Nginx 這一層處理。外部打來的是 HTTPS,Nginx 解密後,內部應用程式收到的是普通的 HTTP。這樣每個應用程式不需要各自管理憑證,憑證更新(現在通常用 Let’s Encrypt 自動更新)也只在 Nginx 這裡做一次就好。

負載平衡: Nginx 可以把進來的請求分散到多個應用程式實例。你在背後同時跑著三個 Node.js 實例,Nginx 用 round-robin 或 least connections 等策略把請求均勻分配,某個實例掛了,Nginx 自動不再分請求給它。

靜態資源直接服務: 圖片、CSS、JS 這類靜態檔案,Nginx 可以直接讀取檔案系統回傳,根本不需要讓應用程式知道。這讓應用程式只專注在真正需要動態處理的邏輯上,效率高很多。

路由分發: 同一個 IP 上跑著多個服務,Nginx 可以根據域名或 URL 路徑決定轉發到哪裡。api.example.com 轉到後端 API,example.com 轉到前端靜態站,docs.example.com 轉到文件系統,全部在 Nginx 的設定裡完成。


一個典型的設定長這樣

以一個前後端分離的網站為例,Nginx 設定大概會這樣寫:

server {
    listen 443 ssl;
    server_name example.com;

    # HTTPS 憑證
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # 靜態資源直接服務
    location /static/ {
        root /var/www/;
    }

    # API 請求轉發到後端
    location /api/ {
        proxy_pass http://localhost:3000;
    }

    # 其他請求轉發到前端
    location / {
        proxy_pass http://localhost:4000;
    }
}

這幾十行設定,解決了 HTTPS、靜態資源、路由分發三個問題。不需要改你的應用程式,只是在前面加了一層。


為什麼不用 Apache?

Nginx 和 Apache 是兩個最常被比較的 Web Server。Apache 更老、功能同樣豐富,在靜態網站托管上歷史悠久。

但 Nginx 的架構在處理大量同時連線時效能更好,尤其是面對很多維持長時間連線的請求(如 WebSocket、long polling),Nginx 的事件驅動模型比 Apache 的進程模型更省資源。

這是為什麼現代的部署幾乎都預設選 Nginx,尤其是高流量或需要 WebSocket 的服務。


Nginx 不是什麼神秘的東西,它就是一個在你的應用程式前面站崗的中間層。正是因為這個中間層存在,你的應用程式可以只專注在業務邏輯,HTTPS、負載、路由這些「門口的事」都交給 Nginx 處理。

準備好開始你的專案了嗎?

讓我們一起規劃最適合的數位解決方案,從需求訪談到上線部署,全程陪伴。

Start a Project →