500 是唯一一类「工具帮不了太多」的错误。因为它发生在代码里,而代码只有你那台机器知道发生了什么。

但工具能帮你少走一半弯路。

500 的含义很干脆

请求到了程序,程序抛了异常,没吐出正常响应。不是网络问题,不是 DNS 问题,不是证书问题。

所以看到 500,别再去查线路和 CDN——方向从一开始就该在服务端。

拨测能给的两件事

范围。 全节点 500,是代码或配置的共性问题。只有某一台 500,去看那台机器的磁盘、内存、依赖服务,或者它是不是部署了不同版本。

稳定性。 每次测都 500,是必现的 bug。偶尔 500,是资源或并发问题。这两个的排查路径完全不同。

按时间点分两类

刚发布就 500。 先查语法错误、PHP 扩展缺失、环境变量没配、文件权限不对。发布流程里少一步,就会这样。最快的办法是把上一个版本回滚,先恢复服务再慢慢查。

跑了一段时间才 500。 查内存(Allowed memory size exhausted)、执行超时(Maximum execution time)、连接池耗尽、磁盘写满。这类问题有前兆,监控里能看到曲线。

日志在哪

Nginx 的 error.log 只是转发结果,真正的堆栈在 PHP-FPM 日志或者应用日志里。

Laravel 看 storage/logs,ThinkPHP 看 runtime/log,裸 PHP 看 error_log 配置的路径。先 tail -f 跟一遍,再复现一次,比读代码快。

别在生产开 display_errors

把错误直接打到页面上,既泄露路径和配置,又会让用户看到一堆堆栈。用 log_errors = On 写到文件里,页面上给一个统一的错误页。

修完要回归

不只是刷新首页。原来报 500 的那个具体操作要再走一遍,然后用多节点测一次,确认不是只有你这台机器能过。

复测入口在 网站测速,同一 URL 测两轮,能看出是不是间歇性的。