概述:
本篇主要總結(jié)Nginx實現(xiàn)反向代理和負(fù)載均衡功能相關(guān)模塊的配置說明。主要使用到的模塊如下:
ngx_http_proxy_module
Nginx實現(xiàn)反向代理功能
ngx_http_upstream_module
Nginx反向代理時實現(xiàn)負(fù)載均衡、會話保持等功能
一、Nginx:http/https協(xié)議反向代理(ngx_http_proxy_module)
1.反向代理
反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請求連接的客戶端,此時站在服務(wù)器角度來看,代理服務(wù)器對外就表現(xiàn)為一個反向代理服務(wù)器。
對反向代理服務(wù)器的攻擊并不會使得后端內(nèi)網(wǎng)Web服務(wù)器上網(wǎng)頁信息遭到破壞,增強了Web服務(wù)器的安全性。
2.ngx_http_proxy_module配置
(1) proxy_pass URL; :定義反向代理到的路徑
適用范圍:location, if in location, limit_except上下文中;URL為完整的路徑
注意:
匹配location后傳遞給后端請求路徑情況解析( REMOTE-IP:后端主機IP地址):
1) proxy_pass后面的路徑不帶uri時,其會將location的uri直接傳遞給后端的主機(直接補充關(guān)系);
location /uri/{
proxy_pass
http://REMOTE-IP;
}
此時傳遞給后端的請求路徑為:
http://REMOTE-IP/uri/,直接補充在REMOTE-IP之后
2) proxy_pass后面的路徑是一個uri時,其會將location的uri替換為后端主機自己的new_uri(映射關(guān)系);
location /uri/{
proxy_pass
http://REMOTE-IP/new_uri/;
}
此時客戶端請求被location的/uri/匹配到,跳轉(zhuǎn)到后端請求路徑將由/new uri/替換/uri/:
http://REMOTE-IP/new_uri/3) 如果location定義其uri時使用的正則表達式模式匹配,則proxy_pass后的路徑不能夠使用uri;
location ~* \.(jpg|gif|jpeg)$ {
proxy_pass
http://REMOTE-IP;
}
此處的
http://REMOT-IP后面不能有任何uri,僅有"/"也不行(/相對路徑,相當(dāng)于后端的DocumentRoot/root路徑);
(2) proxy_set_header field value;
用于proxy server向后端服務(wù)主機發(fā)請求報文時,將某請求首部重新賦值,或在原有值后面添加一個新的值; 也可以添加自定義首部;
示例:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
原有請求報文中如果存在X-Forwared-For首部,則將remote_addr以逗號分隔補原有值后,否則則直接添加此首部;
(3) 緩存相關(guān)的選項(緩存需要要先定義,再調(diào)用)
proxy_cache_path …
path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size]
定義緩存,可用上下文為http; (與fastcgi的緩存定義相似)
proxy_cache zone | off;
調(diào)用緩存;可用上下文 為http, server和location
proxy_cache_key string;
定義緩存鍵,默認(rèn)值為proxy_cache_key $scheme$proxy_host$request_uri
proxy_cache_valid [code ...] time;
對不同響應(yīng)碼的響應(yīng)設(shè)定其可緩存時長
proxy_cache_use_stale ...
error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
超出響應(yīng)時長時候使用緩存條目來響應(yīng)(且緩存本身已經(jīng)超時)
補充說明:
Nginx:請求首部設(shè)置(ngx_http_headers_module)
add_header name value [always];
向響應(yīng)報文添加自定義首部,并為其賦值;
expires [modified] time;
expires epoch | max | off;
允許或禁止向響應(yīng)報文的Cache-Control或Expires首部添加新值或修改其值;
實例一:add_hader Via $server_addr; 記錄反向代理服務(wù)器地址
實例二:日志追蹤代理記錄IP
第一步:后端主機定義日志記錄格式
在Logformat 自定義日志格式,一般自定義變量均為X開頭,i表示取其值:添加 Logformat "%{X-Real-IP}I … …"
第二步:在方向代理主機:修改http首部,記錄代理轉(zhuǎn)發(fā)主機的IP地址(慣用自定義變量X-Real-IP、X-Forwarded-For)
proxy_cacahe_path/var/cache/nginx_proxy/ levels=1:2key_zone=pcache:10m max_size=1g;
server {
listen 80;
server_name
www.a.com;
root /data/www;
add_hader Via $server_addr;
proxy_set_header X-Real-IP $remote_addr;
location / {
proxy_pass
http://172.16.200.1;
proxy_cache pcache;
proxy_cache_key $request_uri;
proxy_cache_vaild 200 302 10m;
proxy_cache_vaild 404 2m;
}
}
原有請求報文中如果存在X-Forwarded_For首部,則將remte_addr以逗號分割補在原有值之后,否則則直接添加此首部
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
(4) 連接相關(guān)的選項
當(dāng)客戶端請求,而后端服務(wù)器過于繁忙會返回給客戶端502(BadGateway)服務(wù)器端錯誤,在例如此類情況下,肯能需要調(diào)整服務(wù)器端關(guān)于連接時長相關(guān)的選項。
proxy_connect_timeout #;
定義與后端服務(wù)器建立連接的超時時長;默認(rèn)為60s,不建議超出75s;
proxy_send_timeout #;
把請求發(fā)送給后端服務(wù)器的超時時長(定義兩次請求報文之間時間間隔);默認(rèn)為60s;
proxy_read_timeout #;
等待后端服務(wù)器發(fā)送響應(yīng)報文的超時時長;可以稍微長點
二、Nginx:負(fù)載均衡配置(ngx_http_upstream_module)
1.Nginx實現(xiàn)七層負(fù)載均衡
Nginx實現(xiàn)反向代理的時候可以在后端使用多臺主機提供響應(yīng),且可以在多臺主機之間實現(xiàn)負(fù)載均衡效果。軟件形式的工作在應(yīng)用層(七層)的負(fù)載均衡器。
ngx_http_upstream_module用于將多個服務(wù)器定義成服務(wù)器組,而由proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass和memcached_pass指令進行引用調(diào)度;
2.常用指令
(1) upstream NAME { ... }
定義一個后端服務(wù)器組,NAME為組名稱;僅能用于http上下文 ;
(2) server ADDRESS [PARAMETERS];
在upstream中定義一個服務(wù)器及其相關(guān)參數(shù);僅能用于upstream上下文;
常用參數(shù)(PARAMETERS):
weight=#
定義服務(wù)器權(quán)重,默認(rèn)為1
max_fails=#
最大失敗連接嘗試次數(shù),失敗連接超時時長由fail_timeout參數(shù)指定
fail_timeout=#
等待目標(biāo)服務(wù)器發(fā)送響應(yīng)的時長
backup
備用服務(wù)器,所有主服務(wù)器均故障時才啟用此主機
down
手動標(biāo)記其不再處理任何用戶請求
實例:
第一步:在http上下文中定義upstream服務(wù)器組
upstream websrvs {
server 172.16.200.1 weight=2 max_fails=2 fail_timeout=6s;
server 172.16.200.2 weight=1 max_fails=2fail_timeout=6s;
}
第二步:在反向代理http段中(proxy_pass,fastcgi_pass, ...)進行調(diào)用;
server {
listen 80;
server_name
www.a.com;
root /data/www;
location / {
proxy_pass
http://websrvs/;
}
}
(3) ip_hash;
源地址hash,把來自同一個ip地址的請求始終發(fā)往同一個backendserver,除非此backend server不可用;
(4) least_conn;
最少連接;當(dāng)各server權(quán)重不同時,即為加權(quán)最少連接;
(5) match NAME { ... }
對backendserver做健康狀態(tài)檢測時,定義其結(jié)果判斷機制;只能用于http上下文;
常用的參數(shù):
status code[ code ...]:
期望的響應(yīng)狀態(tài)碼;
header HEADER[operator value]
期望存在響應(yīng)首部,也可對期望的響應(yīng)首部的值基于比較操作符和值進行比較;
body
期望響應(yīng)報文的主體部分應(yīng)該有的內(nèi)容;
(6) health_check [PARAMETERS];
健康狀態(tài)檢測機制;只能用于location上下文;
常用參數(shù):
interval=#
檢測的頻率,默認(rèn)為5秒;
fails=#
判定服務(wù)器不可用的失敗檢測次數(shù);默認(rèn)為1次;
passes=#
判定服務(wù)器可用的失敗檢測次數(shù);默認(rèn)為1次;
uri=uri
做健康狀態(tài)檢測測試的目標(biāo)uri;默認(rèn)為/;
match=NAME
健康狀態(tài)檢測的結(jié)果評估調(diào)用此處指定的match配置塊;
(7) hash key [consistent];
指明基于hash方式進行調(diào)度時,其hashkey;
hash $remote_addr相當(dāng)于ip_hash;
常用的hash key:
1) $cookie_name:
將一個用戶的請求始終發(fā)往同一個backendserver,能實現(xiàn)會話綁定的功能;此處的name為cookie某些參數(shù)的名稱,此處常用的有cookie_username;
2) $request_uri:
將對同一個uri的請求始終發(fā)往同一個backend server,后端為cache server時特別有用;
補充說明:session會話保持方式