高性能web服務器Nginx反向代理、動靜分離和負載均衡

反向代理

反向代理可以理解為客服端和服務端溝通經過一個代理,代理來分發請求

Nginx通常被用作後端服務器的反向代理,這樣就可以很方便的實現動靜分離,以及負載均衡,從而大大提高服務器的處理能力。

常用配置

高性能web服務器Nginx反向代理、動靜分離和負載均衡

高性能web服務器Nginx反向代理、動靜分離和負載均衡

第二種配置方式用了upstream,可以為之後負載均衡做準備

動靜分離

動靜分離,動態內容如php,jsp的頁面必須由服務端動態處理,就轉發到tomcat之類的容器,靜態內容如圖片,html就直接訪問文件

Nginx實現動靜分離,其實就是在反向隊裡的時候,如果是靜態資源,那麼就直接從Nginx發佈的路徑去讀取,而不需要從後臺服務器後去了

注意:這種情況下需要保證後端跟前端的程序保持一致,可以Rsync做服務端自動同步或者使用NFS、MFS分佈式共享存儲

如:

高性能web服務器Nginx反向代理、動靜分離和負載均衡

匹配jpg|jpeg|gif|png|swf|ico後綴的文件就直接在root的路徑找

負載均衡

Nginx通過upstream模塊來實現簡單的負載均衡

常用指令

ip_hash

語法:ip_hash

默認值:none

使用字段:upstream

這個指令將基於客戶端連接的IP地址來分發請求。

哈希的關鍵字是客戶端的C類網絡地址,這個功能將保證這個客戶端請求總是被轉發到一臺服務器上,但是如果這臺服務器不可用,那麼請求將轉發到另外的服務器上,這將保證某個客戶端有很大概率總是連接到一臺服務器。

無法將權重(weight)與ip_hash聯合使用來分發連接。如果有某臺服務器不可用,你必須標記其為“down”,如下例:

高性能web服務器Nginx反向代理、動靜分離和負載均衡

注意:即使是由同一臺機子發出的請求也不一定訪問到同一個服務器,可能這臺機子也使用了代理,使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指令搭配使用)。

示例配置

高性能web服務器Nginx反向代理、動靜分離和負載均衡

注意:如果你只使用一臺上游服務器,nginx將設置一個內置變量為1,即max_fails和fail_timeout參數不會被處理。

結果:如果nginx不能連接到上游,請求將丟失。

解決:使用多臺上游服務器。

upstream

語法:upstream name { … }

默認值:none

使用字段:http

這個字段設置一群服務器,可以將這個字段放在proxy_pass和fastcgi_pass指令中作為一個單獨的實體,它們可以可以是監聽不同端口的服務器,並且也可以是同時監聽TCP和Unix socket的服務器。

服務器可以指定不同的權重,默認為1。

示例配置

高性能web服務器Nginx反向代理、動靜分離和負載均衡

請求將按照輪詢的方式分發到後端服務器,但同時也會考慮權重。

在上面的例子中如果每次發生7個請求,5個請求將被髮送到backend1.example.com,其他兩臺將分別得到一個請求,如果有一臺服務器不可用,那麼請求將被轉發到下一臺服務器,直到所有的服務器檢查都通過。如果所有的服務器都無法通過檢查,那麼將返回給客戶端最後一臺工作的服務器產生的結果。

Geo和GeoIP模塊

這兩個模塊主要用於做全局的負載均衡,可以根據不同的客戶端來訪問不同的服務器,示例如下

高性能web服務器Nginx反向代理、動靜分離和負載均衡


分享到:


相關文章: