准确统计GET和POST流量占比需先确保日志含$request_method字段,再配置log_format分离方法与URI,最后用awk结构化聚合分析;注意排除子请求、预检方法及URL编码干扰。

要准确统计 GET 和 POST 的流量占比,核心不是只记录方法名,而是让日志格式能稳定分离 $request_method 和 $uri(或 $request_uri),再用结构化方式聚合分析。
确认日志里真有请求方法
先验证当前 access_log 是否包含有效的方法字段:
- 执行 head -3 /var/log/nginx/access.log | cut -d' ' -f6 | sed 's/"//g',若输出是 GET、POST 等,说明字段可用
- 若为空或异常,大概率是自定义 log_format 漏写了 $request 或 $request_method
配置带 method + path 的日志格式
在 nginx.conf 的 http 块中添加:
- log_format audit '$request_method $uri $status $body_bytes_sent $http_user_agent';
- 启用该格式:access_log /var/log/nginx/audit.log audit;
- 用 $uri 可去除 query string,更利于路径归一;如需含参数则改用 $request_uri
用 awk 快速算出 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
- 只看 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}}' /var/log/nginx/audit.log | sort -k5 -nr | head -10
注意几个关键细节
实际分析中容易忽略但影响结果准确性:
- 子请求(subrequest)不计入主日志,如 internal redirect 或 auth_request 触发的请求不会出现在 access_log 中
- OPTIONS、HEAD 等预检或轻量方法默认混在统计里,如需排除,加条件 $1 ~ /^(GET|POST)$/
- URL 编码字符(如空格、中文)可能破坏字段对齐,所以推荐用空格分隔的 $uri 而非含参的 $request_uri
- 若需按小时/分钟看占比波动,可结合 $time_local 提取时间片段再分组











