1. 程式人生 > >nginx靜態檔案快取的解決方案

nginx靜態檔案快取的解決方案

nginx的一大功能就是完成靜態資源的分離部署,減輕後端伺服器的壓力,如果給這些靜態資源再加一級nginx的快取,可以進一步提升訪問效率。

第一步:新增nginx.conf的http級別的快取配置
複製程式碼
##cache##
proxy_connect_timeout 500;
#跟後端伺服器連線的超時時間_發起握手等候響應超時時間
proxy_read_timeout 600;
#連線成功後_等候後端伺服器響應的時間_其實已經進入後端的排隊之中等候處理
proxy_send_timeout 500;
#後端伺服器資料回傳時間_就是在規定時間內後端伺服器必須傳完所有資料
proxy_buffer_size 128k;
#代理請求快取區_這個快取區間會儲存使用者的頭資訊以供Nginx進行規則處理_一般只要能儲存下頭資訊即可
proxy_buffers 4 128k;
#同上 告訴Nginx儲存單個用的幾個Buffer最大用多大空間
proxy_busy_buffers_size 256k;
#如果系統很忙的時候可以申請更大的proxy_buffers 官方推薦*2
proxy_temp_file_write_size 128k;
#proxy快取臨時檔案的大小
proxy_temp_path /usr/local/nginx/temp;
#用於指定本地目錄來緩衝較大的代理請求
proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#設定web快取區名為cache_one,記憶體快取空間大小為12000M,自動清除超過15天沒有被訪問過的快取資料,硬碟快取空間大小200g
複製程式碼
此處的重點在最後一句,快取儲存路徑為:/usr/local/nginx/cache,levels=1:2代表快取的目錄結構為2級目錄

如下圖,快取會在/usr/local/nginx/cache目錄下生成,包含2級目錄,在之下就是快取檔案,測試的時候可以到該目錄下檢視快取檔案是否生成。

第二步:在訪問靜態檔案的location上新增快取
複製程式碼
#靜態資料儲存時效
location ~ .html$ {
proxy_pass http://source.qingk.cn;
proxy_redirect off;
proxy_cache cache_one;
#此處的cache_one必須於上一步配置的快取區域名稱相同
proxy_cache_valid 200 304 12h;
proxy_cache_valid 301 302 1d;
proxy_cache_valid any 1m;
#不同的請求設定不同的快取時效
proxy_cache_key u

r i uri is_args$args;
#生產快取檔案的key,通過4個string變數結合生成
expires 30d;
#其餘型別的快取時效為30天
proxy_set_header X-Forwarded-Proto $scheme;
}
複製程式碼
此處需要注意3點:

1、只有在proxy_pass的時候,才會生成快取,下一次請求執行到proxy_pass的時候會判斷是否有快取,如果有則直接讀快取,返回給客戶端,不會執行proxy_pass;如果沒有,則執行proxy_pass,並按照規則生成快取檔案;可以到nginx的cache資料夾下看是否生成了快取檔案。

2、proxy_set_header Host $host 這一句可能導致快取失敗,所以不能配置這一句。我在測試的時候遇到了這個問題,不明原理。

3、proxy_pass使用upstream出差,換成域名或ip則可行。

第三步:在proxy_pass跳轉的location中配置靜態檔案的路徑
location ~ .*.(html)$ {
default_type ‘text/html’;
root “/usr/local/openresty/nginx/html”;
}
將nginx本地存放靜態檔案的路徑配到root指令處

如果沒有這一句:default_type ‘text/html’,所有的請求都預設是下載檔案,而不是訪問html頁面

到此,靜態檔案快取已經配置完成。但是還差很重要的最後一步,快取生成之後會阻止訪問進入後臺和nginx本地,如果有更新,則更新內容無法生效,還需要一種手動清除快取的機制。

第四步:清除快取
快取檔案是根據proxy_cache_key這個指令生成的,所以找到對應的快取檔案,刪除即可

複製程式碼
location ~ /purge(/.*) {
#刪除指定快取區域cache_one的特定快取檔案 1 1 is_args$args
proxy_cache_purge cache_one 1 1 is_args$args;
#執行本機和10.0.217.0網段的機器訪問,拒絕其它所有
allow 127.0.0.1;
allow 10.0.217.0/24;
deny all;
}
複製程式碼
刪除快取用到proxy_cache_purge指令。

至此快取生成和特定清除機制都已經實現