一、proxy_cache概述
proxy_cache是nginx中自帶的模塊,用於緩存響應,在未來的請求中將緩存的響應直接返回,加快響應速度。proxy_cache與proxy_pass聯用,將源站的響應緩存下來,省去了再向源站發起請求的步驟。這個特性在高並發的場景下非常有用,可以大幅度減輕源站的壓力。
為了讓proxy_cache發揮出更好的效果,需要根據具體的情況對代理的配置做出優化,如設置cache有效時間、cache大小限制等。
二、proxy_cache清除
在代理緩存中,為了避免臟數據和緩存失效,需要定期清理緩存。
1、手動清除
# 清空所有緩存
$ nginx -s stop
$ rm -rf /var/cache/nginx/*
$ nginx
2、自動清除
可以通過定期刪除緩存目錄下的過期文件來實現自動清除。在nginx.conf中進行配置:
http {
proxy_cache_path /var/cache/nginx levels=1:2
keys_zone=my_cache:10m
inactive=60m;
proxy_cache_key "$scheme$request_method$host$uri$is_args$args";
server {
...
location / {
proxy_cache my_cache;
proxy_pass http://localhost:8000;
add_header X-Proxy-Cache $upstream_cache_status;
proxy_cache_valid 200 10m; # 如果響應狀態碼為200,則緩存在10分鐘有效
proxy_cache_valid any 1m; # 如果響應狀態碼為非200,則緩存在1分鐘有效
proxy_cache_bypass $http_pragma;
proxy_cache_revalidate on;
}
...
}
}
三、proxy_cache內存
proxy_cache數據可以存儲在內存中,而不是磁盤上。這樣做的優點是:讀取速度更快,更適合緩存小文件或大量請求指向同一緩存的場景。默認情況下,nginx將緩存數據存儲在磁盤上。
可以通過在CACHE_PATH中添加參數:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m use_temp_path=off max_size=100m可配置最大內存緩存容量。
四、proxy_cache站群
proxy_cache在站群架構中有着非常重要的作用。在使用proxy_cache站群時,源站響應需要緩存到多個服務器上,從而實現更高效的讀取。在nginx.conf中配置如下:
upstream backend {
server backend1.example.com:8080;
server backend2.example.com:8080;
...
server backendN.example.com:8080;
}
server {
...
location / {
proxy_cache my_cache;
proxy_pass http://backend;
add_header X-Proxy-Cache $upstream_cache_status;
}
...
}
五、proxy_cache valid
proxy_cache_valid指令用來控制響應緩存的有效時間。在nginx.conf中可配置具體的響應狀態碼的緩存時間。
proxy_cache_valid 200 1h; # 緩存狀態碼為200的響應1小時
proxy_cache_valid 404 1m; # 緩存狀態碼為404的響應1分鐘
proxy_cache_valid 500 1s; # 緩存狀態碼為500的響應1秒
六、proxy_cache nginx
nginx本身也可以作為代理被緩存。可以通過子服務配置實現proxy cache。
proxy_cache_path /var/cache/nginx keys_zone=my_zone:10m;
server {
...
listen 8000;
proxy_cache my_zone;
proxy_pass http://localhost:9000;
...
}
七、proxy_cache清除批量
定期清理proxy cache是非常有必要的,但是對大型網站而言,手動清理的效率往往不能滿足需求。
可以通過腳本實現nginx代理清除:
#!/bin/bash
# 緩存目錄
cache_path=/var/cache/nginx
# 待刪除的目錄
remove_dirs=( $(find $cache_path/* -type d -mtime + 30) )
# 刪除緩存目錄下超時的緩存數據
for dir in ${remove_dirs[@]}
do
echo "removing cache in $dir"
rm -rf $dir/*
done
# 刪除目錄時,目錄時完全匹配緩存項的key值,所以執行完之後需要調用一次proxy_cache_path指令
nginx -s reload
八、proxy_cache一直Miss
如果在配置中出現了proxy_cache一直miss的情況,考慮以下幾點:
- 檢查緩存目錄是否存在,是否有可讀寫權限
- 檢查傳遞給代理的響應是否正確,可以通過curl模擬http請求或使用tcpdump等抓包工具進行調試
- 檢查proxy_cache_key是否正確,錯誤的代理鍵將導致緩存失效
- 檢查proxy_cache_valid指令,響應狀態碼是否已正確指定
- 檢查proxy_ignore_headers指令,是否包含響應頭信息
通過上述方法進行排查,可以解決proxy_cache一直miss的問題,保持proxy_cache的有效性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/195388.html