要通过 client_body_in_file_only 实现离线流量行为审计,核心是让 Nginx 将所有请求体(无论大小、是否为空)都强制写入磁盘文件,并确保这些文件在请求结束后不被自动清理,供后续分析使用。

要通过 client_body_in_file_only 实现离线流量行为审计,核心是让 Nginx 将所有请求体(无论大小、是否为空)都强制写入磁盘文件,并确保这些文件在请求结束后不被自动清理,供后续分析使用。
明确配置目的与风险前提
该配置会使每个 HTTP 请求的完整 body(包括 POST 表单、JSON、XML、甚至空 body)都落地为一个独立临时文件。这意味着:
- 磁盘 I/O 和空间消耗显著上升,尤其在高并发或高频小请求场景下
- 文件名无业务语义,需配合
$request_id或日志关联才能追溯原始请求 - 敏感数据(如密码、token、身份证号)会明文落盘,必须做好权限隔离与访问控制
- 默认不记录文件路径到 access log,需手动扩展日志格式或用 Lua 模块注入
基础配置:启用强制落盘并保留文件
在对应 http、server 或 location 块中添加:
client_body_in_file_only on; client_body_temp_path /var/log/nginx/client-body 1 2;
说明:
-
on表示请求结束时**不删除**临时文件,文件保留在client_body_temp_path下 -
/var/log/nginx/client-body是自定义路径,建议单独挂载、限速、配监控;不可复用access_log或系统根分区 -
1 2表示两级哈希子目录(如/a/12/0000000001),避免单目录海量文件导致 inode 查找变慢
配套关键配置:保障可审计性与安全性
仅开启 on 不足以支撑有效审计,还需补充以下几项:
-
绑定请求标识:在
log_format中加入$request_id(需先启用random_index on;或用map生成),确保每条日志能对应到具体 client_body 文件 -
限制审计范围:避免全站开启,推荐仅在特定
location /audit-api/下配置,或按if ($request_method = POST)条件嵌套(注意:if 在 location 外慎用) -
设置最大体长与超时:搭配
client_max_body_size 50m;和client_body_timeout 30s;,防止恶意长连接或超大文件耗尽磁盘 -
权限与轮转:确保
nginx worker用户(如nobody)对该路径有读写权限;用 logrotate 或定时脚本清理 24 小时前的文件,避免堆积
验证与调试建议
配置后可通过以下方式确认生效:
- 发起一个简单 POST 请求:
curl -X POST http://your.site/test -d "hello=world" - 检查
/var/log/nginx/client-body下是否生成新文件(即使只有 12 字节也会建空文件) - 查看该文件内容:
xxd /var/log/nginx/client-body/a/12/0000000001,应看到原始 body 数据 - 确认该文件未被自动删除(区别于
clean模式)

















