一个技术小白在 AI 协助下“治病之旅”

大家好!相信很多像我一样喜欢在 NAS 上折腾 Docker 的朋友,可能都遇到过安装的服务突然“罢工”的情形。作为一个“技术小白”,面对一堆看不懂的日志和红色的错误提示,会懵圈无助。今天我想和大家分享一次,我在 AI 一步步指导下,如何解决 WordPress Docker 容器”Unhealthy” 状态的完整过程。希望我的这次经历能给遇到类似问题的朋友们提供一些参考和信心。

一、问题的突现:好好的博客怎么就“挂”了

我的 WordPress 博客一直通过 Docker Compose 部署在 NAS 上,包含 WordPress、MariaDB、phpMyAdmin 和 Redis 这些服务。之前一直稳定运行,直到前几天,我发现 WordPress 容器的状态在 Portainer 里变成了红色的 “Unhealthy”,博客网页无法访问,管理员后台也登录异常。

# docker-compose.yml 中的部分配置
services:
  wordpress:
    # ... 其他配置 ...
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:80/"]
      interval: 30s
      timeout: 10s
      retries: 5
    depends_on:
      db:
        condition: service_started
      redis: 
        condition: service_healthy
      phpmyadmin:
        condition: service_healthy

健康检查命令 curl -f http://localhost:80/ 失败,意味着在容器内部访问 WordPress 自身的 Web 服务时返回了错误。

二、初步排查:我复制黏贴 AI 排查原因

我唯一熟悉的命令行操作,就是通过 SSH 登录我的 NAS。用命令行和 docker 容器交互得到的反馈,能够让 AI 精准定位问题的根源。

AI 就像一位经验丰富的医生,分析症状并开出“检查单”,我则负责去“化验科”(我的 SSH 终端)执行这些检查并将“化验报告”(命令输出)拿给 AI“医生”解读。

docker ps -a            # 确认容器状态
docker logs WordPress   # 查看 WordPress 容器日志输出
docker logs WordPress-DB # 查看 MariaDB 容器日志输出
docker logs WordPress-REDIS # 查看 Redis 容器日志输出
docker logs WordPress-phpMyAdmin # 查看 phpMyAdmin 容器日志输出

一个早期的小插曲是,当我尝试执行 AI 建议的、直接查看容器内 Apache 错误日志的命令(docker exec WordPress tail /var/log/apache2/error.log)时,命令会卡住。我把这个现象反馈给 AI,AI 推断可能是日志配置问题,并建议我执行:

docker exec WordPress ls -lh /var/log/apache2/

结果发现,error.log 和 access.log 都被符号链接到了 /dev/stderr 和 /dev/stdout。这意味着所有日志理论上都应该通过 docker logs WordPress 输出。这个发现帮助我们排除了一个错误的排查方向。然而,尽管日志配置看起来能将所有信息输出,关键的 PHP 致命错误信息却如同石沉大海般,迟迟没有出现。

三、深入调试:与 AI 携手“魔改” wp-config.php

既然标准日志没有足够信息,AI 建议我在 wp-config.php 中增强调试能力。具体操作如下:

// 1. 在文件顶部添加,开启 PHP 错误记录,并记录加载测试
@ini_set('display_errors', 1);
@ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
@ini_set('log_errors', 1);
@ini_set('error_log', '/var/www/html/wp-content/explicit_error_test.log');
file_put_contents(
  '/var/www/html/wp-content/wp_config_loaded_test.txt',
  'wp-config.php loaded at ' . date('Y-m-d H:i:s')
);
// 原始配置继续…
// 2. 在文件末尾加载测试前添加,确认执行到最后
file_put_contents(
  '/var/www/html/wp-content/wp_config_ending_test.txt',
  'Reached end at ' . date('Y-m-d H:i:s')
);
require_once ABSPATH . 'wp-settings.php';
# 3. 重启容器并验证测试文件生成
docker restart WordPress
ls /volume1/docker/wordpress/wp-content/
# 应能看到:
# wp_config_loaded_test.txt
# wp_config_ending_test.txt

结果证明 wp-config.php 成功加载且可写。

# 4. 检查错误日志
cat /volume1/docker/wordpress/wp-content/explicit_error_test.log
# 日志仅显示警告:PHP Warning: Constant WP_DEBUG already defined...

AI 进一步引导我审查完整文件,发现末尾多余 } 及重复 require_once wp-settings.php;,导致 Parse Error 直接中断脚本。修复该语法错误后,病因却依然不明朗。

四、柳暗花明:我的一次建议,让 AI 找到病根

经过了长时间的尝试,各种日志分析似乎都未能直指病因,我建议 AI 尝试禁用所有插件。结果之后的 curl 命令返回 HTTP 500 错误头!这让 AI 判断响应体里可能隐藏着关键线索。于是,AI 调整 curl 命令

docker exec -it WordPress curl -vk http://localhost:80/

终于!在返回的 HTML 内容中,发现了问题所在:

<body id="error-page">
  <div class="wp-die-message">
    <h1>Error establishing a Redis connection</h1>
    <p>To disable Redis, delete the <code>object-cache.php</code> file in the <code>/wp-content/</code> directory.</p>
  </div>
</body>
</html>

同时,/wp-content/explicit_error_test.log 文件也终于记录到了更具体的异常信息:

Exception: Predis library not found. Re-install Redis Cache plugin or delete the object-cache.php. in /var/www/html/wp-content/object-cache.php:868

真相大白!问题出在 WordPress 尝试连接 Redis 时出错,具体原因是其依赖的 Predis PHP 库没有找到。这通常是由于 wp-content/object-cache.php 文件(由 Redis 相关的缓存插件提供)导致的。

五、拨乱反正:移除 Redis 依赖,博客重获新生

临时禁用 Redis 对象缓并重启容器

docker exec -it WordPress mv /var/www/html/wp-content/object-cache.php /var/www/html/wp-content/object-cache.php.disabled
docker restart WordPress

确认容器恢复健康

docker ps -a # WordPress 容器状态变为 (healthy)

修改 docker-compose.yml:删除 redis 服务及相关 depends_on 条目

恢复其他插件并测试,确认站点在无 Redis 环境下正常运行。

六、经验总结与反思

  1. 日志是金矿:需通过调试手段挖掘隐藏信息。
  2. AI 也需要人给出指导:AI 可提供排查思路和方向,但需要用户根据现场反馈验证、调整,才能形成真正有效的诊断策略。
  3. 人机协作:AI + SSH 操作,提高效率。
  4. 拥抱命令行:底层控制更可靠。
  5. 成就感满满:排错过程中收获经验与信心。

七、结语

希望我的经历能给同样使用 Docker 部署 WordPress 或者其它容器的小伙伴一些启发。即使自认“技术小白”,只要有耐心、善用工具与方法,也能逐步解决问题。欢迎在评论区分享您的排查经验与心得!

支持

Leave a Comment