500 Internal Server Error 怎么排查
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 测两轮,能看出是不是间歇性的。