什麼是 Nginx?

2025年7月17日

💎 加入 E+ 成長計畫 與超過 700+ 位工程師一同在社群成長,並獲得更多深度的軟體前後端學習資源

在開發網路應用程式時,如果要處理數千個併發連線的狀況,傳統的網路伺服器會遇到效能瓶頸。這個限制又被稱為 C10K 問題 (處理 10,000 個併發連線的挑戰),之所以會有這種瓶頸,是因為舊式的網路伺服器會為每個連線都建立新的進程或執行緒,消耗大量記憶體和 CPU 資源。

Nginx 透過事件驅動、非同步架構解決了這個問題,讓開發者能用最少的資源處理超過 10,000 個併發連線。Nginx 是由 Igor Sysoev 在 2004 年特別為了解決這些擴展性挑戰而開發的,現在已經成為許多科技公司、高流量網站的基礎架構。不過, Nginx 具體是什麼? 為什麼後端工程師需要知道它?

可以把 Nginx 想像成網路應用程式的終極交通控制器。就像熟練的交通警察能讓車輛順暢地通過繁忙的路口,Nginx 位於使用者和應用程式伺服器之間,智慧地管理請求,確保一切運作順暢。

從核心來看,Nginx 是一個網路伺服器,但它比一般的網路伺服器更強大——它可以同時作為反向代理、負載平衡器和 HTTP 快取。

Nginx 作為反向代理

先從反向代理開始說起,這個名詞聽起來可能有點複雜,但實際上很簡單。但為什麼稱為「反向」呢?一般的代理(或稱為正向代理)位於客戶端和網際網路之間,向伺服器隱藏客戶端的身份。反向代理則相反——它位於網際網路和伺服器之間,向客戶端隱藏伺服器的細節。

把 Nginx 想像成大型辦公大樓的接待員。當訪客到達時,他們不需要知道行銷部門在哪一層,或者執行長是在會議室 A 還是 B。他們只需要告訴接待員自己需要什麼,接待員就會指引他們到正確的地方。

同樣地,當使用者向你的網站發出請求時,他們不需要知道後端伺服器中的哪一台應該處理他們的請求——Nginx 會為他們解決這個問題。

這種設置提供了關鍵的好處:它向潛在的攻擊者隱藏了內部伺服器結構,在一個地方處理 SSL 加密,並且可以將不同類型的請求路由到專門的伺服器。

Nginx 反向代理流程

    客戶端                    Nginx               應用程式伺服器
      🌐     ────請求───>    🔶     ────請求───>    💾💾💾
             <───回應───          <───回應───

• 客戶端向 Nginx (網路伺服器) 發送請求
Nginx 將請求轉發到適當的應用程式伺服器
• 應用程式伺服器處理並透過 Nginx 傳回回應
• 客戶端接收回應,但不知道後端詳細資訊

Nginx 作為負載平衡器

但是當你的網站流量增長到超過單一後端伺服器能夠處理的範圍時,會發生什麼情況呢?這時負載平衡就派上用場了。當你的應用程式成長,一台伺服器已經不足以處理所有流量時,你可以部署多台運行相同應用程式副本的伺服器。

接著 Nginx 可以使用各種演算法將傳入的請求分配到這些伺服器上。最常見的方法是循環配置(round-robin,輪流將請求分配給每台伺服器),但如果你的伺服器有不同的能力,你可能會選擇最少連線數(least-connections,將請求發送到處理最少活動連線的伺服器),或者如果你需要會話一致性,可以使用 IP 雜湊(IP hash,始終將同一個使用者發送到同一台伺服器)。

這種方法帶來了顯著的好處:你的應用程式可以處理更高的流量,提供更好的可靠性(如果一台伺服器故障,其他伺服器會繼續提供服務),並且透過防止任何單一伺服器過載來改善回應時間。

Nginx 負載平衡

多個客戶端                           Nginx                    多台伺服器
     🌐 ────────────────────┐                  ┌─────────────> 💾💾💾
                            │                  │
     🌐 ────────────────────┤─────> 🔶 ────────┼─────────────> 💾💾💾
                            │                  │
     🌐 ────────────────────┘                  └─────────────> 💾💾💾

• 多個客戶端向 Nginx 發送請求
Nginx 將請求分配到多台後端伺服器
• 每台伺服器同時處理不同的請求
• 提供更高的容量和冗餘

Nginx 的 HTTP 快取

現在,這裡是最有趣的部分。如果我們告訴你 Nginx 可以在不更改任何後端程式碼的情況下,讓你的應用程式感覺快很多,會如何呢?這就是 HTTP 快取成為秘密武器的地方。

把它想像成一個聰明的服務生,記住你平常點的餐點。當你重複請求相同的資料時——比如你網站的標誌、CSS 檔案,甚至是不經常變更的 API 回應——Nginx 可以將這些回應儲存在記憶體中。

與其每次有人需要這些檔案時都去麻煩你的後端伺服器,Nginx 直接從它的快取中提供這些檔案。結果是什麼?回應時間可以從 500 毫秒降低到僅僅 50 毫秒,而你的後端伺服器可以專注於處理新的動態內容,而不是重複提供靜態檔案。

Nginx HTTP 快取

第一次請求:
🌐 ──請求──> 🔶 ──請求──> 💾💾💾
   <─回應──   <─回應──   (500ms)


                  📁 快取

後續請求:
🌐 ──請求──> 🔶 ──────────────> 💾💾💾
   <─回應──                   (伺服器空閒)

                📁 快取 (50ms)

• 第一次請求:Nginx 從伺服器取得並快取回應
• 後續請求:Nginx 直接從快取提供(快 10 倍)

什麼時候使用 Nginx

那麼什麼時候應該考慮使用 Nginx 呢?如果你正在建構任何比簡單原型更複雜的東西,Nginx 從第一天開始就能幫助你。無論你是在建立需要處理併發使用者的 REST API,建構同時提供靜態檔案和動態內容的網路應用程式,或者為最終需要多台伺服器的成長做準備,Nginx 都為可擴展架構提供了基礎。

Nginx 的美妙之處在於它的靈活性——你可以從基本的反向代理功能開始,然後隨著需求增長逐漸加入負載平衡和快取。無論你是在建構小型個人專案還是為企業級流量做準備,Nginx 都提供了確保你的應用程式保持快速、可靠和可擴展的工具。


加入 E+ 成長計畫

如果你覺得這篇內容有幫助,喜歡我們的內容,歡迎加入 ExplainThis 籌辦的 E+ 成長計畫,透過每週的深度主題文,以及技術討論社群,讓讀者在前端、後端、軟體工程的領域上持續成長。

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們