问题描述
下午2点打开网站,发现WordPress提示挂维护。
输出内容为:
Briefly unavailable for scheduled maintenance. Check back in a minute.
翻译:
由于定期维护,暂时无法使用。请稍后再回来查看。
该问题定位为WordPress自动升级导致,因为近期一直在提示自动升级。
搜索到的问题原因为:
当 WordPress 网站显示以下提示时:
“Briefly unavailable for scheduled maintenance. Check back in a minute.”
这通常是因为 WordPress 正在进行自动更新(如插件、主题或核心更新)时发生了中断或未完成的情况。具体而言,当 WordPress进入维护模式时,它会在根目录下创建一个 .maintenance 文件,用于告诉访问者网站正在维护中。
常见原因
1、更新过程中断:
更新插件或主题时,操作未完成(如服务器超时、网络问题等)。
同时更新多个插件,导致冲突或超时。
2、自动更新失败:
WordPress自动更新核心或插件时发生了错误。
3、服务器问题:
短暂的服务器性能问题导致更新中断。
解决方法
1、删除 .maintenance 文件
使用FTP工具(如FileZilla)或通过服务器控制面板登录WordPress站点的文件管理器。
查找网站根目录中的 .maintenance 文件。
根目录: 通常是 /public_html/ 或 /www/。
删除 .maintenance 文件。
刷新浏览器,检查网站是否恢复正常。
2、检查更新是否完成
登录到 WordPress 管理后台。
检查是否有未完成的插件、主题或核心更新。
如果有未完成的更新,重新手动进行更新。
3、清理缓存
如果删除 .maintenance 文件后仍然看到维护页面:
清除浏览器缓存。
如果使用了缓存插件(如 W3 Total Cache 或 WP Super Cache),清除缓存。
4、检查错误日志
如果问题仍然存在,可以查看服务器的错误日志(通常可以在主机控制面板中找到)。
检查更新是否因权限或其他问题失败。
5、手动更新插件或主题
如果某个插件或主题的更新失败导致问题,可以手动更新:
1、下载插件或主题的最新版本。
2、使用FTP将其上传到 /wp-content/plugins/ 或 /wp-content/themes/ 文件夹。
3、覆盖原文件。
预防此问题
1、备份网站:
在更新插件、主题或核心前,始终备份文件和数据库。
2、逐步更新:
避免一次性更新多个插件或主题。
3、监控服务器性能:
确保服务器有足够的资源,特别是对于共享主机。
4、使用可靠的主机:
使用支持自动修复功能的 WordPress 主机(如 Kinsta、SiteGround 等)。
实际排查过程
当我尝试排查问题时,没有在Docker中找到.maintenance文件:
// 查找 Docker 容器
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
18... wordpress "docker..." 8 months ago Up 13 days 0.0.0.0:8000->80/tcp, :::8000->80/tcp, 0.0.0.0:8001->443/tcp, :::8001->443/tcp docker-wordpress-1
// 进入 Docker 容器
# docker exec -it docker-wordpress-1 bash
# ls
fangjunyu.com.csr wp-activate.php wp-config.php20240309 wp-login.php ...
// 切换到 Docker 根目录
# cd /
root@18cc785cc795:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@18cc785cc795:/# pwd
/
// 查找 .maintenance 文件
root@18cc785cc795:/# find / -name .maintenance
find: '/proc/1/map_files': Operation not permitted
find: '/proc/6048/map_files': Operation not permitted
...
当我重新访问站点时,WordPress恢复正常,但还是之前的升级报错:
自动升级 WordPress 失败
禁止WordPress自动升级
因为WordPress自动升级的时间点无法控制,比如这次是周一的下午2点无法访问,比较尴尬的升级时间。
因此,可以考虑禁止WordPress的自动升级功能,可以通过修改配置文件和代码来实现。这包括禁止核心文件、插件、和主题的自动更新。
修改 wp-config.php 文件
1、打开 WordPress 的主目录,找到 wp-config.php 文件。
如果是Docker容器,则在Docker容器的WordPress主目录中:
2、编辑文件并添加以下代码:
define('AUTOMATIC_UPDATER_DISABLED', true);
define('WP_AUTO_UPDATE_CORE', false);
1)禁用所有自动更新:
define('AUTOMATIC_UPDATER_DISABLED', true);
2)禁用核心更新:
define('WP_AUTO_UPDATE_CORE', false);
说明:
1)AUTOMATIC_UPDATER_DISABLED:
包括核心(小版本和大版本)、插件、主题的自动更新。
如果设置为 true,WordPress 自动更新功能将被彻底禁用。
2)WP_AUTO_UPDATE_CORE:
控制 WordPress 核心的自动更新行为。
false:禁用所有核心自动更新(包括小版本和大版本)。
‘minor’:允许小版本更新(默认设置)。
true:启用所有核心版本的自动更新(包括大版本和小版本)。
注意1: WP_AUTO_UPDATE_CORE的’minor’是用单引号包裹,表示字符串。
注意2:禁用更新的代码是需要手动添加的,原文件没有禁用更新的代码,所以grep是检索不到更新代码的的。
在wp-config文件中配置禁用代码:
因为每次加载WordPress页面时,wp-config.php文件都会动态读取,所以无需重启服务器。
通过过滤器禁用自动更新
如果需要更细粒度的控制,可以在主题的 functions.php 文件中添加以下代码:
1、禁用所有更新:
add_filter('automatic_updater_disabled', '__return_true');
2、禁用插件更新:
add_filter('auto_update_plugin', '__return_false');
3、禁用主题更新:
add_filter('auto_update_theme', '__return_false');
4、禁用核心更新:
add_filter('auto_update_core', '__return_false');
是否与 wp-config.php 的禁用设置冲突?
1、工作机制的不同
wp-config.php:
通过常量(AUTOMATIC_UPDATER_DISABLED 和 WP_AUTO_UPDATE_CORE)全局控制自动更新行为。
适用于全站范围的配置。
functions.php:
通过过滤器更灵活地控制自动更新,允许对特定组件(如主题、插件)进行定制。
针对当前主题生效(如果切换主题,配置可能失效)。
2、是否会冲突?
不会直接冲突,但优先级可能影响最终行为:
如果在 wp-config.php 中禁用了自动更新(如 AUTOMATIC_UPDATER_DISABLED 设置为 true),过滤器可能不会被触发,因为全局禁用已生效。
如果 wp-config.php 没有禁用自动更新,则过滤器会正常生效,控制主题或插件的更新行为。
禁用更新通知(可选)
如果不想收到更新通知,可以添加以下代码到主题的 functions.php 文件,可以完全禁用更新检查和通知:
// 禁用核心更新检查
add_filter('pre_site_transient_update_core', '__return_null');
// 禁用插件更新检查
add_filter('pre_site_transient_update_plugins', '__return_null');
// 禁用主题更新检查
add_filter('pre_site_transient_update_themes', '__return_null');
使用插件禁用自动更新
如果不想手动修改代码,可以使用插件来禁用自动更新。例如:
Easy Updates Manager:
允许你通过图形界面控制所有更新设置。
安装后,可以在“更新选项”中选择关闭自动更新。
关闭自动更新提示
当修改wp-config.php以及functions.php文件后,仪表盘还有升级失败的提示:
禁用代码可能在 WordPress 已经触发更新后才生效,因此后台仍然提示更新失败。
目前还没有解决方案,怀疑是数据库的某个字段没有同步或者WordPress文件内容没有修改导致的。
临时解决方案:
在主题的 functions.php 中添加以下代码:
add_action('admin_head', function () {
echo '<style>.update-nag, .notice.notice-error { display: none !important; }</style>';
});
更新文件后,控制台的提示内容消失。
网上的普遍说法是检查 .maintenance 文件,但实际上我并没有找到这个文件。因此,不再过多赘述。
注意事项
1、安全性影响:
禁用自动更新后,WordPress核心和插件的安全补丁将不会自动安装,可能增加安全风险。
如果禁用更新,建议定期手动检查更新并安装重要的安全补丁。
2、自动备份:
配合自动备份机制(如使用插件 UpdraftPlus 或 BackupBuddy),以便在需要更新或修复时有备份可用。
3、检查设置:
可以通过 Site Health(站点健康)功能检查自动更新是否被禁用。
总结
完成上述步骤后,WordPress 的自动升级功能将被完全禁用,所有更新需要手动进行。
此外,还注意到本次的wp-config.php文件显示存在乱码,下次有时间会更新处理该乱码的文章,目前先不深入研究,如果你也存在该问题,那就只输入代码进去。