500错误本质是PHP进程被硬性中断,需优先查error.log定位PHP是否启动、代码是否报错、内存是否耗尽或脚本头输出异常;再检查扩展启用、禁用函数、display_errors临时开启、伪静态、open_basedir及文件权限等配置。

500 错误不是“服务器崩了”,而是 PHP 进程在执行时被硬性中断——要么代码当场报错没捕获,要么连 PHP 都没跑起来。90% 的情况,error.log 里有明确线索,别急着重启或重装。
看 error.log:先确认是“代码挂了”还是“PHP 没启动”
宝塔面板 → 网站 → 选中站点 → 日志 → 错误日志,打开最新 error.log。重点盯三类行:
-
PHP Fatal error或PHP Parse error:说明代码语法或调用出问题,错误行号会直接标出来(比如in /www/wwwroot/example.com/index.php on line 42) -
Allowed memory size exhausted:内存不够,不是配少了,很可能是某段代码死循环或加载了超大文件 -
Premature end of script headers:PHP 进程根本没输出就退出了,大概率是扩展缺失、php-fpm没起来,或opcache缓存了损坏的字节码
注意时间戳是否和你访问页面的时间一致;如果日志空或全是旧记录,说明请求压根没进 PHP,问题在更外层。
检查 PHP 扩展与禁用函数:Laravel/WordPress/Typecho 都会栽在这
很多程序一换 PHP 版本就 500,不是代码问题,是扩展没跟上。比如:
- Laravel 10 要求
mbstring、openssl、pdo_mysql全启用,但宝塔默认 PHP 8.2 可能只开了前两个 - Typecho 在 PHP 8.0+ 下如果没开
gd扩展,上传头像或生成缩略图时直接 500 - WordPress 插件调用
exec()或shell_exec(),但这些函数被宝塔 PHP 设置里禁用了
实操建议:
进宝塔 → 软件商店 → 找对应 PHP 版本 → 设置 → 安装扩展,把基础项全勾上;再进“禁用函数”,把 exec、shell_exec、system 等按需放开;最后 SSH 运行 /www/server/php/82/bin/php -m | grep -E "(mbstring|openssl|pdo)" 核对是否真加载了。
临时开启 display_errors:线上环境慎用,但排查时它比日志还快
线上默认关闭错误显示,导致只看到 500,看不到具体哪行炸了。临时打开可快速暴露问题:
- 编辑网站根目录下的
.user.ini,把display_errors = Off改成On,同时确保error_reporting = E_ALL - 如果用了自定义
php.ini,还要检查 Nginx 配置里有没有fastcgi_param PHP_VALUE覆盖了这个设置 - 改完必须重启 PHP(不是重载),否则无效;问题定位后立刻关掉,避免泄露路径或敏感信息
注意:display_errors = On 在 PHP-FPM 模式下受 php_admin_flag[display_errors] 控制,某些宝塔模板会强制关闭,这时得去 /www/server/php/82/etc/php-fpm.d/www.conf 里搜这一行并注释掉。
伪静态、Open_basedir、文件权限:看不见的“拦路虎”
这些配置不报语法错,但会让 PHP 连入口文件都读不到,直接 500:
- 伪静态规则写错(比如多了一个
RewriteBase /xxx但目录实际是根目录),Nginx 解析失败返回 500 而非 404 - 防跨站(
open_basedir)没关或路径写死,例如站点要读/tmp或调用其他站点目录,但限制只写了/www/wwwroot/site1 - 网站根目录权限不是
www:www,或者index.php居然是root:root且无读权限,PHP 直接拒绝执行
查法很简单:ls -l /www/wwwroot/your-site/ 看属主和权限;进站点设置 → 防跨站攻击,确认已关闭或添加了必要路径;伪静态切回“无”试试,看 500 是否消失。
最常被忽略的是:PHP 升级后,站点绑定的版本没手动同步,Nginx 配置里还在 include enable-php-82.conf,而你已经用 bt 8 切回了 74 —— 此时既不是 500 也不是 502,是彻底静默失败。务必去 /www/server/panel/vhost/nginx/域名.conf 里核对那一行。










