在 access_log 中需配合 buffer 使用 flush=时间值(如 flush=5s),单位仅支持秒,用于控制日志缓冲区最迟写入磁盘时限,修改后 reload 生效,实际刷盘频率取决于 buffer 填满速度与 flush 超时的任一触发。

直接在 access_log 指令中添加 flush=时间值 即可,比如 flush=5s 表示缓冲区内容最多停留 5 秒就必须写入磁盘。这个参数不能单独使用,必须和 buffer 配合才生效。
flush 必须依赖 buffer 才起作用
如果没有先配置 buffer=大小(例如 buffer=64k),Nginx 会直接忽略 flush 设置。这是因为 flush 的作用对象是内存缓冲区,没有 buffer 就没有“缓存内容”,自然谈不上“最迟多久刷盘”。
-
buffer定义了日志暂存的内存空间上限 -
flush定义了这部分内容在内存中驻留的最长时间 - 两者共同构成“大小或时间任一满足即刷盘”的触发逻辑
时间单位只能是秒,不支持毫秒缩写
官方只接受 s 作为单位,例如 flush=1s、flush=10s。虽然部分旧文档提到 500ms 写法,但实测中 Nginx 会报配置错误或静默失效。
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
- 正确写法:
flush=3s、flush=30s - 错误写法:
flush=3000ms、flush=1m、flush=0.5s - 修改后需执行
nginx -s reload生效,无需重启进程
按业务场景选合适的时间值
太短会增加 I/O 频次,太长会影响问题定位时效性。推荐根据实际需求折中选择:
- 监控类接口、安全审计要求高:用
flush=1s或flush=2s - 通用 Web 服务:
flush=5s是较稳妥的平衡点 - 日志量极大且磁盘响应慢:可放宽到
flush=10s,但断电时最多丢失 10 秒日志
注意 flush 不是固定周期刷盘
它不是“每 N 秒准时刷一次”,而是“从上一次刷盘开始计时,超时就刷”。如果请求密集、buffer 很快写满,实际刷盘可能远高于设定频率;反之低峰期则接近 flush 间隔。
- 这意味着日志时间戳不会严格等距,而是呈脉冲式增长
- 可通过
strace -p $(pgrep nginx) -e write观察系统调用节奏验证是否符合预期 - 搭配
iostat -x 1查看磁盘写入的 %util 和 await 是否明显回落

















