Skip to content
Miliya's Expedition
Go back

什麼是 Nginx?

當軟體工程師開發完網路應用程式時,要如何讓用戶能與應用程式系統能夠彼此交流,且能讓系統同時與多位用戶交流呢?

需要有一個【中間人】能夠把客戶端的資料與請求(request)傳給系統端,同時把系統端的回應資料傳給客戶端,同時確保傳輸的資料被安全保護不會被潛在攻擊者從中攔截,而這個中間人就是網頁伺服器(Web Server)。

Web Server的核心作用

  1. 客戶端與系統端之間的資料傳輸
  2. 傳輸期間保護資料安全
  3. 24小時在線等待用戶發送請求

Nginx就是目前主流常用的網頁伺服器之一。

Nginx的特色

1. 反向代理

在一般的正向代理中,網頁伺服器傳送多個客戶端發送的請求給系統端時,系統端無法區別出這些請求只會回應請求要的資料而已,而客戶端能知道收到的資料來自系統的哪裡以及從哪一台主機傳來的。

反向代理正好相反,系統端能是區別出不同的請求,並且客戶端無法從取得的回應知道系統的相關資訊,這能確保系統端的伺服器結構與系統資訊能得到安全保護,減少被攻擊的可能性。

2. 高流量負載平衡

Nginx採用事件驅動架構,只有當事件發生時才會處理,在沒有事件時,會處於閒置或處理其他任務,不會為了一個「可能等等發出請求」的客戶端(例如用戶還在讀網頁,沒點下一頁發送請求)預留一部分的算力與效能。不像Apache(另一種早期常見的Web Server)每一個客戶端都有專門的進程來接收請求。

可以理解成 Nginx為1 v.s 10,而Apache是1 v.s 1

也因此,當有1000個客戶端同時向Web Server發送請求時,Nginx能有效分配這些事件給不同的系統端伺服器,例如其中的100個事件交給快處理完上個請求的A伺服器,B伺服器正在忙著處理其他請求所以只給50個,C伺服器完全沒事幹所以負責200個事件,以此類推。

能夠避免某個客戶端發送請求後,需要花一段很長的等待時間才能收到系統伺服器的回應,同時也避免某臺系統伺服器過載而死當

3.HTTP快取

Nginx會把一些系統伺服器中的靜態資料或常用的動態內容留在自己手上,這樣一來系統伺服器能去處理新的請求或更複雜的運算,不需要為了簡單的事件或重複的資料再次向系統伺服器索取,這也就是為什麼在沒有更動系統程式架構的情況下,換一台Web Server能提升客戶端的使用體驗的原因

Nginx的優勢

  1. 統一窗口,隱藏並保護系統伺服器的資訊
  2. 流量分配,避免客戶端等待過久、系統伺服器過載
  3. 靜態與常用資料快取,讓客戶端快速取得資料的同時,提高系統伺服器的效能

實際應用

在Laravel開發的網頁應用程式中,我們會經常以下這種搭配

Nginx + PHP-FPM + 某一個資料庫系統

由Nginx負責它擅長的事情(分配流量、快取呈現)

PHP-FPM負責管理PHP相關的程序並預設啟動一些PHP常用的進程(Worker),等待Laravel進行較複雜的邏輯運算。

他們之間常用的合作模式為 當Nginx遇到請求讀取.php檔案時,Nginx會直接請求傳給PHP-FPM處理後立即處理其他的事情,直到PHP-FPM把事情處理好後,Nginx再回來把資料傳回客戶端

這麼做的好處不只如此,

常用搭配的好處 各司其職,彼此獨立,有效釐清異常


同場加映


Share this post on:

Previous Post
動態規劃Dynamic Programming
Next Post
什麼是 Cache?