反向代理負載均衡集群配置詳解
反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時站在服務器角度來看,代理服務器對外就表現為一個反向代理服務器。
對反向代理服務器的攻擊并不會使得后端內網Web服務器上網頁信息遭到破壞,增強了Web服務器的安全性。
ngx _ http _ proxy _ module模塊:http/https協議反向代理
1、proxy_pass URL; :定義反向代理到的路徑
適用范圍:location, if in location, limit_except上下文中;URL為完整的路徑 注意: 匹配location后傳遞給后端請求路徑情況解析( REMOTE-IP:后端主機IP地址): 1) proxy_pass后面的路徑不帶uri時,其會將location的uri傳遞給后端主機; server { ... server_name HOSTNAME; location /uri/ { proxy http://REMOTE-IP[:port]; } ... } 此時傳遞給后端的請求路徑為:http://REMOTE-IP/uri/,直接補充在REMOTE-IP之后; http://HOSTNAME/uri --> http://REMOTE-IP/uri 2)proxy_pass后面的路徑是一個uri時,其會將location的uri替換為proxy_pass的uri; server { ... server_name HOSTNAME; location /uri/ { proxy http://REMOTE-IP/new_uri/; } ... } 此時客戶端請求被location的/uri/匹配到,跳轉到后端請求路徑將由/new uri/替換/uri/; http://HOSTNAME/uri/ --> http://REMOTE-IP/new_uri/ 3)如果location定義其uri時使用了正則表達式的模式,則proxy_pass之后必須不能使用uri; server { ... server_name HOSTNAME; location ~|~* /uri/ { proxy http://REMOTE-IP; } ... } 此時客戶端請求時傳遞的uri將直接附加代理到的服務的之后; http://HOSTNAME/uri/ --> http://host/REMOTE-IP/
2、proxysetheader field value;用于proxy server向后端服務主機發請求報文時,將某請求首部重新賦值,或在原有值后面添加一個新的值; 也可以添加自定義首部;用于http, server, location配置段中
示例: 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、緩存相關的選項(緩存需要要先定義,再調用)
1)proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] 定義緩存,可用上下文為http; (與fastcgi的緩存定義相似) 2)proxy_cache zone | off; 指明要調用的緩存,或關閉緩存機制;用于http, server, location 上下文 3)proxy_cache_key string; 緩存中用于“鍵”的內容;默認值為:proxy_cache_key $scheme$proxy_host$request_uri; 4)proxy_cache_valid [code ...] time; 定義對特定響應碼的響應內容的緩存時長; 緩存定義示例: (定義在http上下文) proxy_cache_path /var/cache/nginx/proxy_cache levels=1:1:1 keys_zone=pxycache:20m max_size=1g; 調用緩存定義示例: 定義在需要調用緩存功能的配置段,例如server{...}; proxy_cache pxycache; proxy_cache_key $request_uri; proxy_cache_valid 200 302 301 1h; proxy_cache_valid any 1m; 5)proxy_cache_use_stale 定義當代理服務器與后端主機通信出現故障時在哪種情況下,可以向客戶端直接用緩存中緩存項響應給客戶端;如下; proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...; 6)proxy_cache_methods GET | HEAD | POST ...; 定義為哪種請求方法使用緩存;默認GET|HEAD 其他的不建議使用 7)proxy_buffering on | off; 是否啟用代理服務器對后端服務器的發送緩沖和接收緩沖 默認proxy_buffering on; 8)proxy_buffers number size; 定義啟用代理服務器對后端服務器的發送緩沖和接收緩沖的buffer的數量和每個buffer的類型 默認proxy_buffers 8 4k|8k; 用于http,server,locaton上下文 9)proxy_buffer_size size; 定義代理服務器對后端服務器的發送緩沖和接收緩沖的每個buffer的大小 默認proxy_buffer_size 4k|8k;
4、proxy _ hide _ header field;
指明要隱藏響應給客戶端header,默認情況下nginx是不傳遞header的
5、proxy _ connect _ timeout time;
定義代理服務器與后方服務器建立連接時的超時時長;默認是60s,最大不能超過75s
6、 連接相關的選項
當客戶端請求,而后端服務器過于繁忙會返回給客戶端502(BadGateway)服務器端錯誤,在例如此類情況下,肯能需要調整服務器端關于連接時長相關的選項
1)proxy_connect_timeout time; 定義與后端服務器建立連接的超時時長;默認為60s,不建議超出75s; 2)proxy_send_timeout time; 把請求發送給后端服務器的超時時長(定義兩次請求報文之間時間間隔);默認為60s; 3)proxy_read_timeout time; 等待后端服務器發送響應報文的超時時長;默認為60s;可以稍微長點.
ngx _ http _ headers _ module模塊:管理header功能的模塊
向由代理服務器響應給客戶端的響應報文添加自定義首部,或修改指定首部的值; 用于http,server,location,if in location上下文
1、add_header name value [always];
添加自定義首部; 示例: add_header X-Via $server_addr; add_header X-Accel $server_name;
2、expires [modified] time;用于定義Expire或Cache-Control首部的值;
expires epoch | max | off;允許或禁止向響應報文的Cache-Control或Expires首部添加新值或修改其值; 注釋: Cache-Control:緩存控制機制 Expires:用于改變原始服務器定義的響應報文的緩存時長
ngx _ http _ upstream _ module模塊;用于把后端服務器定義成服務器組,實現負載均衡功能
1、upstream NAME { … }NAME為組名稱
定義后端服務器組,會引入一個新的上下文;用于http上下文 upstream httpdsrvs { server ... server... ... }
2、server address [parameters];在upstream中定義一個服務器及其相關參數;僅能用于upstream上下文;
address的表示格式:
unix:/PATH/TO/SOME_SOCK_FILE:只限用于本地通信 IP[:PORT] HOSTNAME[:PORT]
常用參數(PARAMETERS):
weight=number:定義服務器權重,默認為1 max_fails=number:失敗嘗試最大次數;超出此處指定的次數時,server將被標記為不可用; fail_timeout=time:設置將服務器標記為不可用狀態的超時時長;默認為10s,這是一個累計時長,而不是單次時長。 max_conns:當前的服務器的最大并發連接數; backup:將服務器標記為“備用”,即所有服務器均不可用時此服務器才啟用; down:標記為“不可用”;不再處理任何用戶請求 示例: 第一步:在http上下文中定義upstream服務器組 upstream websrvs { server 192.168.25.129 weight=2 max_fails=2 fail_timeout=6s; server 192.168.25.130 weight=1 max_fails=2 down; server 192.168.25.130:8080 backup } 第二步:在反向代理http段中(proxy_pass,fastcgi_pass, ...)進行調用; server { listen 80; server_name www.ali.com; root /data/www; location / { proxy_pass http://websrvs/; } }
3、least _ conn;
最少連接調度算法,當server擁有不同的權重時其為wlc;(當各server權重不同時,即為加權最少連接);最少連接算法通常只適用與那些長連接的協議。
4、ip _ hash;
源地址hash調度方法;把來自同一個ip地址的請求始終發往同一個backendserver,除非此backend server不可用;
5、hash key [consistent];基于指定的key的hash表來實現對請求的調度,此處的key可以直接文本、變量或二者的組合;
作用:將請求分類,同一類請求將發往同一個upstream server; 示例: hash $request_uri consistent; hash $remote_addr; hash $remote_addr相當于ip_hash; 常用的hash key: 1) $cookie_name: 將一個用戶的請求始終發往同一個backendserver,能實現會話綁定的功能;此處的name為cookie某些參數的名稱,此處常用的有cookie_username; 2) $request_uri: 將對同一個uri的請求始終發往同一個backend server,后端為cache server時特別有用;
6、match NAME { … };此項配置只適用于nginxplus
對backendserver做健康狀態檢測時,定義其結果判斷機制;只能用于http上下文; 常用的參數: status code[code ...]:期望的響應狀態碼; header HEADER[operator value]:期望存在響應首部,也可對期望的響應首部的值基于比較操作符和值進行比較; body:期望響應報文的主體部分應該有的內容;
7、health _ check [PARAMETERS];此項配置只適用于nginxplus
健康狀態檢測機制;只能用于location上下文; 常用參數: interval=#:檢測的頻率,默認為5秒; fails=#:判定服務器不可用的失敗檢測次數;默認為1次; passes=#:判定服務器可用的失敗檢測次數;默認為1次; uri=uri:做健康狀態檢測測試的目標uri;默認為/; match=NAME:健康狀態檢測的結果評估調用此處指定的match配置塊;
8、keepalive connections;
為每個worker進程保留的空閑的長連接數量;
ngx _ stream _ core _ module模塊;用于非http協議請求的分發功能。此功能在1.9以后的版本中才有
模擬反代基于tcp或udp的服務連接,即工作于傳輸層的反代或調度器;
1、stream { … }
定義stream相關的服務;Context:main stream { upstream sshsrvs { server 192.168.22.2:22; server 192.168.22.3:22; least_conn; } server { listen 10.1.0.6:22022; proxy_pass sshsrvs; } }
2、listen:結合與stream配置段中的監聽地址
listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/58145