Nginx缓存的两种方式

这里 Cache 有两种情况说明,一种是浏览器访问Nginx,浏览器会Cache;一种是Nginx 访问后端,Nginx 自己Cache 。

 

第一种情况

来个例子:

$ curl -I http://www.12reads.cn
HTTP/1.1 200 OK
Server: JSP3/2.0.4
Date: Fri, 31 Oct 2014 07:28:20 GMT
Content-Type: text/css
Content-Length: 25076
Connection: keep-alive
ETag: “1121644245”
Last-Modified: Wed, 24 Sep 2014 15:50:22 GMT
Expires: Mon, 23 Mar 2015 16:29:25 GMT
Age: 3164335
Cache-Control: max-age=15552000
Accept-Ranges: bytes
Vary: Accept-Encoding

先多句嘴说说Date 和 Age 的意思,Date 的意思是服务器发送消息的时间; Age 的意思有点复杂,它的存在暗示你访问的服务器不是源服务器,而是一台缓存服务器,Age 的大小表示这个资源已经”存活了”多长时间,所以这个值不会大于 源服务器设置的最大缓存时间。

这里Expires 表示过期时间,Cache-Control 表示最大的存活时间,在服务器端的Nginx 我们可以用 expires 指令来定义这两项。

比如:
expire -1;
expire 0;
expire 1h;
expire max;
expire off;

这个指令表示在HTTP响应头中是否增加或修改Expires 和 Cache-Control ,仅当响应状态是200, 201, 204, 206, 301, 302, 303, 304, 或者 307的时候有效。

当expire 为负时,会在响应头增加Cache-Control: no-cache;

当为正或者0时,就表示Cache-Control: max-age=指定的时间(秒);

当为max时,会把Expires设置为 “Thu, 31 Dec 2037 23:55:55 GMT”, Cache-Control 设置到 10 年;

当为off时,表示不增加或修改Expires 和 Cache-Control 。

 

另外,浏览器可以通过两种方式来判断缓存文件是否被更新了,一种是 If-Modified-Since ,浏览器通过发送If-Modified-Since 头,带上「上一次请求获得的修改时间,(在Last-Modified头里)」发送到服务器,服务器会判断这个时间之后文件有没有改变,如果没有改变返回状态值304,如果有返回新文件,状态值200 。

还有一种是利用Etag(Entity Tag),它是实体内容的hash字符串(md5或者SHA1的算法计算出来的),这个方法更准确但是更消耗服务器的CPU,浏览器发送If-None-Match 头,里面是Etag值(浏览器之前请求文件时,服务器会返回Etag 头),服务器收到后做比较,如果一样就返回304,不一样也发送最新文件,返回值200。(本文由管理学书籍 http://www.12reads.cn/ 原创)

 

第二种情况

 一般先在http 里面定义一个缓存路径:

[text]
proxy_buffering on;
proxy_cache_path $cache_path/m_wdjcdn_com levels=1:2 keys_zone=m_wdjcdn_com:512m inactive=20d max_size=300G;

[/text]

然后在server 的 location 里来使用缓存,比如:

[text]

proxy_cache m_wdjcdn_com;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_valid 200 301 302 20m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout invalid_header updating;
proxy_cache_min_uses 1;
proxy_cache_revalidate on;
[/text]

要注意,proxy_cache在proxy_buffering 开启之后才有效,否则不会缓存

proxy_cache_path 的levels 定义目录层次结构;inactive 表示数据没被访问多长时间后从缓存中删除;缓存大小超过max_size之后使用LRU算法删除数据。

proxy_cache 定义使用哪个zone;
proxy_cache_key 定义缓存key;
proxy_cache_valid 不同状态码缓存不同时间;
proxy_cache_use_stale 定义后端服务器在何种情况下Nginx 返回过期的缓存;
proxy_cache_min_uses 请求多少次之后才会被缓存;
proxy_cache_revalidate 表示资源过期后是否使用If-Modified-Since 和If-None-Match来确认资源是否改变。

另外,还有一个指令 proxy_cache_purge,它用于清除缓存,比如下面的配置:

[text]location ~ /purge(/.*) {
proxy_cache_purge m_wdjcdn_com ""$scheme$host$1";
}[/text]

如果访问/purge/nosa.png,就把nosa.png的缓存清除了,这个功能可用于刷新缓存。

 

最后再看下关于 proxy_cache_use_stale 的官方解释:

This directive tells Nginx when to serve a stale item from the proxy cache. The parameters for this directive are similar to proxy_next_upstream with the addition of ‘updating’.

To prevent cache stampedes (when multiple threads stampede in to try to update the cache simultaneously) you can specify the ‘updating‘ parameter. This will cause one thread to update the cache and while the update is in progress all other threads will serve the stale version of what is in the cache.

<think>好的,我现在需要回答用户关于如何清理Nginx缓存的查询。首先,我得回顾一下Nginx缓存的工作原理,因为了解机制有助于找到清理方法。根据引用[1],Nginx通过哈希值决定缓存文件的存储路径,所以清理缓存可能需要删除这些特定文件或者目录。 接下来,我应该考虑用户可能需要的具体步骤。用户询问的是最佳实践和方法,因此需要详细说明手动清理和自动清理两种方式。手动清理包括直接删除缓存目录下的文件,这需要知道缓存路径的位置,通常在配置文件中定义,比如proxy_cache_path指定的路径。然后使用rm命令删除,或者使用proxy_cache_purge模块来按需清理特定内容。这部分可能需要检查Nginx是否编译了该模块,并配置相应的location块。 自动清理方面,可以设置缓存过期时间,比如proxy_cache_valid指令,这样旧的缓存会自动被删除。另外,定期清理脚本也是一个方法,比如结合find命令定期删除过期文件。同时,可能需要提及权限问题,确保执行删除操作的用户有足够的权限。 还需要注意引用中的信息是否正确。引用[4]提到了stub_status模块的配置,虽然和缓存清理无关,但提醒我要确保在配置任何新模块后重新加载Nginx。此外,用户可能需要参考官方文档或最佳实践,比如引用[1]和[4]提到的Nginx配置要点,来确认步骤的正确性。 最后,应该生成相关问题,帮助用户深入理解,比如如何配置缓存、监控缓存状态或处理清理后的验证。要确保回答结构清晰,步骤详细,并且引用正确的来源,比如在提到proxy_cache_path时引用[1]的信息。</think>### 如何清理Nginx缓存的方法和最佳实践 #### 1. **理解Nginx缓存机制** Nginx通过`proxy_cache_path`指令定义缓存路径和参数,缓存文件以哈希值命名并存储在指定目录中[^1]。例如: ```nginx proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m; ``` - **`/data/nginx/cache`**:缓存文件存储路径。 - **`inactive=60m`**:60分钟内未被访问的缓存自动清理[^1]。 --- #### 2. **手动清理缓存的方法** ##### (1) **直接删除缓存文件** - **步骤**: 1. 定位缓存目录(如`/data/nginx/cache`)。 2. 使用命令删除文件: ```bash rm -rf /data/nginx/cache/* ``` 3. 重新加载Nginx配置: ```bash nginx -s reload ``` - **注意**:需确保Nginx服务有目录操作权限[^4]。 ##### (2) **使用`proxy_cache_purge`模块** - **前提**:Nginx需编译安装`ngx_cache_purge`模块。 - **配置示例**: ```nginx location /purge { allow 127.0.0.1; deny all; proxy_cache_purge my_cache $scheme$request_method$host$request_uri; } ``` - **操作**:访问`http://example.com/purge/需清理的URL`即可删除特定缓存[^1]。 --- #### 3. **自动清理缓存的配置** ##### (1) **设置缓存过期时间** 在Nginx配置中定义缓存有效期: ```nginx proxy_cache_valid 200 302 10m; # 成功响应缓存10分钟 proxy_cache_valid 404 1m; # 404响应缓存1分钟 ``` - 超时的缓存文件会被自动清理。 ##### (2) **定期清理脚本** 通过`cron`任务定期清理过期文件: ```bash find /data/nginx/cache -type f -mtime +7 -exec rm -f {} \; ``` - 此脚本会删除7天前的缓存文件。 --- #### 4. **验证清理结果** - **检查缓存目录**: ```bash ls -l /data/nginx/cache ``` - **通过`stub_status`监控缓存状态**(需提前配置)[^4]: ```nginx location /status { stub_status; } ``` 访问`http://status.example.com/status`查看缓存命中率等指标。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值