服务器上了 HTTP/2 之后,access.log 里 UA 字段全变成空值,之前按 UA 统计蜘蛛的脚本一条都数不出来。
一开始怀疑是「Nginx 在 1.25 之后把 listen 的 http2 参数改到了独立指令,配置没更新导致协议降级」,查了一圈,方向不对。
原因不止一个,得分开看。log_format 里引用的是 http_user_agent,但前置代理没透传这个头。还有一种是HTTP/2 下多个请求复用连接,日志里同一字段被合并。
另外,日志按 JSON 格式输出,UA 里的引号把字段截断了。
动手时先看一行日志里 UA 位置是什么
awk 'NR==1{print $0}' access.log | cut -c1-200
再往下确认请求里有没有带 UA 头
curl -sI -H 'User-Agent: Googlebot/2.1' https://www.example.com/ | head -3
然后在代理层补上透传
proxy_set_header User-Agent $http_user_agent;
末了重启后按 UA 统计验证
grep -c 'Googlebot' access.log
别只看报错消失,验证要多做一步。日志里的 UA 位置重新出现完整字符串,按 UA 统计的脚本能正常输出数字,与 CDN 报表的差距回到一成以内。
改日志格式前先确认前置代理有没有透传,很多空值不是 Nginx 的问题,而是上游压根没把头的值传过来。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
