概述: 本篇主要總結(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)頁信息遭到破壞,增強(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í)長 | 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í)長時(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.; 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í)長相關(guān)的選項(xiàng)。 proxy_connect_timeout #; | 定義與后端服務(wù)器建立連接的超時(shí)時(shí)長;默認(rèn)為60s,不建議超出75s; | proxy_send_timeout #; | 把請(qǐng)求發(fā)送給后端服務(wù)器的超時(shí)時(shí)長(定義兩次請(qǐng)求報(bào)文之間時(shí)間間隔);默認(rèn)為60s; | proxy_read_timeout #; | 等待后端服務(wù)器發(fā)送響應(yīng)報(bào)文的超時(shí)時(shí)長;可以稍微長點(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í)長由fail_timeout參數(shù)指定 | fail_timeout=# | 等待目標(biāo)服務(wù)器發(fā)送響應(yīng)的時(shí)長 | 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.; 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)檢測時(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)檢測機(jī)制;只能用于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é)果評(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ì)話保持方式
|