ブログをわざわざ自分のサーバを建ててまで作るということは、もちろん書きたいものがたくさんあって、構成もある程度固めていました。
それでもまず何より先に本記事を先行して書くほどに、無為な時間を過ごしてしまったという強い後悔のもと書いていきます。
ディレクトリのパーミッションは755。所有者もnginx。なぜ更新できない?
結論から。
Webサーバー(Nginx)と、PHPを実際に動かすプログラム(PHP-FPM)の実行ユーザーが一致していなかった
泥沼にハマって行った経緯は下記の通り。
意気揚々とクラウドサーバーを立ち上げ、環境を構築。WordPressのインストールも無事に完了し、すべてがうまく行くかに見えた
本業は𝑩𝒂𝒄𝒌𝒆𝒏𝒅 𝑬𝒏𝒈𝒊𝒏𝒆𝒆𝒓.
ドヤ顔でコマンドを叩き、土台を整えました。
テーマも自作したいところでしたが、如何せんUI/UXには疎いため、既存のテーマから見繕って有効化しようとアップロードを試行したところ、下記のようなエラー、サイトヘルス警告が発生しました。
「ディレクトリを作成できませんでした」
「更新時にはFTP認証情報を入力する必要があります」
Web制作者なら誰でも知っている(察しがつく)通り、こういう時の原因は十中八九ファイルのパーミッションです。すぐさまサーバーにSSHで接続し、ll (ls -l)
コマンドで権限を確認。
drwxr-xr-x. 2 nginx ec2-user 6 Sep 6 15:07 uploads
所有者はnginx
、グループはec2-user
、パーミッションも755
。Webサーバー(Nginx)が所有者なのだから、書き込めて当然のはず。何度確認しても設定に誤りは見受けられない。
ここから、数時間にわたる、なんの成果も得られなかった不毛なデバッグ作業が始まりました。
本当にファイルを書き込むのは誰?
この問題の根幹は、「Webサイトの裏側で誰が実際に動いているのか」という役割分担にありました。
飲食店に例えると、
- Nginx: お客さんの注文を受ける
ホールスタッフ
- PHP-FPM: 料理を作る
キッチンスタッフ
お客さん(ブラウザ)からのリクエストは、まずホールスタッフ(Nginx)が受け取る。
しかし、ホールスタッフは料理を作るわけではなく、注文を厨房にいるキッチンスタッフ(PHP-FPM)に伝えるだけ。
WordPressのテーマインストールや画像アップロードといった実際の「作業」を行うのは、このキッチンスタッフ
になる。
つまり、ファイルの書き込み権限が必要なのは、ホールのnginx
ではなく、キッチンスタッフであるPHP-FPMの実行ユーザーです。
解決策:PHP-FPMの実行ユーザーをNginxに合わせる
多くのOS(特にAmazon LinuxやCentOSなど)でphp-fpm
をインストールすると、このデフォルト名は、NginxではなくApacheを想定したapache
になっています。これをnginx
に変更してあげる必要があります。
手順1. PHP-FPMの設定ファイルを確認する
PHP-FPMのプール設定ファイル(多くはwww.conf
)を開きます。場所はOSによって異なりますが、主に以下のどちらかです。
/etc/php-fpm.d/www.conf
/etc/php/7.x/fpm/pool.d/www.conf
(7.xはPHPのバージョン)
以下のコマンドで現在の設定を確認できます。
grep -E '^user =|^group =' /etc/php-fpm.d/www.conf
おそらく、このように表示されるはずです。
user = apache
group = apache
これが問題の根源でした。
手順2. 実行ユーザーをnginxに変更する
設定ファイルを開き、user
とgroup
をnginx
に書き換えます。
; 変更前
; user = apache
; group = apache
; 変更後
user = nginx
group = nginx
手順3. サービスを再起動する
設定を保存したら、PHP-FPMとNginxの両方を再起動して設定を反映させます。
sudo systemctl restart php-fpm
sudo systemctl restart nginx
以上の設定で、PHP-FPMの実行ユーザーとディレクトリ・ファイルの所有者が一致し、無事に厨房での作業(ファイルの書き込み)ができるようになります。
まとめ
サーバーを自分で構築する際、各ソフトウェアが「誰として」動いているのか
を意識するのが非常に重要です。今回の問題は、その典型例でした。
- 問題: ファイルの所有者・権限が正しいのにWordPressがファイルを更新できない。
- 原因: Nginxの実行ユーザー (
nginx
) とPHP-FPMの実行ユーザー (apache
) が異なっていた。 - 解決策: PHP-FPMの設定ファイル (
www.conf
) を開き、user
とgroup
をnginx
に修正する。
同じ問題で時間を溶かしている未来の誰かの助けになれば幸いです。
コメント