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指令。
至此緩存生成和特定清除機制都已經實現。