log_format download '$remote_addr $request_time $status $body_bytes_sent "$http_range" $request';
access_log /var/log/nginx/download.log download;

用户反馈下载到 99% 失败,运维翻遍日志只有 access.log 里的 200,没有文件大小、耗时和断点信息,复现不了也定位不到。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,Nginx 默认日志格式只有基础字段,没有记录请求耗时、响应字节和 Range 头。PHP 下载脚本也没写业务日志。

「下载日志记录」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

报错里带路径的,先去看那个路径在不在、权限对不对。

处理上按这个顺序:自定义 log_format,加上 request_time、body_bytes_sent 和 http_range;下载处理入口记录用户 ID、文件 ID 和结果码;模拟一次中断下载,确认日志里能看到对应记录。

改完只确认一件事:中断一次下载后,日志里能查到耗时、字节数和 Range 头。

作者 9823189