Web Server & Nginx

Web Server 是什麼?

以硬體來說

  • 存放網路伺服器軟體、還有網站檔案(如 HTML 文件、圖片、CSS 樣式表、JavaScript 檔案)的電腦。
     
  • 它會連上網際網路(Internet)並能和其他連上網的設備做物理數據交換。
    • 如何做數據交換? → http 超文本協定

以軟體來說

  • 包含了一連串控制網路用戶如何訪問託管檔案──至少有 HTTP 伺服器──的檔案。
  • HTTP 伺服器是其中一個部份,它理解 URLs(網路地址)與 HTTP(瀏覽器用來觀察網頁的協議)。
    • 透過域名(domain name)訪問託管的網站(如 mozilla.org)、並將其內容遞送到終端用戶(end-user)的設備上。

運作圖

Static & Dynamic

Static Web Server

  • Server 會回傳你事先寫好的靜態檔案,並且無法對其更動、修改。
     
  • 靜態檔案如 HTML 文件、和附屬的 asset
    • asset 包含了圖片、CSS 樣式表、JavaScript 檔案、字型檔、還有影片等。

Dynamic Web Server

  • 除了上述靜態資料以外、還附加了一些軟體: 通常是應用伺服器(application server)與資料庫(database)
    • 應用伺服器能在資料回傳到瀏覽器之前更新它們。(處理商業邏輯、簡化請求流程)
      • 其實就是我們平常在寫的後端語言&其框架

透過 Http 溝通

  • 指定兩台電腦之間,該如何傳送超文本(例如 linked web document)

    • 協議(Protocol)是一套兩台電腦間該如何溝通的規則

  • HTTP 提供了用戶端與伺服器端,該如何溝通的明確規則。

    • 只有用戶端能發出 HTTP 請求,也只有伺服器能接受它。

      • 相對地,也只有伺服器能回應用戶端的 HTTP 請求。

    • 如果透過 HTTP 請求檔案,用戶端必須提供檔案的 URL

    • 網路伺服器必須回應所有的 HTTP 請求,最起碼需要回應錯誤訊息。

Http 兩大特色

  1. 文本性(Textual)
    • 所有指令都是純文字、人類也容易理解。

  2. 無狀態(Stateless)
    • 無論伺服器還是瀏覽器,都不會記得他們上一次的溝通。

Serve a static server SOP

  1. 在本地端寫一個簡單的 index.html 網頁

  2. 在該資料夾 npm install -g http-server

    • 以 node.js 運作的框架,通常都有幫你跑 http-server

  3. 安裝完後,在 index.html 的目錄下執行http-server

    • 用本地瀏覽器連到 http://localhost:port
  4. ngrok 將本地port 8080的HTTP伺服器開放出去

    • ngrok 能讓你的 localhost 對應到一個 http domain

Nginx

輕量級的Web server / 反向代理伺服器

同時也是 電子郵件代理伺服器

相較於 Apache 佔有記憶體更少,穩定性更高,並併發能力強,具有豐富的模組庫以及靈活的資源配置

正向代理 ( proxy )

  • 由於 Google 有防火牆阻擋,因此借助 VPN 來訪問 Google
  • 正向代理「代理」的是「客户端」,客户端是知道 Server 是誰,但 Server 端不知道客户端是通過 VPN 訪問的

反向代理 ( Reverse Proxy )

  • 反向代理是在真實伺服器與客戶端間的代理伺服器

  • 當使用者透過客戶端 (瀏覽器) 訪問網站時,反向代理伺服器會將請求轉送到背後的真實伺服器,再將網站的結果傳送給客戶端。

  • 真實伺服器可能是本機的其他 Port,也可能在內部網路,或者在其他外部網路,這樣使用者不會知道真實的伺服器在那裡,可以隱藏真正伺服器的位置,而且也可以實現 load balancing.

Load Balancing :支援多主機負載平衡

  • 負載均衡能夠平均分配客戶請求到伺服器陣列,藉此提供快速獲取重要資料,解決大量併發訪問服務問題
  • 這種叢集技術可以用最少的投資獲得接近於大型主機的效能。
     
  • 以下將介紹 三種實現負載平衡的方式
    •  round -robin 、least-connected、IP-hash

round-robin:標準(預設)輪詢方式

假設所有伺服器的處理效能都相同,不關心每臺伺服器的當前連線數和響應速度。

適合於伺服器組中的所有伺服器都有相同的軟硬體配置並且平均伺服器請求相對均衡的情況。

另有 Weight Round Robin (加權輪詢方式)
可以設置不同 Server 的權重

原理

  • 每一次把來自使用者的請求輪流分配給內部中的伺服器,從1開始,直到N(內部伺服器個數),然後重新開始迴圈

​優點

  • 簡潔性,它無需記錄當前所有連線的狀態,所以它是一種無狀態排程。

缺點

  • 當請求服務間隔時間變化比較大時,輪詢排程演算法容易導致伺服器間的負載不平衡。

least-connected:最少連線

當連線進來時會把 Request 導向連線數較少的 Server

  • 是一種動態排程短演算法,它通過伺服器當前所活躍的連線數來估計伺服器的負載均衡。
  • 排程器需要記錄各個伺服器已建立連線的數目,當一個請求被排程到某臺伺服器,其連線數加1,當連線中止或超時,其連線數減一,在系統實現時,我們也引入當伺服器的權值為0時,表示該伺服器不可用而不被排程。

IP-hash:依據 Client IP 來分配到不同台 Server 

  • 通過一個雜湊(Hash)函式將一個 IP地址 對映到一臺伺服器。
  • 先根據請求的目標IP地址,作為雜湊鍵(Hash Key)從靜態分配的散列表找出對應的伺服器。
    • 若該伺服器是可用的且未超載,將請求傳送到該伺服器,否則返回空。
    • 除非斷線或ip變動,同個 ip 的請求都會導入到同一個 sever

實作 load balance:撰寫配置檔

# upstream 用於定義load balance
# 預設行為為round robin 這邊用權重來當範例
# parker 為自行定義的名稱

upstream parker {
  server 192.168.88.116 weight=1;
  server 192.168.88.117 weight=2;
}

#定義nginx開放port 9999
#使用者連線 192.168.88.115會自動導入到後端兩台web server
#proxy_pass 定義自動導入的位置

server {
  listen 9999;
  server_name 192.168.88.115;
location / {
  proxy_pass http://parker;
}
}

/etc/nginx/conf.d/nginx.conf

Made with Slides.com