我们有一个非常动态且流量很大的应用程序,并且正在使用 NGINX 缓存动态 URL。我们希望缓存这些 URL 以应对重复请求。
我们在扩展时遇到过几次问题,当我们达到最大条目数时,keys_zone
服务器开始抛出 500 错误,并且服务器对从未请求过的新 URL/文件做出空白响应。请参阅Nginx:尽管有足够的空间,但“缓存键区域中没有内存”以供参考
错误示例:
[crit] 30568#0: ngx_slab_alloc() failed: no memory in cache keys zone "PAGES"`
[alert] 27697#27697: could not allocate node in cache keys zone "PAGES"
我们的缓存:
proxy_cache_path /usr/share/nginx/cache levels=1:1:2 keys_zone=PAGES:50m inactive=7d max_size=900m;
扩大keys_zone
大小或重新启动可以暂时解决问题。但我们希望维护一个固定的缓存,清除旧的未使用条目,而不是扩大 keys_zone 以支持我们可以服务的每个文件/URL。
如果有人了解 NGINX 内部工作原理,请问:
- 我理解我们在 中创建的键过多
keys_zone
。如果我们将 做得max_size
足够小,它会停止在 中创建新条目keys_zone
,而是覆盖现有条目吗? - 该
inactive
参数是否与 有关系keys_zone
?由于我们的非活动集很长,这会保留 中的条目吗keys_zone
? - 有没有办法
keys_zone
无需重新启动 NGINX 即可清除记录?
答案1
所有文件都是这里
答案:
- 不,缓存管理器负责这个
特殊的“缓存管理器”进程监视由 max_size 参数设置的最大缓存大小。当超过此大小时,它将删除最近最少使用的数据。数据在由 manager_files、manager_threshold 和 manager_sleep 参数 (1.11.5) 配置的迭代中删除。在一次迭代期间,不会删除超过 manager_files 个项目(默认情况下为 100 个)。一次迭代的持续时间受 manager_threshold 参数限制(默认情况下为 200 毫秒)。在迭代之间,将进行由 manager_sleep 参数配置的暂停(默认情况下为 50 毫秒)。
- 是的
在 inactive 参数指定的时间内未访问的缓存数据将从缓存中删除,无论其新鲜度如何。默认情况下,inactive 设置为 10 分钟。
- 我猜删除缓存文件会解决问题,但不建议这样做。推荐的方法是根据您的需要配置 nginx
您应该稍微尝试一下该指令的不同参数,proxy_cache_path
直到它满足您的需求。
建议:
inactive=7d
可能太高了,会长时间保存不必要的缓存。也许您的用例需要它,但请注意默认值为 10 分钟。如果在“缓存管理器”运行期间创建了超过 100 个新键,那么它将无法跟上,你应该更改
manager_files
andmanager_threshold
/ormanager_sleep
参数