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/
に作られるようになりました
更新フローは以下の通りです:
- 古いプラグインを
upgrade-temp-backup/plugins/PLUGINNAME/
に移動 - 新バージョンを
upgrade-temp-backup/plugins/PLUGINNAME/
に上書き - 問題がなければ、
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 (更新失敗プラグイン) |
なぜ今回の更新でエラーになったのか?
処理の流れと問題点
- 「プラグイン/テーマの手動更新のロールバック機能」で
upgrade-temp-backup/plugins/PLUGINNAME/
にバックアップを作成される - しかし、すでに同名ディレクトリが存在
- そのディレクトリの所有者が user:apache
、グループ書き込み権限がないため書き込み不可(
755`) - → 上書き・削除できず、「移動できませんでした」というエラーが発生した
なぜ同名ディレクトリが存在していたのか?
おそらく前回の更新時に削除処理が失敗して、バックアップディレクトリが残ったと考えられます
-
upgrade-temp-backup/
にバックアップ作成(この時点では成功) - 更新が成功した後、そのバックアップを削除
- 削除時にグループ書き込み権限がないため、apacheユーザーからは削除できない
- 結果として バックアップディレクトリが残ってしまった
対応
以下の対応を実施することで、問題なくプラグインの更新ができました
upgrade-temp-backup/plugins以下を削除(念の為tmp/へ退避)
wp-content/plugins/
以下のディレクトリ/ファイルにグループ書き込み権限を付与(755 / 644
→ 775 / 664
)
おわりに
今回のトラブルは、WordPress 6.3 以降で導入されたロールバック機能、プラグインディレクトリの所有者・権限の違い、前回の更新でバックアップが残っていたことなど、複数の要因が重なって発生したものでした
とはいえ、根本には「ファイル・ディレクトリの適切な権限設定」という基本的な問題があり、ここを見直せば防げる内容だったとも言えます
(※umask設定はされていましたが、ステージングと本番で差分が出ていたのは、プラグインの追加方法が異なっていた可能性があります)
意図せずパーミッションが不揃いになるケースは少なくないため、WordPressの更新前には wp-content/plugins/ 以下の権限をあらためて確認することが、安全な運用につながります
本記事が、同様の問題で悩んでいる方の一助になれば幸いです
Discussion