🛠️

WordPressプラグイン更新エラー upgrade-temp-backup

に公開

はじめに

WordPressのプラグインを管理画面から更新中に、以下のようなエラーが発生し、管理画面からプラグインの表示がなくなりました

更新失敗:管理画面でupgrade-temp-backupディレクトリへ移動できませんでした

これは、WordPress 6.3 から導入された「プラグインのロールバック機能」とファイルパーミッションが原因でした

本記事では、ステージング環境(プラグイン更新成功)と本番環境(プラグイン更新失敗)を比較しながら、問題の特定・原因の推測・再発防止策についてまとめます

本記事では、ステージング環境では成功したのに、本番環境では失敗した――
そんな現象の原因を、ファイル所有者・パーミッション・WordPressの機能の視点から調査し、再発防止のポイントを整理します

発生した事象

ステージング環境でWordPressコア(WordPress 6.4.3→6.6.2)とプラグインアップデートを確認後、本番環境で同様の操作をしたところ、WordPressコアのアップデートは成功しましたが、一部のプラグインアップデートをした際に以下のようなエラーが発生し、管理画面からプラグインがなくなりました

更新失敗:管理画面でupgrade-temp-backupディレクトリへ移動できませんでした

(※実際には「ディレクトリい」と表示されていました)

原因がすぐにわからなかったので、バックアップからサーバーを立ち上げて切り戻しを実施しました

upgrade-temp-backup ディレクトリとは?

WordPress 6.3 から導入された「プラグイン/テーマの手動更新のロールバック機能」により、
更新前の旧バージョンを一時保存するためのディレクトリが wp-content/upgrade-temp-backup/ に作られるようになりました

更新フローは以下の通りです:

  1. 古いプラグインを upgrade-temp-backup/plugins/PLUGINNAME/ に移動
  2. 新バージョンを upgrade-temp-backup/plugins/PLUGINNAME/ に上書き
  3. 問題がなければ、upgrade-temp-backup/ は自動でクリーンアップされる

参考:New in 6.3: Rollback for failed manual plugin and theme updates

各環境比較

ステージング環境では更新が成功していたため、以下の3つの環境を比較しました

環境 状態
ステージング 正常に更新
本番(更新前) WordPressコア、プラグイン更新前の状態
本番(更新失敗後) プラグイン更新失敗、プラグインが管理画面から消えた状態

upgrade-temp-backup ディレクトリの状態

更新が成功したステージングはupgrade-temp-backup/内が空の状態になっており、クリーンアップされている状態になっておりました
一方、本番環境にはplugins/ディレクトリが存在していました

環境 所有者 権限 upgrade-temp-backup/ 内
ステージ apache:apache 775
本番(更新前) apache:apache 775 plugins/ディレクトリ
本番(更新失敗後) apache:apache 775 plugins/ディレクトリ

upgrade-temp-backup/plugins/ ディレクトリの状態

本番(更新前)はupgrade-temp-backup/plugins/に更新失敗したPLUGINNAME/ディレクトリが存在していました
本番(更新失敗後)では、空の状態でした(エラーが出たため削除された?)

環境 所有者 パーミッション upgrade-temp-backup/plugins/
ステージング apache:apache 775
本番(更新前) apache:apache 775 更新失敗したPLUGINNAME/ディレクトリ
本番(更新失敗後) apache:apache 775

更新失敗したPLUGINNAME/ディレクトリ内ディレクトリ、ファイルの所有者'user:apache'、パーミッション'755/644'となっていました
どうやら書き込み権限がないため、WordPressがリネーム等の操作をしようとしても、既存ディレクトリに対して上書き・削除ができず、エラーが発生したと考えられます

wp-content/plugins/ 以下の所有者とパーミッション

元々のプラグインディレクトリ、ファイルのパーミッションを確認したところ、ステージングでは全てグループ書き込み権限が付与されていたのに対して、本番では更新に失敗したプラグインにグループ書き込み権限がありませんでした
このグループ書き込み権限の差分でステージング、本番での成否の違いが出たようです

環境 所有者 ディレクトリ / ファイルのパーミッション
ステージング apache:apache または
user:apache
775 / 664
本番 apache:apache または
user:apache(更新失敗プラグイン)
775 / 664または
755 / 644(更新失敗プラグイン)

なぜ今回の更新でエラーになったのか?

処理の流れと問題点

  1. 「プラグイン/テーマの手動更新のロールバック機能」でupgrade-temp-backup/plugins/PLUGINNAME/ にバックアップを作成される
  2. しかし、すでに同名ディレクトリが存在
  3. そのディレクトリの所有者が user:apache、グループ書き込み権限がないため書き込み不可(755`)
  4. 上書き・削除できず、「移動できませんでした」というエラーが発生した

なぜ同名ディレクトリが存在していたのか?

おそらく前回の更新時に削除処理が失敗して、バックアップディレクトリが残ったと考えられます

  • upgrade-temp-backup/ にバックアップ作成(この時点では成功)
  • 更新が成功した後、そのバックアップを削除
  • 削除時にグループ書き込み権限がないため、apacheユーザーからは削除できない
  • 結果として バックアップディレクトリが残ってしまった

対応

以下の対応を実施することで、問題なくプラグインの更新ができました

upgrade-temp-backup/plugins以下を削除(念の為tmp/へ退避)
wp-content/plugins/ 以下のディレクトリ/ファイルにグループ書き込み権限を付与(755 / 644775 / 664

おわりに

今回のトラブルは、WordPress 6.3 以降で導入されたロールバック機能、プラグインディレクトリの所有者・権限の違い、前回の更新でバックアップが残っていたことなど、複数の要因が重なって発生したものでした

とはいえ、根本には「ファイル・ディレクトリの適切な権限設定」という基本的な問題があり、ここを見直せば防げる内容だったとも言えます
(※umask設定はされていましたが、ステージングと本番で差分が出ていたのは、プラグインの追加方法が異なっていた可能性があります)

意図せずパーミッションが不揃いになるケースは少なくないため、WordPressの更新前には wp-content/plugins/ 以下の権限をあらためて確認することが、安全な運用につながります

本記事が、同様の問題で悩んでいる方の一助になれば幸いです

Discussion