1. 程式人生 > >NGINX反向代理快取

NGINX反向代理快取

反向代理(Reverse Proxy)方式是指以代理伺服器來接受internet上的連線請求,然後將請求轉發給內部網路上的伺服器,並將從伺服器上得到的結果返回給internet上請求連線的客戶端,此時代理伺服器對外就表現為一個伺服器

反向代理的作用

保護網站安全:任何來自Internet的請求都必須先經過代理伺服器

簡單來說,就是我們網站的所有的請求都要經過反向代理伺服器,對反向代理伺服器進行安全加固就能解決很大一部分的安全問題。

通過配置快取功能加速Web請求:可以快取真實Web伺服器上的某些靜態資源,減輕真實Web伺服器的負載壓力;

可以在反向代理的伺服器上快取某些靜態資源,這樣的話在反向代理伺服器上存在的資源就不用去web伺服器上獲取,以減輕web伺服器的壓力。

實現負載均衡:充當負載均衡伺服器均衡地分發請求,平衡叢集中各個伺服器的負載壓力;

可以通過反向代理伺服器把請求分發到不同伺服器,減輕伺服器的壓力,還能防止網站某一臺伺服器掛掉之後,網站就無法訪問的問題,做到網站的高可用,減少事故的發生。

反向代理快取設定

一、在反向代理伺服器的配置檔案中加入:

位置: http段內

proxy_temp_path /data/nginx-temp;  #快取臨時檔案路徑

proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50m inactive=1m;

 #快取儲存的路徑

* levels指定該快取空間有兩層hash目錄,第一層目錄為1個數字或者字母,第二層為2個數字或者字母

* keys_zone指的是快取空間名稱。20m 為記憶體快取空間大小

* max_size指的是快取檔案可以佔用的最大空間。

* inactive指的是如果一個快取檔案多長時間不被訪問,就會被刪除。(天:d、秒:s、分:m

二、配置的demo

DEMO

//設定動態伺服器的代理 【處理PHP任務】

upstream test {

        #ip_hash;#[使用ip_hash分發]

        server 192.168.1.254:81 weight=2 ;

 #[設定這個伺服器的權重為2 ]

        server 192.168.1.254:82;

}

//設定獲取靜態檔案的代理

upstream static{

        server 192.168.1.254:81 ; #[靜態伺服器 ]

}

#設定快取目錄 #

proxy_temp_path /data/nginx-temp; #[temp的目錄]

proxy_cache_path /data/nginx-cache levels=1:2 keys_zone=nginx-cache:20m max_size=50m inactive=1m;

#[設定快取的路徑為 /data/nginx-cache層級為2級,第一級為1個字幕第二個為2個字母 快取的空間名為 nginx-cache,快取的記憶體空間為20M最大空間為50M 1分鐘內沒有訪問刪除這個快取  ]

# END #

server {

    listen 80;

    server_name _;

    access_log  logs/likang.default.access.log  main;

    error_log logs/error.log error;

    root /var/www/html/likang/default;

#設定反向代理

   location /{

        proxy_pass http://test;

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

   }

#設定靜態圖片

   location ~.*\.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) {

#root /data/nginx-cache;  #[圖片的根目錄 ]

             proxy_redirect off;   #[關閉跳轉]

             proxy_set_header Host $host;  #[設定header ]

             proxy_cache nginx-cache;  #[快取的空間 -- 上邊定義的  ]

             proxy_cache_valid 200 302 1h; #[不同http狀態快取時間不同]

             proxy_cache_valid 301 1d;

             proxy_cache_valid any 1m;

             proxy_ignore_headers Set-Cookie Cache-Control;

             proxy_hide_header Cache-Control;

             proxy_hide_header Set-Cookie;

             expires 30d;  #[告訴瀏覽器快取有效期-- 30天內可以直接訪問瀏覽器快取]

             proxy_passhttp://static; #[檔案不存在去那裡獲取]

   }

}

解決不快取的問題:

1. nginx不快取原因

預設情況下,nginx是否快取是由nginx快取伺服器與源伺服器共同決定的, 快取伺服器需要嚴格遵守源伺服器響應的header來決定是否快取以及快取的時常。header主要有如下:

Cache-control:no-cache、no-store

如果出現這兩值,nginx快取伺服器是絕對不會快取的

Expires:1980-01-01

如果出現日期比當前時間早,也不會快取。

2. 解決不快取方案

2.1 方法一:

修改程式或者源伺服器web程式響應的header

2.2 方法二:

nginx代理直接加上如下一句:

proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;

或者:

proxy_ignore_headers Set-Cookie Cache-Control;

proxy_hide_header Cache-Control;

proxy_hide_header Set-Cookie;

擴充套件:學習nginxProxy Cache指令

1 proxy_cache

語法:proxy_cache zone_name;

預設值:None

使用欄位:http, server, location

設定一個快取區域的名稱,一個相同的區域可以在不同的地方使用。

0.7.48後,快取遵循後端的”Expires,Cache-Control: no-cache,Cache-Control: max-age=XXX”以及其他等。然而,目前nginx會忽略一些快取控制指令,如:”private”和”no-store”,同樣,nginx在快取過程中不會處理”Vary”頭,為了確保一些私有資料不被所有的使用者看到,後端必須設定 “no-cache”或者”max-age=0″頭,或者proxy_cache_key包含使用者指定的資料如$http_cookie_xxx,在proxy_cache_key中使用一部分cookie的值可以防止快取私有資料,所以可以分別指定location以便分開私有資料和公有資料。

快取指令依賴代理緩衝區(buffers),如果proxy_buffers設定為off,快取不會生效。

2 proxy_cache_key

語法:proxy_cache_key line;

預設值:$scheme$proxy_host$request_uri;

使用欄位:http, server, location

指令指定了包含在快取中的快取關鍵字。

複製程式碼 程式碼如下:proxy_cache_key "$host$request_uri$cookie_user";

proxy_cache_key "$scheme$host$request_uri";

3 proxy_cache_path

語法:proxy_cache_path path [levels=number] keys_zone=zone_name:zone_size [inactive=time] [max_size=size];

預設值:None

使用欄位:http

指令指定快取的路徑和一些其他引數,快取的資料儲存在檔案中。快取的檔名和key為代理URLMD5碼。levels引數指定快取的子目錄數,例如:

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m;

檔名類似於:

/data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c

所有活動的key和元資料儲存在共享的記憶體區域中,這個區域用keys_zone引數指定,如果在inactive引數指定的時間內快取的資料沒有被請求則被刪除,預設inactive10分鐘。

cache manager程序控制磁碟的快取大小,在max_size引數中定義,超過其大小後最少使用資料將被刪除。

區域的大小按照快取頁面數的比例進行設定,一個頁面(檔案)的元資料大小按照作業系統來定,FreeBSD/i386下為64位元組,FreeBSD/amd64下為128位元組,當區域滿了以後key將按照LRU(最近最少使用演算法)進行處理。

proxy_cache_pathproxy_temp_path應該使用在相同的檔案系統上。

4 proxy_cache_methods

語法:proxy_cache_methods [GET HEAD POST];

預設值:proxy_cache_methods GET HEAD;

使用欄位:http, server, location

GET/HEAD用來裝飾語句,即你無法禁用GET/HEAD即使你只使用下列語句設定:

proxy_cache_methods POST;

5 proxy_cache_min_uses

語法:proxy_cache_min_uses the_number;

預設值:proxy_cache_min_uses 1;

使用欄位:http, server, location

多少次的查詢後應答將被快取,預設1

6 proxy_cache_valid

語法:proxy_cache_valid reply_code [reply_code ...] time;

預設值:None

使用欄位:http, server, location

為不同的應答設定不同的快取時間,例如:

複製程式碼 程式碼如下:proxy_cache_valid  200 302  10m;

  proxy_cache_valid  404      1m;

  proxy_cache_valid  5m;

  proxy_cache_valid  200 302 10m;

  proxy_cache_valid  301 1h;

  proxy_cache_valid  any 1m;

7 proxy_cache_use_stale

為了防止快取失效(在多個執行緒同時更新本地快取時),你可以指定’updating’引數,它將保證只有一個執行緒去更新快取,並且在這個執行緒更新快取的過程中其他的執行緒只會響應當前快取中的過期版本。

程式碼及configure配置:

ngx_http_proxy_module.c裡面定義了每個指令的鉤子(callback),它們在讀取配置檔案時會被呼叫。在configure的時候只需要把“HTTP_CACHE”設定為YES(可以找到auto/options裡面HTTP_CACHE那行)。“proxy_cache_purge”指令需要下載nginx add-ons裡面的“Cache Purge”模組,並在configure的時候用"--add-module="來載入程式碼。