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 $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$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指令。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM