K8s环境下Nginx Ingress Controller临时文件存储问题及排查咨询
Nginx Ingress Controller 临时文件存储问题解答
1. 默认临时文件存储位置
官方发行的ingress-nginx镜像默认会将客户端请求缓冲、代理响应缓冲等临时文件存储在/var/cache/nginx/目录下的对应子目录中,你日志中出现的/var/cache/nginx/client_temp/就是专门存储客户端POST请求体的临时目录。
该目录的存储介质取决于Pod的挂载配置:如果没有做额外挂载,默认存储在容器的可写层;如果配置了emptyDir卷挂载,则存储在对应emptyDir的介质中。
2. 路径下查询不到临时文件的原因
Nginx生成的请求体临时文件仅在请求处理过程中存在,请求处理完成(成功/失败)后会被自动删除。你看到日志后再进入Pod查询时,对应请求已经处理完毕,文件已经被清理,所以查不到相关文件是正常现象。如果需要验证文件存在,可以传输一个超大文件,在传输过程中进入对应路径查询即可看到临时文件。
3. 实现上传文件直接写入Pod内存的配置方案
要避免请求体写入磁盘,只需保证所有请求体都可以被Nginx的内存缓冲区容纳,无需触发磁盘缓冲逻辑,核心配置参数如下:
client_body_buffer_size:Nginx用于存储客户端请求体的内存缓冲区大小,只要请求体大小小于该值,就会完全存储在内存中,不会写入磁盘client_max_body_size:Nginx允许的最大客户端请求体大小,需设置为小于等于client_body_buffer_size,避免超过缓冲区阈值触发磁盘写入
你可以根据生效范围选择对应的配置方式:
全局生效配置
修改ingress-nginx控制器的ConfigMap,添加以下参数:
data: client-body-buffer-size: "100M" # 建议比允许的最大上传大小大20%以上 client-max-body-size: "80M" # 按业务实际最大上传需求设置
单个Ingress规则生效配置
给对应业务的Ingress资源添加以下注解:
annotations: nginx.ingress.kubernetes.io/client-body-buffer-size: "100M" nginx.ingress.kubernetes.io/proxy-body-size: "80M"
双保险配置
如果要彻底避免任何临时文件写入磁盘,可以将/var/cache/nginx目录挂载到内存型emptyDir,就算触发临时文件写入也只会写到内存tmpfs中,不会落盘,Pod的volume配置示例:
volumes: - name: nginx-cache-tmp emptyDir: medium: Memory sizeLimit: 128Mi volumeMounts: - name: nginx-cache-tmp mountPath: /var/cache/nginx
4. 排查验证方案
- 登录ingress controller Pod,执行
cat /etc/nginx/nginx.conf检查对应配置块下的client_body_buffer_size、client_max_body_size参数是否符合预期,确认配置已经生效 - 上传大小接近
client_max_body_size的测试文件,检查Nginx日志是否还会出现a client request body is buffered to a temporary file的警告日志,没有出现说明内存缓冲配置生效 - 执行
df -h /var/cache/nginx查看路径挂载的文件系统类型,如果是tmpfs类型说明该路径已经挂载到内存,所有写入该路径的文件都不会落到磁盘
内容的提问来源于stack exchange,提问作者Danilo Patrucco
相关产品推荐
相关产品推荐

