Nginx 日志切割后还在往老文件里写?句柄没放开

A 版正文

服务器磁盘莫名其妙被日志吃满,一查发现两个 nginx 访问日志:一个是当天的 access.log,一个是几十 GB 的 access.log-2025xxxx——日志明明按天切割了,为什么老文件还在长?

原因:Linux 的文件名只是"名字",程序握着的是"句柄"。 nginx 启动时就打开了日志文件并一直握着这个文件描述符,之后 mv 改名只是换了个名字,句柄指向的还是同一个文件——nginx 继续往"改了名的老文件"里写,新文件反而一直是空的。这不是 nginx 的 bug,是日志切割后少做了"通知"这一步。

正确姿势两步。 第一步,切割命令里 mv 之前先复制后清空(copytruncate 方式),或者按更标准的做法:mv 之后给 nginx 发重开日志的信号,让它放下老句柄、打开新文件:

mv access.log access.log-$(date +%F)
nginx -s reopen

(旧版本 nginx 可用 kill -USR1 主进程号,效果相同——USR1 信号就是"重新打开日志文件"的专用指令。)第二步,检查脚本执行者权限:切割脚本以普通用户跑时,可能没有权限写新日志文件,导致 reopen 后静默失败,日志继续涌向老文件。

验证方法:切割并 reopen 后执行 ls -l /proc/$(cat logs/nginx.pid)/fd | grep access,看 nginx 当前打开的日志句柄指向哪个文件——指向新文件名才算切换成功。把这套动作固化进 logrotate 配置(postrotate 段里加 reopen 信号),以后每天自动切割自动重开,再也不会出现"幽灵老文件"。

日志治理是服务器运维的基本功:切割策略、磁盘水位告警、日志外发归档是一套组合。贵州诚鑫致达科技为企业提供服务器运维托管与巡检服务,日志这类小事我们也当成制度来管,欢迎搜索"诚鑫致达 服务器运维"了解。

(约 700 字)


B 版 5 图文卡要点(贴图号/小红书取用)

  • 卡1:大字「磁盘又被日志吃满了?」/小字「切割了,怎么老文件还在长」
  • 卡2:大字「程序握着的是句柄,不是文件名」/小字「mv 只是改名,nginx 没松手」
  • 卡3:大字「切割后补一个信号」/小字「nginx -s reopen(或 USR1)」
  • 卡4:大字「写入 /proc 的 fd 一验便知」/小字「句柄指向新文件才算成」
  • 卡5:大字「固化进 logrotate」/小字「postrotate 里加 reopen,一劳永逸」

3 标题变体

  1. (疑问式)日志切割了,为什么老文件还在涨?
  2. (数字式)Nginx 日志切割翻车的 1 个原因和 2 步修复
  3. (场景式)磁盘警报响了,凶手是上周就该轮走的日志

SEO 话题标签

#Nginx #日志切割 #Linux运维 #logrotate #服务器 #运维技巧

建议平台与发布时段

  • 平台:头条(A 版);CSDN(A 版);知乎(A 版,运维长尾);微信贴图号(B 版五卡)
  • 时段:工作日晚上 20:00–22:00(运维自查时段)

红线自检

无政治/黄赌/极限词/价格/盗版表述;命令为 nginx 官方通用用法;品牌名仅正文 1 次轻钩(陈述式,与同批轮换)。✅


企业存储选型参考|贵州诚鑫致达

做机房存储、虚拟化或监控归档,群晖机型参考:FS6400(全闪存阵列) · SA3610 · SA3410。需要选型建议或上门评估,搜「诚鑫致达」即可找到我们。

服务区域|贵州诚鑫致达

贵州群晖NAS、贵阳存储、数据备份、信创云盘或 IT 集成服务,可联系贵州诚鑫致达科技,服务范围覆盖贵州全省各市州。重庆企业 NAS 存储、服务器运维与容灾备份方案。