404 的意思是“這里没有内容”,5xx 的意思是“我現在處理不了”。對訪客来说,前者還能退回上一頁換個入口,後者只能看到一個空白或错誤提示;對搜尋引擎蜘蛛来说,反复撞上 5xx 的地址,抓取节奏會被打乱,原本稳定的訪問時間表也會變得不确定。所以 5xx 值得從站点运营的角度單獨盯一條线。
先分清是全局故障還是局部故障
打開监控面板之前,先做一個简單判断:同一時間,首頁、列表頁、詳情頁、接口地址分別返回什么狀態碼。如果全部 5xx,多半是服務進程、資料库连接或網關层面的問题;如果只有某一類頁面 5xx,通常和该頁面的模板、查询语句或依赖的第三方接口有關。這個判断能省掉大量排查時間。
常见来源與對應自查点
資料库连接數與慢查询
连接池被占满是 5xx 的常见原因。自查时看三個數:连接池上限、峰值並發连接數、慢查询日誌里持續超過阈值的语句。列表頁或标簽聚合頁如果没有走缓存,一條没有索引的查询就足以拖住整條鏈路。
後端進程與超时配置
進程數少、單個請求又慢,請求就會排队,排在後面的直接超时。检查 PHP-FPM 或應用容器的進程上限、最大执行時間、網關的讀取超时,是否存在“應用還在算,網關已经放弃”的错配。
缓存失效後的回源洪峰
缓存整层過期、重啟後缓存為空、某次改版換了缓存键,都會让原本被挡住的請求在同一秒钟涌回源站。表現往往很整齐:整点或重啟後几分钟内 5xx 陡增,之後自己恢复。這種情况要把缓存预热和過期時間打散寫進流程,而不是等它自己好。
磁盘寫满與日誌暴涨
日誌目錄寫满、临时文件堆积、會话文件没有清理,都會让寫入失敗進而返回 5xx。這類問题排查起来最快,也最容易被忽略,值得放進日常巡检。
可以直接照着做的自查清單
- 在监控里單獨建立 5xx 曲线,按狀態碼分组,而不是只看“可用性”一個數字。
- 確認错誤日誌里有足够上下文:請求地址、上游耗时、異常堆栈,至少保留其中两項。
- 给關键頁面准备降級方案:讀缓存、静態兜底或简短提示,而不是直接抛出错誤頁。
- 区分 5xx 與 404、403 的統計口径,避免混在一起導致判断失真。
- 限制重试次數與退避時間,防止上游抖動被自己的重试放大成雪崩。
- 把第三方接口調用加上超时和熔断,避免外部拖垮内部。
监控與告警的几條经驗
固定阈值告警容易在夜里被忽略,比例告警更實用,比如“過去五分钟 5xx 占全部請求的比例超過 1%”。告警内容里带上最近一次變更记錄,往往能直接指向原因:刚發過版本、刚調整過缓存、刚做過後台批處理。没有變更记錄的告警,排查時間通常要翻倍。
處理顺序建议
先止血再定位:先通過重啟、扩容、切換备用节点把错誤率压下去,再回头翻日誌找根因。反過来做,往往一邊排查一邊繼續报错。事後把這次的原因、影响范围、恢复動作寫進记錄,下次同類問题會快很多。
5xx 不需要被彻底消灭,但需要被看见、被分類、被记錄。對站点运营来说,稳定返回 200 的頁面,才是後續所有讨论的前提。