nginx靜態文件緩存的解決方案

nginx的一大功能就是完成靜態資源的分離部署,減輕後端服務器的壓力,若是給這些靜態資源再加一級nginx的緩存,能夠進一步提高訪問效率。html

第一步:添加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級目錄nginx

以下圖,緩存會在/usr/local/nginx/cache目錄下生成,包含2級目錄,在之下就是緩存文件,測試的時候能夠到該目錄下查看緩存文件是否生成。web

第二步:在訪問靜態文件的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 $uri$is_args$args;
      #生產緩存文件的key,經過4個string變量結合生成
      expires 30d;
      #其他類型的緩存時效爲30天
      proxy_set_header X-Forwarded-Proto $scheme;
}

此處須要注意3點:後端

一、只有在proxy_pass的時候,纔會生成緩存,下一次請求執行到proxy_pass的時候會判斷是否有緩存,若是有則直接讀緩存,返回給客戶端,不會執行proxy_pass;若是沒有,則執行proxy_pass,並按照規則生成緩存文件;能夠到nginx的cache文件夾下看是否生成了緩存文件。緩存

二、proxy_set_header Host $host 這一句可能致使緩存失敗,因此不能配置這一句。我在測試的時候遇到了這個問題,不明原理。服務器

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

第三步:在proxy_pass跳轉的location中配置靜態文件的路徑

location ~ .*\.(html)$ {
    default_type 'text/html';
    root "/usr/local/openresty/nginx/html";
}

將nginx本地存放靜態文件的路徑配到root指令處spa

若是沒有這一句:default_type 'text/html',全部的請求都默認是下載文件,而不是訪問html頁面代理

到此,靜態文件緩存已經配置完成。可是還差很重要的最後一步,緩存生成以後會阻止訪問進入後臺和nginx本地,若是有更新,則更新內容沒法生效,還須要一種手動清除緩存的機制。rest

第四步:清除緩存

緩存文件是根據proxy_cache_key這個指令生成的,因此找到對應的緩存文件,刪除便可

location ~ /purge(/.*) {
    #刪除指定緩存區域cache_one的特定緩存文件$1$is_args$args
    proxy_cache_purge cache_one $1$is_args$args;
    #運行本機和10.0.217.0網段的機器訪問,拒絕其它全部  
    allow           127.0.0.1;
    allow           10.0.217.0/24;
    deny          all;
}

刪除緩存用到proxy_cache_purge指令。

至此緩存生成和特定清除機制都已經實現。

相關文章
相關標籤/搜索