Nginx原生HTTP模块仅支持HTTP正向代理的有限统计(如状态码、响应体大小、耗时),HTTPS正向代理因CONNECT隧道机制无法捕获业务层指标,需依赖tcpdump/tshark抓包或改用Squid等专用代理工具实现完整流量分析。

Nginx 原生 HTTP 模块不支持正向代理的完整流量统计报表(如每秒请求数、客户端地域分布、HTTPS/TLS 协议占比、连接耗时分位值等),尤其在处理 HTTPS 正向代理时,因需 CONNECT 隧道机制,大部分关键指标(如响应体大小、状态码、处理时长)根本无法在 Nginx 层面捕获。真正能落地的“详细流量统计报表”,必须拆解为两层:日志采集层 + 外部分析层,且需明确区分 HTTP 与 HTTPS 流量的能力边界。
✅ 能记录并用于分析的基础字段(仅限 HTTP 正向代理)
当客户端通过 Nginx 发起纯 HTTP 请求(非 HTTPS),且配置了标准 proxy_pass http://$host$request_uri 时,Nginx 可在 access_log 中记录以下可用变量:
-
$remote_addr:发起请求的客户端真实 IP(若经多层代理,需配合X-Forwarded-For解析) -
$time_local:请求到达时间(精度到秒,可用于按分钟/小时聚合) -
$request:完整请求行(含 method、path、HTTP 版本,可提取 URI 和协议类型) -
$status:Nginx 返回给客户端的状态码(注意:这是 Nginx 自身响应,不是后端返回值) -
$body_bytes_sent:Nginx 发送给客户端的响应体字节数(不含响应头) -
$request_time:从读取第一个字节到发送完响应的总耗时(单位:秒,精度 0.001) -
$upstream_response_time:Nginx 与后端建立连接、发送请求、接收响应的总耗时(需后端有响应)
⚠️ 注意:这些字段仅对 HTTP 请求有效。一旦客户端发的是
CONNECT www.example.com:443(即 HTTPS 隧道请求),Nginx 在location /中无法解析其内容,$request只是CONNECT ...字符串,$status固定为 200(隧道建立成功),$body_bytes_sent和$upstream_response_time均为空或不可靠——此时 Nginx 只做 TCP 透传,不参与 HTTP 层交互。
✅ 必须启用的日志格式与配置(HTTP 正向代理专用)
在 http { } 块中定义结构化日志格式,并绑定到正向代理 server:
log_format forward_http_log
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time';
server {
listen 3128;
resolver 114.114.114.114 valid=30s;
location / {
proxy_pass http://$host$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
access_log /var/log/nginx/forward-http-access.log forward_http_log;
}
}✅ 这样生成的日志可直接被 goaccess、awstats、ELK 或自研脚本解析,生成:
- 每小时请求数趋势图
- 客户端 IP 访问 TOP10
- 平均响应时间 & 耗时 >1s 的请求占比
- 各 URL path 的流量占比(如
/download/xxx.deb占比高,说明缓存命中或下载行为集中)
❌ HTTPS 正向代理的统计盲区与替代方案
Nginx 默认完全无法统计 HTTPS 隧道内的实际行为:
- 不知道客户端访问的是 google.com 还是 github.com
- 不知道传输了多大文件(
body_bytes_sent是隧道握手开销,非业务数据) - 不知道 TLS 版本、证书信息、是否被拦截
若必须统计 HTTPS 流量,只有两个务实路径:
-
用
tcpdump+tshark抓包分析(离线)tcpdump -i any port 3128 -w forward.pcap -G 3600 # 每小时切一个包 tshark -r forward.pcap -T fields -e ip.src -e tls.handshake.extensions_server_name \ -e frame.len | awk '{print $1,$2,$3}' | sort | uniq -c | sort -nr→ 可统计:哪些客户端访问了哪些域名、单次连接传输字节数、SNI 域名分布。
改用专为代理设计的工具(推荐生产环境)
Squid、TinyProxy、3proxy 等原生支持logformat %ts.%tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A,可记录 SNI、TLS 版本、响应大小、缓存结果等完整维度,且稳定支持高并发 HTTPS 代理。
✅ 实用报表生成建议(基于 HTTP 日志)
用轻量脚本快速生成日报(无需部署 Grafana):
# 1. 按客户端 IP 统计今日请求数和总流量
awk '$4 ~ /\[.*2026.*Aug.*20/ {ip[$1]++; bytes[$1]+=$10} END {for (i in ip) print i, ip[i], bytes[i]}' \
/var/log/nginx/forward-http-access.log | sort -k2nr | head -20
# 2. 统计各域名访问频次(从 Host 头提取)
awk -F'"' '{if(NF>=4) print $4}' /var/log/nginx/forward-http-access.log | \
awk -F' ' '{split($1,a,"/"); print a[1]}' | sort | uniq -c | sort -nr | head -10
# 3. 查看慢请求(>3s)的 URL 和客户端
awk '$12 > 3 {print $1, $4, $6, $12}' /var/log/nginx/forward-http-access.log输出可直接导入 Excel 或用 gawk 生成 HTML 表格,满足日常运营审计需求。
不复杂但容易忽略:日志轮转必须配 logrotate,否则单日 GB 级日志会撑爆磁盘。


















