1. 発端:管理画面で更新できない
kusanagi9環境のWordPress の管理画面からプラグイン(例:Yoast SEO)を更新しようとしたところ、こんな感じのエラーが表示された。
〇〇の更新中にエラーが発生しました。ダウンロードに失敗しました。ファイルストリーミングの送り先となるディレクトリが存在しないか、書き込み不可になっています。
・症状
ダウンロードはできている。
展開も途中までは進む。
最後の「旧ファイル削除」「新ファイルコピー」で失敗。
つまり「WordPress が書き込み/削除できない」状態だった。
今は便利なchatGPTなどあるから、macbookならターミナルでコマンド打てば早くて安全にプラグインはいじれるけど、やっぱり管理画面からも直感的にささっと更新したり削除したり追加できるようにはしておきたい。
2. 切り分け:パーミッションは正しいのに失敗する
wp-config.php に FS_METHOD=direct を設定済み
wp-content/upgrade-temp-backup などは 775 に調整済み
それでも失敗
ここで「単純なパーミッション問題ではなく、所有者と実行ユーザーの不一致」を疑うことにした。
3. 実行ユーザーを確認
サーバーで以下を実行:
ps aux | grep php-fpm
出力例:
root … php-fpm: master process
httpd … php-fpm: pool www
👉 この環境では PHP-FPM の実行ユーザーが httpd であることが判明。
つまり WordPress がファイル操作を行うのは httpd ユーザー権限。
一方で、サーバー上の wp-content/plugins ディレクトリの所有者は kusanagi や root になっていた。
これが「削除できない」「コピーできない」原因だった。
4. 解決策:plugins と upgrade 系を httpd:www に揃える
根本解決はシンプルだった。
プラグイン更新で使う領域(plugins, upgrade, upgrade-temp-backup)だけを httpd:www に変更する。
# プラグインディレクトリと一時領域を httpd:www に
chown -R httpd:www /home/kusanagi/〇〇〇〇/DocumentRoot/wp-content/plugins
chown httpd:www /home/kusanagi/〇〇〇〇/DocumentRoot/wp-content/upgrade
chown httpd:www /home/kusanagi/〇〇〇〇/DocumentRoot/wp-content/upgrade-temp-backup
# 権限を整備(ディレクトリ=775 / ファイル=664)
find /home/kusanagi/〇〇〇〇/DocumentRoot/wp-content/plugins -type d -exec chmod 775 {} \;
find /home/kusanagi/〇〇〇〇/DocumentRoot/wp-content/plugins -type f -exec chmod 664 {} \;
chmod 775 /home/kusanagi/〇〇〇〇/DocumentRoot/wp-content/upgrade
chmod 775 /home/kusanagi/〇〇〇〇/DocumentRoot/wp-content/upgrade-temp-backup
5. 結果:無事に更新成功!
再度管理画面からプラグインを更新すると、エラーなく完了。
大きなプラグイン(WP-Optimize Premium)なども問題なく更新できるようになった。
6. 学びと注意点
WordPress の「プラグイン更新できない問題」は、表面的には「パーミッションエラー」に見える。
しかし本当の原因は「実行ユーザーと所有者のズレ」であることが多い。
今回のケースでは、plugins と upgrade 系を httpd:www に揃えるだけで復旧した。
今後も同様の不具合が起きたら、まずは PHP-FPM の実行ユーザーを確認することが解決への近道だ。
それにしてもAIの進化のおかげで、コマンド入力も楽になったし原因もわかりやすくなったし本当に助かる。以前は検索して翻訳してドキドキしながらコマンド打って。。と大変だった。
とはいえAIも間違えることは多いし、深く掘り下げすぎてPHPの設定を変えろとかも言い出すので注意が必要。
WordPress系のエラーは割とシンプルな原因が多いので、深掘りしすぎないようにするのが良いかと思う。
終わり
コメント