You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:36:03