08-nginx的反向代理、緩存功能
nginx作為反向代理的工作模型
相對於LVS工作在四層,nginx工作於應用層,所以它能夠理解http請求報文中首部的請求方法、URL、http協議等信息。
nginx收到請求報文後,這個報文源IP為客戶端CIP,目標IP是nginx服務器所在的供外界訪問的VIP。然後把用戶的請求封裝成新的報文發給後端服務器,發送的報文源IP為nginx所在服務器的DIP,目標IP為後端真實響應請求的RIP(為避免後端服務器暴露於外網中,DIP與RIP可以為私網地址)。
nginx_http_proxy_model模塊實現反向代理,適用範圍:location, if in location , limit_except
常見用法 1) proxy_pass後面的路徑不帶uri時,其會將location的uri傳遞給後端主機; server { ... server_name HOSTNAME; location /uri/ { proxy http://RIP[:port]; } ... } 此時傳遞給後端的請求路徑為:http://RIP/uri/,直接補充在REMOTE-IP之後; http://HOSTNAME/uri --> http://RIP/uri 2)proxy_pass後面的路徑是一個uri時,其會將location的uri替換為proxy_pass的uri; server { ... server_name HOSTNAME; location /uri/ { proxy http://RIP/new_uri/; } ... } 此時客戶端請求被location的/uri/匹配到,跳轉到後端請求路徑將由/new uri/替換/uri/; http://HOSTNAME/uri/ --> http://RIP/new_uri/ 3)如果location定義其uri時使用了正則表達式的模式,則proxy_pass之後必須不能使用uri; server { ... server_name HOSTNAME; location ~|~* /uri/ { proxy http://RIP; } ... } 此時客戶端請求時傳遞的uri將直接附加代理到的服務的之後; http://HOSTNAME/uri/ --> http://host/RIP/
實驗環境:
nginx反向代理服務器centos7.2 VIP:9.110.187.120,DIP:10.1.1.120 安裝nginx
後端RealServer1 RIP:10.1.1.121 安裝apache 提供測試頁面
[[email protected] html]# cat index.html Hello,This is controller2 [[email protected] html]# cat ./book/index.html This is controller /book/index.html
後端RealServer2 RIP:10.1.1.122 安裝LAMP
客戶端為win7主機
實驗一:
nginx 反代配置
重啟服務後驗證
實驗二:
nginx 反代配置
實驗三:
解決後端Web 服務器記錄真實客戶端IP
默認情況後端服務器記錄的全是代理服務器的IP
此時需要用戶proxy_set_header指令
nginx反向代理服務器server 配置段中添加配置 proxy_set_header CIP $remote_addr;
後端apache 配置文件中日誌配置更改
LogFormat "%{CIP}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
利用proxy_set_header 指令,nginx向後端發送請求報文中添加CIP首部(名稱自定義) 值為remote_addr真實客戶端IP(這個是固定的)效果如下
Nginx 作為反向代理時,可以啟用緩存機制。
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;
定義緩存可以在http,server,location中,作用範圍不同,下面是我的例子
proxy_cache_path /var/proxycache/ levels=1:1:1 keys_zone=jpgcache:10m max_size=1g; server { listen 80 default_server; listen [::]:80 default_server; server_name _; # root /usr/share/nginx/html; proxy_set_header CIP $remote_addr; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { proxy_pass http://10.1.1.121; index index.html; proxy_cache jpgcache; proxy_cache_key $request_uri; proxy_cache_valid 200 301 302 1h; proxy_cache_valid any 1m; }
[[email protected] nginx]# tree /var/proxycache/ /var/proxycache/ ├── 4 │ └── a │ └── d │ └── 880e10635371e8065a004e01fd401da4 └── 9 └── d └── 9 └── 35a63c8a85b1279a0f991ce8828fb9d9 6 directories, 2 files
緩存的文件和訪問的文件(是一個圖片)大小相同。
nginx_http_headers_module模塊實現nginx響應報文中的首部定義
默認情況下,nginx不會傳遞 Date ,Server,X-Pad ,X-Accel等信息,避免後端服務器信息被泄露。示例
add_header cache-test $upstream_cache_status;
添加一個首部名稱cache-test,值為nginx_upstream模塊引入的一個變量,用於記錄從後端服務器緩存的資源是否被命中。
nginx_http_upstream_module模塊:用於把後端服務器定義成服務器組,實現負載均衡功能。
定義後端服務器組,會引入一個新的上下文;用於http上下文 upstream httpdsrvs { server ... server... ... } server address [parameters];在upstream中定義一個服務器及其相關參數;僅能用於upstream上下文; upstream websrvs { server 10.1.1.121 weight=2 max_fails=2 fail_timeout=6s; server 10.1.1.122 weight=1 max_fails=2 down; server 10.1.1.123:8080 backup }
負載均衡算法
least_conn:最少連接調度算法,當server擁有不同的權重時其為wlc;(當各server權重不同時,即為加權最少連接);最少連接算法通常只適用與那些長連接的協議; ip_hash:源地址hash調度方法;把來自同一個ip地址的請求始終發往同一個backendserver,除非此backend server不可用; hash key [consistent]:基於指定的key的hash表來實現對請求的調度,此處的key可以直接文本、變量或二者的組合; 常用的hash key: 1) $cookie_name: 將一個用戶的請求始終發往同一個backendserver,能實現會話綁定的功能;此處的name為cookie某些參數的名稱,此處常用的有cookie_username; 2) $request_uri: 將對同一個uri的請求始終發往同一個backend server,後端為cache server時特別有用; match NAME { … }:對backendserver做健康狀態檢測時,定義其結果判斷機制;只能用於http上下文; 常用的參數: status code[code ...]:期望的響應狀態碼; header HEADER[operator value]:期望存在響應首部,也可對期望的響應首部的值基於比較操作符和值進行比較; body:期望響應報文的主體部分應該有的內容; health _ check [PARAMETERS]:健康狀態檢測機制;只能用於location上下文; 常用參數: interval=#:檢測的頻率,默認為5秒; fails=#:判定服務器不可用的失敗檢測次數;默認為1次; passes=#:判定服務器可用的失敗檢測次數;默認為1次; uri=uri:做健康狀態檢測測試的目標uri;默認為/; match=NAME:健康狀態檢測的結果評估調用此處指定的match配置塊; keepalive connections:為每個worker進程保留的空閑的長連接數量;
示例:
註釋掉之前的緩存配置段
# proxy_cache_path /var/proxycache/ levels=1:1:1 keys_zone=jpgcache:10m max_size=1g; upstream testservers { server 10.1.1.121; server 10.1.1.122; } server { listen 80 default_server; listen [::]:80 default_server; server_name _; # root /usr/share/nginx/html; proxy_set_header CIP $remote_addr; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; add_header cache-test $upstream_cache_status; location / { #proxy_pass http://10.1.1.121; proxy_pass http://testservers; index index.html; # proxy_cache jpgcache; # proxy_cache_key $request_uri; # proxy_cache_valid 200 301 302 1h; # proxy_cache_valid any 1m; }
在後端建立不同的index.html,刷新訪問頁面,可查看頁面變化。
08-nginx的反向代理、緩存功能