访问日志里四百九十九状态码占了三成,用户反馈页面加载很久最后空白,服务端却没有明显的错误记录。

真正麻烦的地方在于,几个原因的现象几乎一样。后端响应时间超过客户端耐心,用户主动断开。少数情况下是页面依赖的接口串行调用,整体耗时被拖长。

还有一种情况,前置代理的超时时间比后端处理时间更短。

动手时先统计状态码分布和耗时

awk '{print $9}' access.log | sort | uniq -c | sort -rn | head

随后找出耗时最长的请求

awk '$9==499{print $7,$NF}' access.log | sort -k2 -n | tail

接着看后端处理耗时分布

tail -1000 access.log | awk '{print $NF}' | sort -n | tail

调整超时与接口并发

grep -n keepalive_timeout /etc/nginx/nginx.conf

同事提醒我看一下最近一次发布,时间点确实对得上。

别只看报错消失,验证要多做一步。四百九十九占比降到百分之一以内,页面加载耗时明显缩短,用户投诉减少。

这里还有个坑。这个状态码是客户端断开,不是服务端拒绝;只加超时不优化后端,只会把问题变成更长时间的等待。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189