1. 程式人生 > >nginx作為反向代理常用模塊

nginx作為反向代理常用模塊

創建 減少 大小 upd level mod 區別 正則表達 fcgi

什麽是反向代理?
反向代理簡單講就是代理後端服務器響應客戶端請求的服務器。我的理解,反向代理也可以理解為工作在7層應用層的負載均衡服務器
為什麽需要反向代理?
1.隱藏後端主機
2.更好的管理後端各主機的路由狀況
3.靈活的分配後端服務器資源
4.根據具體服務進行轉發。
nginx如何實現反向代理功能?
最簡單的例子:
location / {
proxy_pass http://localhost:8000; #將匹配此location的請求發送到http://localhost:80000處理
proxy_set_header Host $host; #自定義首部發送到後端主機
proxy_set_header X-Real-IP $remote_addr;
}

nginx作為反向代理常用的模塊
1.proxy_pass URL;
proxy_pass是nginx作為反向代理最關鍵的一個指令
例:
location /name/ {
proxy_pass http://127.0.0.1/remote/;
}
在這個例子中,假如用戶訪問路徑是www.baidu.com/name/,那麽實際訪問路徑是remote/目錄
proxy_pass會將location下的URI,另外若proxy_pass後面只有IP,如:proxy_pass http://18.18.18.18,這時後面的/加與不加區別很大
當location後使用正則表達式模式匹配,if語句或limt_execept時,proxy_pass後面是不能加URI的

2.proxy_set_header field value;
用來使代理服務器修改發往後端服務器的報頭文件的,因為後端服務器所接收並處理的請求實際是由代理服務器發送來的,後端主機並不知道客戶端的信息,在後期做日誌分析時就無法查詢真正的請求來源,雖然真正的客戶端來源記錄是代理服務器處理的,但一般為了盡量減少代理服務器的磁盤IO代理服務器是不做日誌的,所以就需要此參數將真正的客戶端來源IP把默認的來源IP(代理服務器IP)替換並發送至後端服務器。
例:
location / {
proxy_pass http://localhost:8000; #將匹配此location的請求發送到http://localhost:80000處理

proxy_set_header Host $host; #自定義首部發送到後端主機
proxy_set_header X-Real-IP $remote_addr;
}
X-Real-IP是自定義的守護,將它加入log文件的format中日誌便會記錄。
當生產環境中出現多級代理時需使用$proxy_add_x_forwarded_for,此參數做的是往後添加,而非替換
同理,反向代理也能修改發往客戶端的包頭文件,將真正的後端服務器IP或者代理服務器IP響應給客戶端,這就需要用到專門的報頭模塊ngx_http_headers_module模塊。如:add_header就是用來修改由代理服務器發送至客戶端的指令。例:add_header X-Via $server_addr;

3.nginx作為代理服務器時的緩存模塊。
什麽是緩存?
一般所說的緩存就是將數據臨時存放在內存中,當需要用到數據或程序時,直接從內存中讀取,因為內存的讀寫速度與磁盤IO不是一個量級,所以使用緩存能極大的提高系統使用效率。
為什麽需要緩存?
在nginx作為代理服務器時,會同時處理大量的請求與響應,若每一次都需要用到磁盤IO會極大地影響架構的性能,所以一般會將請求頻率較高的數據作為緩存並緩存至代理服務器,當客戶端請求時會直接響應,不再向後端發起網絡或磁盤IO。
nginx是如何構建緩存的?
根據請求做hash計算創建樹狀結目錄,並建立hash表,將hash表存放在內存中,當接收到用戶請求後查找hash表並根據查找結果讀取數據所在目錄並相應。一般只緩存GET,HEAD
proxy_cache_path #只能用在http下#
例:proxy_cache_path /data/nginx/cache levels=1:1:1 keys_zone=one:10m max_size=2g; #定義緩存目錄為/data/nginx/cache,創建3級子目錄,每級子目錄分別有16個目錄,鍵大小為10兆,鍵名為one,緩存的最大空間為2g
proxy_cache_path只能用在http中定義,在http中定義完成proxy_cache_path後,還需要在server或location中定義一下幾個參數
1.prox_cache_key
定義緩存的鍵與空間大小的,也可以理解為定義緩存的名稱與占用空間大小
例:proxy_cache_key NAME;
2.proxy_cache_methods
定義客戶端請求的那些內容會被緩存,默認是GET HEAD
例:proxy_cache_methods GET HEAD POST
3.prox_cache_min_uses
例:proxy_cache_min_uses 2;
定義緩存的最小使用次數,即當客戶端請求某一資源時達到設定次數時才會被緩存
4.prox_cache_valid
對不同的緩存定義不同的有效時間
例:proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
5.prox_cache_use_stale
定義時候允許使用過期的緩存,這裏的過期是指後端服務器更新資源後,緩存的內容不再是最新的了。
例:error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;

4.超時模塊
在實際環境中,常常會遇到連接異常中斷的情況,所以需要定義響應超時的時間。
1.prox_connect_timeout
定義代理向後端服務建立連接(TCP三次握手)的超時時間,默認是60秒,最長為75秒
例:proxy_connect_timeout 10;
2.proxy_read_timeout
定義代理與後端服務建立連接後,後端讀取響應給代理的超時時間
3.proxy_send_timeout
向後端發送請求的超時時間

5.fastcgi模塊
由於nginx是一個處理靜態內容的工具,但當用戶請求為動態內容時,就需要使用fastcgi協議將動態內容交由php來處理並響應給代理再響應客戶端。
fcgi傳輸處理請求的能力不如httpd,常常會用到lnamp架構。當用戶請求靜態資源時就在本地處理並響應,當客戶端請求的是動態資源時由nginx作為代理轉發至後端AP服務器,之間用http協議進行傳輸,這樣能提高性能。
總結:1.如何實現代理,如何實現映射
2.如何建立緩存實現加速
3.連接超時時長的定義

nginx作為反向代理常用模塊