船说 CMS 网站出现 500 错误怎么排查
照着走一遍,你就能独立定位船说 CMS 站点的 500 错误出在 PHP、Web 服务器还是数据库,并把它改回能访问的状态。
第一步:确认 500 是谁抛出来的
这一步要弄清楚「500 是服务器内部错误」这句话背后到底是哪一层出的问题,结果决定你下一步去看哪份日志。
在浏览器按 F12 打开「网络」面板,刷新出错页面,点开那条状态为 500 的请求,看「响应头」里有没有 Server: nginx 或 Server: Apache。再看响应体:如果只有几十字节的空白或一句 Internal Server Error,说明是 Web 服务器或 PHP 直接崩了;如果返回一大段中文报错,说明是船说 CMS 自己的异常处理器接住了错误。
注意:不要在浏览器里反复刷新等它自己好,500 不会自愈,刷多了只会把错误日志刷满、覆盖掉最早的现场。
第二步:打开 PHP 错误日志(最有效的一步)
这一步的目标是拿到「哪个文件、第几行、什么错」这行原文,90% 的 500 靠它就能定位。
用宝塔面板的:左侧菜单「网站」→ 找到你的站点 → 点右侧「设置」→「配置文件」,能看到 error_log 路径;PHP 日志一般在 /www/wwwlogs/php_errors.log。然后 SSH 登录服务器执行:
tail -n 100 -f /www/wwwlogs/php_errors.log
再刷新一次页面,终端里会实时滚出新的错误行。如果日志是空的,说明 PHP 根本没记录错误,进入宝塔「软件商店」→ 找到你用的 PHP 版本(比如 PHP-7.4)→「设置」→「配置修改」,确认:
log_errors = On
error_log = /www/wwwlogs/php_errors.log
display_errors = Off
改完点「保存」,再点「服务」→「重载配置」。
注意:
display_errors = On只适合临时排查,错误信息会带着服务器绝对路径暴露给访客,排完必须改回Off。
第三步:临时打开调试模式,看到完整堆栈
如果 PHP 日志只有一行「PHP Fatal error」没有调用栈,就把船说 CMS 自己的调试开关打开。
登录后台(默认入口 /admin.php),进「系统」→「系统设置」→「基本设置」,找「调试模式 / Debug」开关打开;部分版本叫「开发者模式」,在 config 目录下的配置文件里。改完后刷新前台,页面会直接显示报错的 PHP 文件路径、行号和 SQL 语句。
如果这个开关找不到,直接在站点根目录找 config 文件夹里数据库配置文件(通常叫 database.php 或 config.php),确认里面的库名、用户名、密码、主机 127.0.0.1 是否和宝塔「数据库」页面上显示的完全一致。
注意:调试模式打开期间不要让搜索引擎爬,排完立刻关掉。
第四步:看 Web 服务器的错误日志
PHP 日志没有新内容、但请求还是 500,问题多半在 Nginx/Apache 这一层。
宝塔面板该站点「设置」→「网站日志」,选 error.log,能看到类似 rewrite or internal redirection cycle、FastCGI sent in stderr、Permission denied 的提示。
最常见的三类对应解法:
- 伪静态没配:宝塔该站点「设置」→「伪静态」,下拉选「船说CMS」或粘贴官方规则;Apache 环境还要确认
.htaccess存在,且站点配置里AllowOverride All。 - 目录权限不对:SSH 执行
chown -R www:www /www/wwwroot/你的站点目录,再chmod -R 755该目录,runtime、cache、uploads三个目录给 755(宝塔下运行用户是www)。 - PHP 版本不兼容:船说 CMS 多数版本跑 PHP 7.2~7.4,切到 PHP 8 后常因函数签名变化直接 500。在该站点「设置」→「网站目录」上方或「PHP 版本」处切回 7.4,并安装
mysqli、gd、curl、fileinfo、mbstring、openssl扩展,然后重载 PHP。
第五步:按报错原文对症修改
拿到行号和错误类型后,对照处理:
Allowed memory size ... exhausted:把 php.ini 的memory_limit从 128M 调到 256M 或 512M。Maximum execution time exceeded:max_execution_time调到 300。- 某个插件/模板目录下的文件报语法错误:先把该插件目录改名(如
plugin_bak)让程序跳过加载,站点恢复后再去官方仓库重下覆盖。 - 数据库连接报错:先确认宝塔「数据库」页面里 MySQL 是「运行中」,再用
mysql -u用户名 -p手动连一次验证密码。
注意:改任何文件前先
cp 文件名 文件名.bak,改错了能一秒回滚。
小结
- 先分清 500 来自 Web 服务器还是船说 CMS,再决定看哪份日志。
- PHP 错误日志(
/www/wwwlogs/php_errors.log)是定位 500 的第一首选,用tail -f实时盯。 - 日志不够就临时开调试模式拿完整堆栈,排完立刻关。
- 高频原因就四个:伪静态规则缺失、目录权限/属主错误、PHP 版本与扩展不匹配、数据库配置错误。
- 每次改动前备份,改完重载 PHP-FPM 或 Nginx 配置生效。
原文链接:https://www.gj0.com/thread-803.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。