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