Nginx无法将缓存内容写入gcsfuse装载目录

waxmsbnn  于 2022-12-29  发布在  Nginx
关注(0)|答案(1)|浏览(147)

我通过gcsfuse挂载了bucket来计算引擎VM,然后在VM中运行了Nginx程序,通常Nginx程序会使用proxy_cache指令该高速缓存写入目录,即挂载的bucket,但是我遇到了一个问题,Nginx可以在bucket目录下的文件系统中创建缓存文件。但是该高速缓存文件的大小始终是0 B.客户端请求不断得到“未命中缓存”状态。因此,似乎在使用gcsfuse挂载后,Nginx应用程序只能创建缓存文件,但无法写入它们。
我的VM环境是。计算机类型:n2-标准-2 CPU平台:英特尔级联湖架构:x86/64系统:乌班图-1804
此外,gcsfuse通过--key-file指令指定了一个具有所有者权限的服务帐户,Nginx程序以root用户身份运行。
例如,以下调试日志是一个空文件(8/2b/0a 7 ed 71 cddee 71 b 9276 a0 d 72 a030 f2 b8),它是在客户端请求之后在存储桶中创建的,并且没有写入该高速缓存。
https://storage.googleapis.com/cloud_cdn_cache_bucket/debug_log.txt
下面是通过命令--debug_fuse --debug_fs --debug_gcs --debug_http -foreground获得的调试日志。

zzwlnbp8

zzwlnbp81#

你不能使用云存储Fuse进行缓存。
这是有技术原因的:GCSFuse是一个云存储API调用 Package 器,可将系统调用转换为API调用。但是,并不支持所有系统调用,尤其是与“数据库”格式相关的系统调用,包括文件的流写入、查找和重写部分内容。所有用于数据库(或缓存)但不符合云存储的常见操作:您只能写入/读取/删除文件。不支持更新/部分写入。它不是文件系统!
此外,因为您现在知道GCSFuse是一个 Package 器(系统调用到API调用的 Package 器),所以您应该觉得使用该文件系统类型不是一个好主意:延迟是可怕的!!这是API调用!绝对不推荐用于缓存和低延迟操作。
最好的解决方案是使用一个专用于缓存的本地文件系统,但如果您横向扩展(更多的服务器并行),您可能会遇到问题(缓存不在示例之间共享):

  • 使用粘性会话机制来总是在相同的NGINX服务器上路由相同的用户会话,因此总是使用相同的高速缓存上下文
  • 使用提供NFS(网络文件共享)系统的Filestore服务在不同的服务器上装载相同的存储空间,延迟很有趣(不如本地文件系统)

您在问题中也提到了密钥文件,我建议您尽量避免使用服务帐户密钥文件;特别是当你的应用运行在谷歌云上时。如果你需要更多的指导,请让我知道你的关键文件的详细使用情况

相关问题