1. 程式人生 > >08-nginx的反向代理、緩存功能

08-nginx的反向代理、緩存功能

日誌 情況 request 模型 etc 報文 div 添加 agen

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的反向代理、緩存功能