浏览器弹出503 Service Unavailable提示,附带文字说明服务器暂时无法处理请求,很多人第一反应怀疑自己网络故障。但其实本地网络没问题,问题出在网站服务端。503属于HTTP协议5xx状态码,代表服务器自身故障,无法响应访问请求。和404不同,404代表访问页面不存在,503的含义是页面本身存在,服务器当下无法提供内容。
服务器出现503报错,诱因种类很多,从轻到重梳理。最常见的是服务器负载过载,同一时间访问请求太多,后端处理能力不足,请求队列占满,新的访问直接被拦截。电商大促、抢票开启、热点事件爆发阶段流量暴涨十几倍,服务器承载不住,就会拒绝部分请求保障基础服务。还有一种是计划性维护,管理员主动关停服务升级系统或者更换硬件,此时服务器返回503,附带Retry-After响应头,告知用户多久之后重试。第三种是后端依赖服务异常,数据库连接中断、PHP进程池耗尽、上游接口超时,前端服务器本身正常,但依赖组件失效,只能返回503。

顺带区分502、504。502 Bad Gateway是网关收到上游服务器无效响应,也就是前端代理连上后端服务,但后端返回内容无法解析或是连接中断。504 Gateway Timeout代表网关等待后端响应超时,长时间收不到数据。503和两者的区别在于,出现503时服务器本身还在运行,识别到自身无法提供服务,主动告知用户稍后重试。三者都属于服务端故障,但503代表服务器感知到自身服务不可用。
普通用户遇到503,能做的操作不多。按F5刷新是本能操作,但如果根源是服务器过载,频繁刷新会持续增加服务器压力,延长故障恢复时间。稳妥做法是等待几分钟重试,查看网站官方公告。如果页面给出Retry-After时间,按照提示等待。切换网络环境有时可以解决,WiFi切手机流量,因为部分CDN节点、运营商线路临时故障,更换线路有可能正常访问。但如果网站整体服务宕机,更换网络也没有效果。
如果你是网站管理员,站点出现503,排查思路完全不同。先查看服务器负载,top或者htop查看CPU、内存是否占满。负载正常依旧报503,查看Web服务器错误日志,Nginx的error.log或者Apache的error.log会记录故障原因。PHP-FPM进程池上限耗尽是很常见的诱因,日志会出现server reached pm.max_children这类提示,这时需要调大pm.max_children参数,或是优化代码降低单请求资源占用。如果是数据库连接数打满,登录MySQL查看max_connections配置,排查慢查询占用连接池。
CDN和负载均衡层面的503故障也不能忽略。网站前端部署CDN,源站正常用户依旧看到503,大概率是CDN回源失败,或是单个边缘节点故障。登录CDN控制台查看回源日志、节点状态,刷新缓存有时可以修复。负载均衡器健康检查判定后端服务器异常,会自动摘除故障节点;如果所有后端节点都被摘除,负载均衡器就直接返回503。核查健康检查配置,确认后端服务器服务正常。
还有一类属于伪503。部分网站主动返回503拦截爬虫和恶意流量,表面提示服务不可用,实际是WAF或者防火墙拦截访问。搜索引擎爬虫收到503会暂停抓取,隔段时间重试,相比直接封禁IP更加温和。如果你不是爬虫,持续遇到503,可以清理浏览器缓存Cookie,检查是否安装修改请求头的浏览器插件。
还有一个实操要点。浏览器获取503页面之后,会缓存错误页面,后续访问可能直接读取本地缓存,不会重新向服务器发起请求。使用Ctrl+F5或者Cmd+Shift+R强制刷新,绕过本地缓存重新请求。强制刷新之后依旧503,说明服务端故障还没恢复,等待即可。