Nginx反向代理、動靜分離和負載均衡
- 2019 年 11 月 23 日
- 筆記
反向代理
反向代理可以理解為客服端和服務端溝通經過一個代理,代理來分發請求
Nginx通常被用作後端伺服器的反向代理,這樣就可以很方便的實現動靜分離,以及負載均衡,從而大大提高伺服器的處理能力。
常用配置

或

第二種配置方式用了upstream,可以為之後負載均衡做準備
動靜分離
動靜分離,動態內容如php,jsp的頁面必須由服務端動態處理,就轉發到tomcat之類的容器,靜態內容如圖片,html就直接訪問文件
Nginx實現動靜分離,其實就是在反向隊里的時候,如果是靜態資源,那麼就直接從Nginx發布的路徑去讀取,而不需要從後台伺服器後去了
注意:這種情況下需要保證後端跟前端的程式保持一致,可以Rsync做服務端自動同步或者使用NFS、MFS分散式共享存儲
如:

匹配jpg|jpeg|gif|png|swf|ico後綴的文件就直接在root的路徑找
負載均衡
Nginx通過upstream模組來實現簡單的負載均衡
常用指令
ip_hash
語法:ip_hash
默認值:none
使用欄位:upstream
這個指令將基於客戶端連接的IP地址來分發請求。
哈希的關鍵字是客戶端的C類網路地址,這個功能將保證這個客戶端請求總是被轉發到一台伺服器上,但是如果這台伺服器不可用,那麼請求將轉發到另外的伺服器上,這將保證某個客戶端有很大概率總是連接到一台伺服器。
無法將權重(weight)與ip_hash聯合使用來分發連接。如果有某台伺服器不可用,你必須標記其為「down」,如下例:

注意:即使是由同一台機子發出的請求也不一定訪問到同一個伺服器,可能這台機子也使用了代理,使ip發生變化,或者訪問的伺服器down掉了
server
語法:server name [parameters]
默認值:none
使用欄位:upstream
指定後端伺服器的名稱和一些參數,可以使用域名,IP,埠,或者unix socket。如果指定為域名,則首先將其解析為IP。
weight = NUMBER – 設置伺服器權重,默認為1。
max_fails = NUMBER – 在一定時間內(這個時間在fail_timeout參數中設置)檢查這個伺服器是否可用時產生的最多失敗請求數,默認為1,將其設置為0可以關閉檢查,這些錯誤在proxy_next_upstream或fastcgi_next_upstream(404錯誤不會使max_fails增加)中定義。
fail_timeout = TIME – 在這個時間內產生了max_fails所設置大小的失敗嘗試連接請求後這個伺服器可能不可用,同樣它指定了伺服器不可用的時間(在下一次嘗試連接請求發起之前),默認為10秒,fail_timeout與前端響應時間沒有直接關係,不過可以使用proxy_connect_timeout和proxy_read_timeout來控制。
down – 標記伺服器處於離線狀態,通常和ip_hash一起使用。
backup – (0.6.7或更高)如果所有的非備份伺服器都宕機或繁忙,則使用本伺服器(無法和ip_hash指令搭配使用)。
示例配置

注意:如果你只使用一台上游伺服器,nginx將設置一個內置變數為1,即max_fails和fail_timeout參數不會被處理。
結果:如果nginx不能連接到上游,請求將丟失。
解決:使用多台上游伺服器。
upstream
語法:upstream name { … }
默認值:none
使用欄位:http
這個欄位設置一群伺服器,可以將這個欄位放在proxy_pass和fastcgi_pass指令中作為一個單獨的實體,它們可以可以是監聽不同埠的伺服器,並且也可以是同時監聽TCP和Unix socket的伺服器。
伺服器可以指定不同的權重,默認為1。
示例配置

請求將按照輪詢的方式分發到後端伺服器,但同時也會考慮權重。
在上面的例子中如果每次發生7個請求,5個請求將被發送到backend1.example.com,其他兩台將分別得到一個請求,如果有一台伺服器不可用,那麼請求將被轉發到下一台伺服器,直到所有的伺服器檢查都通過。如果所有的伺服器都無法通過檢查,那麼將返回給客戶端最後一台工作的伺服器產生的結果。
Geo和GeoIP模組
這兩個模組主要用於做全局的負載均衡,可以根據不同的客戶端來訪問不同的伺服器,示例如下

由「IT大咖說(ID:itdakashuo)」原創的文章,轉載時請註明作者、出處及微信公眾號。