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