log_format noquery '$remote_addr $request_method $uri $status'; access_log /var/log/nginx/access.log noquery; # 短信接口同步改为 POST,参数走 body
排查发送失败时打开 access.log,一行 /api/sms?phone=13800138000&code=8342 躺在那里,往下翻同类记录两万多条,号码一条不落。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,短信网关的调用写成了 GET,号码和验证码都拼在 query 上,Nginx 默认日志格式记录完整 request,参数原样落盘。日志还会被采集到集中平台,那边权限比数据库宽松得多。
「手机号进日志」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
处理上按这个顺序:调用方式改成 POST,参数放请求体,日志里就只剩路径;短期改不完的在 Nginx 层只记 uri,丢掉查询串;已落盘的日志按保留期清掉,日志平台的索引一起删。
改完只确认一件事:再发一条短信,日志里只有 /api/sms 这个路径,grep 手机号返回空。
