前一篇有安裝過 Nginx Reverse Proxy 在此篇將加入 Cache 機制,可以將一些靜態檔案快取在前端的 Nginx Reverse Proxy,加快使用者在抓取靜態檔案時的回應速度,也可以降低後端伺服器的 Loading
Nginx Cache Reverse Proxy 也可以廣泛用在最近盛行的 CDN 上面,佈署於離使用者最近的機房地區,讓使用者有最快的回應速度
此篇會替 Nginx 加入 ngx_cache_purge 模組,這個模組可以讓管理者手動清除已被快取的檔案,由於 Nginx 是採用靜態編譯的方式,不能像 Apache 用設定檔去動態加入模組,所以此篇會重新將 Nginx 編譯
當然,不需要讓 開發人員 清除快取的人就直接忽略編譯 ngx_cache_purge 的那一段。
也可以到 cache 目錄將檔案清除即可。
安裝 Nginx Cache Reverse Proxy + Purge Plugin
step1. 下載 Nginx + Purge 並編譯安裝
$ wget http://nginx.org/download/nginx-1.7.12.tar.gz http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz 編譯 Nginx 你會須要 pcre 及 openssl $ yum install openssl-devel openssl pcre pcre-devel gd-devel 先將 ngx_cache_purge 解壓出來,再讓 Nginx 編譯指定 purge 路徑 $ tar zxvf ngx_cache_purge-2.3.tar.gz $ tar zxvf nginx-1.7.12.tar.gz $ cd nginx-1.7.12 $ ./configure --prefix=/usr/local/nginx --pid-path=/var/run/nginx.pid --add-module=/root/ngx_cache_purge-2.3 --with-http_ssl_module --with-http_stub_status_module --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_spdy_module --http-client-body-temp-path=/var/tmp/nginx/client/ --http-proxy-temp-path=/var/tmp/nginx/proxy --with-http_realip_module --with-http_image_filter_module --with-http_stub_status_module --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi $ make && make install
如果有其他需要的模組請再自行加入,如 mp4 , gzip .. ,然後把一些 temp 目錄都指向到 /var/tmp/nginx 統一整理
step2. 設定 proxy cache 參數
建立cache目錄 $ mkdir /var/nginx/tmp /var/nginx/cache $ chown -R nginx.nginx /var/nginx 設定 $ vim /usr/local/nginx/conf/nginx.conf http { .. proxy_temp_path /var/nginx/tmp; proxy_cache_path /var/nginx/cache levels=1:2 keys_zone=zone_one:200m inactive=1d max_size=30g; .. include /usr/local/nginx/conf.d/*.conf; }
- proxy_temp_path 用來存放臨時 temp 檔案
- proxy_cache_path 是放 cache 檔案的地方
- proxy_temp_path、proxy_cache_path 兩個目錄不可以跨 partitions,並且要有 nginx 寫入權限
- key_zone 是 cache 名稱定義,作為 server {} 引用,可在記憶體快取 200M 空間
- inactive 快取有效時間,超過即刪除。
- max_size 占用硬碟快取空間 30G
上面的參數都依照每台主機的狀況再做調整,如 memory cache、disk cache
step3. 設定 server {} 設定檔,加入 cache 參數
Reverse Proxy 設定方式參考上一篇 Nginx Reverse Proxy 設定
$ vim /usr/local/nginx/conf.d/proxy.conf server { .. location ~ /purge(/.*) { allow 127.0.0.1; allow 192.168.121.0/24; deny all; proxy_cache_purge one $host$1$is_args$args; } location ~* \.(html|htm|jpg|png|gif|jpeg|js|css)$ { proxy_buffering on; proxy_cache one; proxy_cache_valid 200 304 12h; proxy_cache_valid 301 302 1m; proxy_cache_valid any 1m; proxy_cache_key $host$uri$is_args$args; proxy_set_header Host $Host; proxy_set_header X-Forwarded-For $remote_addr; add_header Cache-status $upstream_cache_status; proxy_pass http://nginx.com; } }
Purge 模組
- /purge 提供 開發人員 刪除的路徑,允許本機和 192.168.121.0/24 存取
- proxy_cache_purge 引用 keys_zone one
Cache 參數
- 宣告要 cache 的項目 html|htm|jpg|png|gif|jpeg|js|css
- proxy_cache_valid 針對 status code 分類快取存活的時間
- 加入 add_header $upstream_cache_status,讓 HTTP Header 加入一項 cache 狀態
step4. 測試
先測試 Proxy 反向代理成功,順利瀏覽網站
瀏覽網站後就會有 cache 檔案存到 /var/nginx/cache,在裡面應該會有 0-9 a-z 排序的 cache 目錄表示檔案已經 cache 進來了。
再來測試 Purge 模組
例如有更新某個圖檔位於 http://shazi.info/test.jpg
在網址打上 http://shazi.info/purge/test.jpg 就可以看到 Successful purge 代表刪除快取檔案成功!
到這邊 Nginx Reverse Proxy Cache 已經設定完成了
由於在 step3 有加入 header 參數 $upstream_cache_status
所以最後要再來驗證一下 header 是否有正常顯示
$ curl -I http://shazi.info/test.jpg Cache-status: HIT
HIT 代表有 cache 到該檔案,是由 Proxy Response 給 user 的
$upstream_cache_status 也可以加到 log,方便直接在 Log 查看或是進行統計
$ vim /usr/local/nginx/conf/nginx.conf log_format main '$upstream_cache_status';
也有其他狀態,可參考以下官網資訊