Docker 迁移 WordPress 实战:WP Super Cache 路径陷阱

全局搜一遍还有哪些文件写了旧路径:

grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php'

修复

最稳的是直接把旧路径批量换成容器里的真实路径:

grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php' \
  | xargs sed -i 's|/usr/share/nginx/html|/var/www/html|g'
docker restart wp-app

嫌麻烦也可以进后台把 WP Super Cache 禁用再启用,插件会用新路径重新生成这些文件;或者手动改 advanced-cache.php、wp-cache-config.php、wp-cache.php 三处的路径。

验证

docker logs wp-app --tail 30   # Warning 应该没了
grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php'   # 应返回空

记住这几点

  1. Docker 里目录结构跟宿主机不是一回事,任何写死绝对路径的配置,迁移或换挂载点后都会爆。
  2. 插件是路径硬编码重灾区:缓存类(WP Super Cache)、安全类(Wordfence)都会生成带绝对路径的文件。
  3. 迁完环境,先全局 grep 一遍旧路径,往往能揪出被忽略的隐患。
  4. 502/500 先看对应容器日志(docker logs wp-app),别光盯着 Nginx——Nginx 只是把上游的错误透传出来。
  5. 插件要是改用 WP_CONTENT_DIR 这类 WordPress 常量拼路径,就不怕目录变了。

这个坑修完,缓存命中率恢复正常,也提醒我:容器化隔离了环境,但应用层对路径的敏感一点没少。

再看报错文件里写的是啥路径。宿主机上 /opt/wordpress/html 挂载到容器 /var/www/html,所以直接看宿主机这份:

cat /opt/wordpress/html/wp-content/advanced-cache.php

全局搜一遍还有哪些文件写了旧路径:

grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php'

修复

最稳的是直接把旧路径批量换成容器里的真实路径:

grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php' \
  | xargs sed -i 's|/usr/share/nginx/html|/var/www/html|g'
docker restart wp-app

嫌麻烦也可以进后台把 WP Super Cache 禁用再启用,插件会用新路径重新生成这些文件;或者手动改 advanced-cache.php、wp-cache-config.php、wp-cache.php 三处的路径。

验证

docker logs wp-app --tail 30   # Warning 应该没了
grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php'   # 应返回空

记住这几点

  1. Docker 里目录结构跟宿主机不是一回事,任何写死绝对路径的配置,迁移或换挂载点后都会爆。
  2. 插件是路径硬编码重灾区:缓存类(WP Super Cache)、安全类(Wordfence)都会生成带绝对路径的文件。
  3. 迁完环境,先全局 grep 一遍旧路径,往往能揪出被忽略的隐患。
  4. 502/500 先看对应容器日志(docker logs wp-app),别光盯着 Nginx——Nginx 只是把上游的错误透传出来。
  5. 插件要是改用 WP_CONTENT_DIR 这类 WordPress 常量拼路径,就不怕目录变了。

这个坑修完,缓存命中率恢复正常,也提醒我:容器化隔离了环境,但应用层对路径的敏感一点没少。

先看日志定位出错文件(我们博客的 WordPress 跑在 wp-app 容器里):

docker logs wp-app --tail 50

再看报错文件里写的是啥路径。宿主机上 /opt/wordpress/html 挂载到容器 /var/www/html,所以直接看宿主机这份:

cat /opt/wordpress/html/wp-content/advanced-cache.php

全局搜一遍还有哪些文件写了旧路径:

grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php'

修复

最稳的是直接把旧路径批量换成容器里的真实路径:

grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php' \
  | xargs sed -i 's|/usr/share/nginx/html|/var/www/html|g'
docker restart wp-app

嫌麻烦也可以进后台把 WP Super Cache 禁用再启用,插件会用新路径重新生成这些文件;或者手动改 advanced-cache.php、wp-cache-config.php、wp-cache.php 三处的路径。

验证

docker logs wp-app --tail 30   # Warning 应该没了
grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php'   # 应返回空

记住这几点

  1. Docker 里目录结构跟宿主机不是一回事,任何写死绝对路径的配置,迁移或换挂载点后都会爆。
  2. 插件是路径硬编码重灾区:缓存类(WP Super Cache)、安全类(Wordfence)都会生成带绝对路径的文件。
  3. 迁完环境,先全局 grep 一遍旧路径,往往能揪出被忽略的隐患。
  4. 502/500 先看对应容器日志(docker logs wp-app),别光盯着 Nginx——Nginx 只是把上游的错误透传出来。
  5. 插件要是改用 WP_CONTENT_DIR 这类 WordPress 常量拼路径,就不怕目录变了。

这个坑修完,缓存命中率恢复正常,也提醒我:容器化隔离了环境,但应用层对路径的敏感一点没少。

首页能打开,但 PHP 日志里反复出现类似这样的报错:

PHP Warning: include_once(/usr/share/nginx/html/wp-content/plugins/wp-super-cache/wp-cache-phase1.php): failed to open stream: No such file or directory in /var/www/html/wp-content/advanced-cache.php on line 42

页面能渲染,但缓存功能失效,后台持续报错。报错里的旧路径 /usr/share/nginx/html 已经是上一台机器的目录了。

根因

WP Super Cache 启用时会生成 advanced-cache.php 和 wp-cache-config.php。生成时用 __FILE__ / dirname() 拿当前文件的绝对路径写进去。如果 WordPress 根目录从 /usr/share/nginx/html 变成了容器里的 /var/www/html,这些写死的旧路径就找不到了。

本质上是同一个问题:应用层把和环境绑定的绝对路径硬编码了。Wordfence 的 .user.ini 里 auto_prepend_file 也是这么干的。

排查

先看日志定位出错文件(我们博客的 WordPress 跑在 wp-app 容器里):

docker logs wp-app --tail 50

再看报错文件里写的是啥路径。宿主机上 /opt/wordpress/html 挂载到容器 /var/www/html,所以直接看宿主机这份:

cat /opt/wordpress/html/wp-content/advanced-cache.php

全局搜一遍还有哪些文件写了旧路径:

grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php'

修复

最稳的是直接把旧路径批量换成容器里的真实路径:

grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php' \
  | xargs sed -i 's|/usr/share/nginx/html|/var/www/html|g'
docker restart wp-app

嫌麻烦也可以进后台把 WP Super Cache 禁用再启用,插件会用新路径重新生成这些文件;或者手动改 advanced-cache.php、wp-cache-config.php、wp-cache.php 三处的路径。

验证

docker logs wp-app --tail 30   # Warning 应该没了
grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php'   # 应返回空

记住这几点

  1. Docker 里目录结构跟宿主机不是一回事,任何写死绝对路径的配置,迁移或换挂载点后都会爆。
  2. 插件是路径硬编码重灾区:缓存类(WP Super Cache)、安全类(Wordfence)都会生成带绝对路径的文件。
  3. 迁完环境,先全局 grep 一遍旧路径,往往能揪出被忽略的隐患。
  4. 502/500 先看对应容器日志(docker logs wp-app),别光盯着 Nginx——Nginx 只是把上游的错误透传出来。
  5. 插件要是改用 WP_CONTENT_DIR 这类 WordPress 常量拼路径,就不怕目录变了。

这个坑修完,缓存命中率恢复正常,也提醒我:容器化隔离了环境,但应用层对路径的敏感一点没少。

作者:司陌笙

环境:阿里云 ECS / Alibaba Cloud Linux 3(Docker Compose:wp-app / wp-db)

标签:Docker、PHP、WordPress、运维学习

用 Docker 跑 WordPress 有个坑值得单独记一笔:WP Super Cache 这类插件会把运行时的绝对路径写死到它生成的 PHP 文件里。一旦 WordPress 根目录的路径变了(比如从一台机器迁到 Docker、或者重建容器时挂载点不一样),缓存就直接挂,PHP 日志还会一直刷 Warning。下面是我在这个博客环境(wp-app 容器,WordPress 根在容器里的 /var/www/html)上总结的排查和修法。

故障现象

首页能打开,但 PHP 日志里反复出现类似这样的报错:

PHP Warning: include_once(/usr/share/nginx/html/wp-content/plugins/wp-super-cache/wp-cache-phase1.php): failed to open stream: No such file or directory in /var/www/html/wp-content/advanced-cache.php on line 42

页面能渲染,但缓存功能失效,后台持续报错。报错里的旧路径 /usr/share/nginx/html 已经是上一台机器的目录了。

根因

WP Super Cache 启用时会生成 advanced-cache.php 和 wp-cache-config.php。生成时用 __FILE__ / dirname() 拿当前文件的绝对路径写进去。如果 WordPress 根目录从 /usr/share/nginx/html 变成了容器里的 /var/www/html,这些写死的旧路径就找不到了。

本质上是同一个问题:应用层把和环境绑定的绝对路径硬编码了。Wordfence 的 .user.ini 里 auto_prepend_file 也是这么干的。

排查

先看日志定位出错文件(我们博客的 WordPress 跑在 wp-app 容器里):

docker logs wp-app --tail 50

再看报错文件里写的是啥路径。宿主机上 /opt/wordpress/html 挂载到容器 /var/www/html,所以直接看宿主机这份:

cat /opt/wordpress/html/wp-content/advanced-cache.php

全局搜一遍还有哪些文件写了旧路径:

grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php'

修复

最稳的是直接把旧路径批量换成容器里的真实路径:

grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php' \
  | xargs sed -i 's|/usr/share/nginx/html|/var/www/html|g'
docker restart wp-app

嫌麻烦也可以进后台把 WP Super Cache 禁用再启用,插件会用新路径重新生成这些文件;或者手动改 advanced-cache.php、wp-cache-config.php、wp-cache.php 三处的路径。

验证

docker logs wp-app --tail 30   # Warning 应该没了
grep -rln '/usr/share/nginx/html' /opt/wordpress/html --include='*.php'   # 应返回空

记住这几点

  1. Docker 里目录结构跟宿主机不是一回事,任何写死绝对路径的配置,迁移或换挂载点后都会爆。
  2. 插件是路径硬编码重灾区:缓存类(WP Super Cache)、安全类(Wordfence)都会生成带绝对路径的文件。
  3. 迁完环境,先全局 grep 一遍旧路径,往往能揪出被忽略的隐患。
  4. 502/500 先看对应容器日志(docker logs wp-app),别光盯着 Nginx——Nginx 只是把上游的错误透传出来。
  5. 插件要是改用 WP_CONTENT_DIR 这类 WordPress 常量拼路径,就不怕目录变了。

这个坑修完,缓存命中率恢复正常,也提醒我:容器化隔离了环境,但应用层对路径的敏感一点没少。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注