cuteftp 2015-2-12 15:23
Nginx Reverse Proxy 添加 Cache Server (快取機制) 加速網站
在Reverse Proxy上如何進行網頁快取(Cache)讓這台伺服器在擔任負載平衡之際,同<br>時可以協助靜態網頁做快取機制,加速Client網頁回應速度. 與減輕後端伺服器存取壓力<br><br>Nginx 內建就有Cache Server Module.所以我們只要啟用它就可以<br><br>設定步驟:<br>(1) 編輯 /etc/nginx/nginx.conf<br> 在 http 字段中添加:<br>[quote]<br> # Proxy Setting<br> proxy_set_header Host $host;<br> proxy_set_header X-Real-IP $remote_addr;<br> proxy_set_header REMOTE-HOST $remote_addr;<br> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br><br> # Cache Server<br> <font color="Green">proxy_cache_path /data/proxy_cache levels=1:2 keys_zone=<font color="Red">cache_one</font>:30m inactive=10d max_size=10G;</font><br>[/quote]<br>proxy_cache_path:定義一個用來保存cache的目錄,及一個保存緩存對象的共享內存區域(keys_zone=name:size),其可選参數有:<br><br>levels:每級子目錄名稱的長度,有效值為1或2,每級之間使用冒號分隔,最多為3級;<br>inactive:非活動緩存項從緩存中剔除之前的最大緩存時長;<br>max_size:緩存空間大小的上限,當需要緩存的對象超出此空間限定時,緩存管理器將基於LRU算法對其進行清理;<br><br>(2) 然後在server中 location 字段中添加:<br>[quote]<br> location / {<br> proxy_pass http://www.adj.idv.tw;<br> proxy_buffering on;<br> proxy_cache <font color="Red">cache_one</font>;<br> proxy_cache_valid 200 304 7d;<br> proxy_cache_valid 301 302 10m;<br> proxy_cache_valid any 1m;<br> proxy_cache_key $host$uri$is_args$args;<br> proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;<br> add_header X-Via $server_addr;<br> add_header X-Cache-status $upstream_cache_status;<br> expires 7d;<br> }<br>[/quote]<br>proxy_cache zone|off:定義一個用於緩存的共享內存區域,其可被多個地方調用;緩存將遵從upstream服務器的回應報文首部中關於緩存的設定,如 "Expires"、"Cache-Control: no-cache"、 "Cache-Control: max-age=XXX"、"private"和"no-store" 等,但nginx在緩存時不會考慮響應報文的"Vary"首部。为了確保私有信息不被緩存,所有關於用戶的私有信息可以upstream上通過"no-cache" or "max-age=0"來實現,也可在nginx設定proxy_cache_key必須包含用戶特有數據如$cookie_xxx的方式實現,但最後這種方式在公共緩存上使用可能會有風險。因此,在響應報文中含有以下首部或指定標志的報文將不會被緩存。<br><br>Set-Cookie<br>Cache-Control containing "no-cache", "no-store", "private", or a "max-age" with a non-numeric or 0 value<br>Expires with a time in the past<br>X-Accel-Expires: 0<br><br>proxy_cache_use_stale:在無法連繫到upstream服務器時的哪種情形下(如error、timeout或http_500等)讓nginx使用本地緩存的過期的緩存對象直接回應客戶端請求;其格式為:<br>proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_404 | off<br>proxy_cache_valid [ code ...] time:用於為不同的回應設定不同時長的有效緩存時間,例如:proxy_cache_valid 200 302 10m;<br><br>add_header 用於自定義http響應報文內容,這裏用於查詢是否命中緩存;<br><br>(3) 建立nginx緩存目錄,並重啟nginx:<br># mkdir /data/proxy_cache/<br># nginx -s reload<br><br>(4) 檢測緩存是否命中:<br>[quote]<br># curl -I http://www.xxx.com.tw<br>HTTP/1.1 200 OK<br>Server: nginx<br>Date: Thu, 12 Feb 2015 07:21:13 GMT<br>Content-Type: text/html; charset=utf8<br>Connection: keep-alive<br>Last-Modified: Tue, 11 Jun 2013 02:12:56 GMT<br>Vary: Accept-Encoding<br>Content-Encoding: gzip<br>Expires: Thu, 19 Feb 2015 07:21:13 GMT<br>Cache-Control: max-age=604800<br>X-Via: xx.xx.xx.xx<br><font color="Red">X-Cache-status: HIT</font><br>[/quote]<br><br>看到X-Cache-status 字段為<font color="Red">HIT</font> ,就是成功了。<br><br>