nginx 通过 http 和 stream 模块分别实现 http/https 与 tcp/udp 流量的标准化日志输出(json 格式),再经 filebeat 等工具打标、增强后推送至 elasticsearch、s3 或 kafka 归档;https 场景可借助 ssl_preread 获取 tls 元数据并写入日志。

Nginx 本身不直接提供“流量归档”功能(如完整报文捕获、长期存储、审计日志回溯等),但可以通过组合其反向代理、日志模块与外部工具,实现对 HTTP/HTTPS、TCP、UDP 等不同协议流量的**统一记录与结构化留存**。关键在于:归档不是靠 Nginx 存储原始数据,而是由它完成协议识别、标准化日志输出,并交由下游系统(如 Fluentd、Logstash、自研归档服务)做持久化和索引。
明确归档目标与协议分类
所谓“不同协议流量”,在 Nginx 中主要分两类处理路径:
-
七层(HTTP/HTTPS)流量:走
http模块,可获取完整请求头、URL、响应状态、客户端 IP、时间戳、TLS 信息等;适合做行为审计、API 调用归档、安全分析。 -
四层(TCP/UDP)流量:走
stream模块(需启用ngx_stream_core_module),仅能记录连接元数据(源/目的 IP+端口、连接时长、字节数、会话建立/关闭时间),无法解析应用层内容;适用于数据库连接、游戏心跳、IoT 设备通信等场景的连接级归档。
配置标准化访问日志格式
统一归档的前提是日志字段一致、可解析。建议定义一个跨协议的通用日志格式(例如 JSON),并在 http 和 stream 块中分别配置:
- 在
http块中添加:log_format archive_json escape=json '{' '"time": "$time_iso8601",' '"client": "$remote_addr",' '"host": "$host",' '"method": "$request_method",' '"uri": "$request_uri",' '"status": $status,' '"bytes": $body_bytes_sent,' '"upstream": "$upstream_addr",' '"duration": $request_time' '}'; - 在
stream块中添加(Nginx 1.19+ 支持):log_format stream_archive_json escape=json '{' '"time": "$time_iso8601",' '"client": "$remote_addr:$remote_port",' '"server": "$server_addr:$server_port",' '"protocol": "$protocol",' '"bytes_in": $bytes_received,' '"bytes_out": $bytes_sent,' '"session_time": $session_time' '}'; - 将两个日志分别写入独立文件(如
/var/log/nginx/http-archive.log和/var/log/nginx/stream-archive.log),便于后续按协议分流处理。
对接归档后端系统
Nginx 日志是文本流,不能直接存为“归档包”。需借助日志收集器做实时转发与格式增强:
- 用 Filebeat 或 Fluent Bit 监控两个日志文件,自动打上
type: http_archive或type: stream_archive标签; - 通过
processors补充字段,例如加入集群名、机房区域、负载均衡器实例 ID; - 输出到统一目标:Elasticsearch(支持全文检索与时间线分析)、S3 兼容对象存储(压缩为
.gz+ 按小时分片,满足合规性冷存要求)、或 Kafka(供实时风控系统消费)。
补充说明:HTTPS 与 TLS 元数据归档
若需归档 TLS 握手信息(如 SNI、证书指纹、协商协议版本),可在 http server 块中启用:ssl_preread on;(配合 stream 模块的 ssl_preread 变量)
再结合 $ssl_preread_server_name、$ssl_preread_protocol 等变量,将这些字段注入上述 JSON 日志中——这样即使不终止 HTTPS,也能记录关键加密上下文。
不复杂但容易忽略的是日志权限与轮转:确保 nginx 进程有写权限,且用 logrotate 配置自动压缩与过期清理,避免磁盘打满影响主服务。











