[ DevOps ] Nginx 設定 Cache 機制

前兩篇 ubuntu 上 Nginx 安裝與設定Nginx 設定 Proxy Server 及 Load balance 文章主要說明如何安裝 Nginx 以及設置 Load balance,本篇文章主要用於調整 Nginx 上 Cache 的設定。

Cache (快取) 介紹

Cache (快取) 的目的主要是讓系統回應速度變快,減少 response 的等待時間。如果您的網頁服務有大量的靜態檔案(如:CSS、圖片檔、JS 檔案),設置 Cache 可以讓瀏覽器就會緩存這些文件,節省網路流量的費用,也可以讓使用者訪問網站會顯得更快(如果用戶第二次訪問你的網站,將會使用瀏覽器緩存中的靜態文件)。

Nginx 設定 Cache 步驟

Nginx 基本設定的步驟已於上兩篇文章有教學過,這裡的設定步驟主要會以加入 Cache 控制為主。

Step 1.

在 server 上開啟 nginx config 設定檔

cd /etc/nginx/conf.d  
vi nginx.conf  

Step 2.

於 location {} 模組中,用 expires 指令控制你的靜態文件快取到期時間。

location ~* \.(jpg|jpeg|png|css|js)$ {  
expires 365d;  
}

在上面模組中,所有副檔名是 .jpg、.jpeg、.css 和 .js 的檔案會在瀏覽器訪問該文件之後的 365 天後過期。

Step 3.

完整 Nginx 設定檔如下。

upstream backend {

server 127.0.0.1:3000;

}

server {

listen 80;

server_name www.example.com;

access_log /var/log/nginx/example.access.log;

location ~* \.(jpg|jpeg|png|css|js)$ {  
expires 365d;  
proxy_pass http://backend;  
}
}

Step 4.

重新讀取 Nginx 設定檔

/etc/init.d/nginx reload

Nginx 強制 Header不需要 Cache 步驟

Nginx 如果沒有特別設定 location 模組的指令,預設都會有 Cache 機制,也會將登入前的 Header 狀態 cache 住,此情況可能會造成使用者已經成功登入了,但頁面卻沒有 redirect 到登入後的頁面,還是停留在目前頁面,需要整個網頁重新整理後才會拿到 Session,進而導到正確的頁面。為了避免此情況發生我們可以於 location 模組中新增一段指令。

Step 1.

在 server 上開啟 nginx config 設定檔

cd /etc/nginx/conf.d  
vi nginx.conf  

Step 2.

於 location {} 模組中,加入 Header 不需要 cache 的指令。

location / {

add_header Cache-Control no-cache;  
# 於 Header 加入不需要 Cache 指令
add_header Cache-Control private;

proxy_set_header Host $http_host;  
# 使用 Nginx proxy_pass 時保留 host header,避免跳轉到 127.0.0.1:3000 而不是 www.example.com

proxy_pass http://backend;

}

Step 3.

完整 Nginx 設定檔如下。

upstream backend {

server 127.0.0.1:3000;

}

server {

listen 80;

server_name www.example.com;

access_log /var/log/nginx/example.access.log;

location ~* \.(jpg|jpeg|png|css|js)$ {  
expires 365d;  
proxy_pass http://backend;  
}

location / {  
add_header Cache-Control no-cache;  
add_header Cache-Control private;  
proxy_set_header Host $http_host;  
proxy_pass http://backend;  
}

}

Step 4.

重新讀取 Nginx 設定檔

/etc/init.d/nginx reload

系統環境版本資訊

  • Ubuntu 14.04
ALL RIGHTS RESERVED. COPYRIGHT © 2016. Designed and Coded by Makee.io