关键是要自定义nginx日志格式包含$request_method和$uri,并用awk或elk等工具按方法+路径聚合分析流量占比;需注意方法映射、路径编码、子请求过滤等细节。

要在日志中统计 GET 和 POST 请求的流量占比,关键不是单纯记录 $request_method,而是结合日志格式配置与后续分析,实现按请求方法分类统计路径访问分布。Nginx 默认 access log 不区分方法+路径组合,需自定义 log_format 并配合工具(如 awk、logstash 或 Prometheus)做聚合分析。
配置带 method + path 的结构化日志格式
在 nginx.conf 的 http 或 server 块中定义日志格式,确保 method 和 request_uri(或 $uri)同时存在且字段分隔清晰:
- 推荐使用空格或制表符分隔,避免 URL 中的空格干扰解析
- 示例:log_format audit '$request_method $uri $status $body_bytes_sent $http_user_agent';
- 若需更精确路径(去除 query string),用
$uri;若需完整路径含参数,用$request_uri - 启用该格式:access_log /var/log/nginx/audit.log audit;
用命令行快速统计 GET/POST 路径占比(实时或离线)
日志写入后,可用 shell 工具快速提取并计算比例:
- 统计所有路径中 GET 和 POST 各自的请求数:
awk '{method[$1]++; total++} END {for (m in method) print m, method[m], int(method[m]/total*100)"%"}' /var/log/nginx/audit.log - 按路径细分 GET/POST 分布:
awk '$1 ~ /^(GET|POST)$/ {count[$1" "$2]++} END {for (i in count) print count[i], i}' /var/log/nginx/audit.log | sort -nr - 只看 TOP10 路径的 method 占比:
awk '$1=="GET"{get[$2]++} $1=="POST"{post[$2]++} END {for (p in get) {t=get[p]+post[p]; if(t>0) print p, "GET:", get[p], "POST:", post[p], "total:", t}}' audit.log | sort -k5 -nr | head -10
接入 ELK 或 Loki 实现可视化审计
当日志量大或需长期监控时,结构化日志便于采集分析:
- Filebeat 或 Fluentd 按空格切分字段,将
request_method和uri作为独立字段索引 - Kibana 中可建仪表盘:用 Terms 聚合
request_method得整体占比;用 Split Series + Filter 按路径筛选再对比 GET/POST 数量 - Loki + Grafana 中,用 LogQL:
{job="nginx"} |~ `^(GET|POST)` | line_format "{{.line}}" | count_over_time(1h) by (method, uri)
注意事项与常见陷阱
实际操作中容易忽略的细节会影响统计准确性:
- HEAD、OPTIONS 等方法默认不计入 GET/POST 统计,如需合并,需在 awk 或查询中显式映射(例如把 HEAD 归入 GET)
- 静态资源(CSS/JS/IMG)多为 GET,但业务接口可能 POST 频繁,建议按路径前缀过滤(如
/api/.*)再统计 - Nginx 日志中的
$uri已解码,而$request_uri保留原始编码,统计路径时优先用$uri避免重复(如/a%20b和/a b被视为不同) - 开启
log_subrequest on时,子请求也会写入日志,需结合$request_length或状态码排除干扰











