nginx open_file_cache指令 导致静态文件不能及时更新和出现网页显示不全的问题

发布时间:2020-06-28编辑:脚本学堂
做一个文字直播的项目,为了减轻数据库及web服务器负载,做了以下处理:web前端有CDN,由于直播需要时效性,所以缓存不能太久,可以配置nginx对静态文件的缓存时间:

做一个文字直播的项目,为了减轻数据库及web服务器负载,做了以下处理:
web前端有CDN,由于直播需要时效性,所以缓存不能太久,可以配置nginx对静态文件的缓存时间:
 

复制代码 代码如下:
location ~ ^/zhibo/.*.(html)$ {
        root /data/www;
        expires 30s;
}

这个配置将发送一个header:Cache-Control:max-age=30
浏览器和CDN可以根据这个header来保证缓存时间为30s
服务器端10秒查一次数据库,并生成静态页,这样,用户看到的延迟不会太大

但是并没有得到想要的结果(没有经过CDN的情况):发现30s后,服务器还是返回304,发现返回的header里Last-Modified一直不变,大概30秒后,再去刷新Last-Modified和页面才有变化。去服务器上看静态文件的更新时间是刚刚更新的。为什么客户端看到的是比较旧的页面呢。

打开nginx.conf逐个检查,发现这么一些配置:
 

复制代码 代码如下:
open_file_cache            max=102400 inactive=20s;
open_file_cache_valid      30s;
open_file_cache_min_uses   1;

这几个指令的解释
open_file_cache 指令会对以下信息进行缓存:
* 打开文件描述符的文件大小和修改时间信息
* 存在的目录信息
* 搜索文件的错误信息:文件不存在无权限读取等信息
open_file_cache max=102400 inactive=20s;
#这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
open_file_cache_valid 30s;
#这个是指多长时间检查一次缓存的有效信息。
open_file_cache_min_uses 1;
#open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的。

这下明白了为什么会产生Last-Modified不变的情况了,当nginx对一个静态文件缓存后,如果20s内你还在访问它,那么它的缓存就一直存在。直到20s内你不访问了为止。

另外,还出现了页面显示不全的情况,分析如下:
由于静态文件是10s生成一次,可能文件还没生成完整的情况下,nginx就把文件的大小等信息缓存了,结果出现网页不完整的情况。