nginx + php-fpm でPHPの実行環境を構築した場合に動かなかったときの確認箇所と対処方法をメモします。
単純に nginx + php-fpm の環境を構築する方法は以下のエントリにまとめています。
基本的な内容ですが、見落としがちなところでもあるので。あとは、UNIXドメインソケットを使用する時のコツ的なところも含めて。
確認箇所と対処方法
基本的にはエラーログの出力からたどり着けるかと思いますが、ぴぐろぐで検証したことも含めてメモします。
エラーログ
php-fpm のエラーログは、/var/log/php-fpm/error.log になります。php-fpm.conf の [global] セクションで定義されています。
1 2 |
[global] error_log = /var/log/php-fpm/error.log |
nginx のエラーログは、/var/log/nginx/error.log です。nginx.conf でログレベルを含め定義されているようです。
1 |
error_log /var/log/nginx/error.log warn; |
以下はぴぐろぐで確認したエラーを含め、動かない場合の確認箇所と対処方法を記す。
php-fpm
実行ユーザを変更していない
php-fpm を動かすデフォルトのユーザは apache に設定されているため、nginxで動かす場合には以下のように変更が必要。
1 2 3 4 5 |
user = apache group = apache ↓ user = nginx group = nginx |
php-fpm と nginx の通信方法の設定が合っていない
TCP か UNIXドメインソケット のどちらで通信するのかという話で、php-fpm での設定は、/etc/php-fpm.d/www.conf の listen ディレクティブで定義されている。以下のどちらかを指定して nginx 側の設定でも合わせる必要がある。nginx の設定は nginx の項を参照。
1 2 3 4 5 |
# TCP listen = 127.0.0.1:9000 # UNIXドメインソケット listen = /var/run/php-fpm/php-fpm.sock |
listen.ownerが変更されていない
↑の通信方法の指定で UNIXドメインソケット を使用する場合は、明示する必要がある。明示しない場合、php-fpm.sock のパーミッションが以下となっており、nginx が読めない状態。
1 2 |
# ls -l /var/run/php-fpm/php-fpm.sock srw-rw---- 1 root root 0 9月 5 09:53 /var/run/php-fpm/php-fpm.sock |
例えば以下のように修正する。
1 2 3 4 5 6 7 |
;listen.owner = nobody ;listen.group = nobody ;listen.mode = 0660 ↓ listen.owner = nginx listen.group = nginx listen.mode = 0660 |
そうすると、php-fpm.sock の所有ユーザが変更されて nginx が読める状態となる。
1 2 |
# ls -l /var/run/php-fpm/php-fpm.sock srw-rw---- 1 nginx nginx 0 9月 5 10:17 /var/run/php-fpm/php-fpm.sock |
例えば、以下のように user は指定せず Permission のみの変更でも動くという意味ではOK。
1 2 3 4 5 6 7 |
# vi /etc/php-fpm.d/www.conf ;listen.owner = nobody ;listen.group = nobody listen.mode = 0666 # ls -l /var/run/php-fpm/php-fpm.sock srw-rw-rw- 1 root root 0 9月 5 10:17 /var/run/php-fpm/php-fpm.sock |
他には、nginx を動かすユーザ hoge を変更して、そのユーザを指定するのもOK.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# useradd hoge # vi /etc/nginx/nginx.conf user nginx; ↓ user hoge; # vi /etc/php-fpm.d/www.conf listen.owner = hoge listen.group = hoge listen.mode = 0660 # ll /var/run/php-fpm/php-fpm.sock srw-rw---- 1 hoge hoge 0 9月 5 10:25 /var/run/php-fpm/php-fpm.sock |
っと、このくらいにして次に進みます。
Nginx
php-fpm との連携でいえば、設定ファイル /etc/nginx/conf.d/default.conf の PHP の location を確認すればOK。
以下がデフォルトの状態でコメントアウトされている。
1 2 3 4 5 6 7 |
#location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} |
通信方法の設定
phpの項で触れた内容。TCPとUNIXドメインソケットのどちらで通信するのか。以下、php-fpm の設定と合わせる。
1 2 3 4 5 |
# TCP fastcgi_pass 127.0.0.1:9000; # UNIXドメインソケット fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; |
phpスクリプトファイルの保存先の指定
index.php をどこに設置するのかということで、例えば DocumentRoot に設置するのであれば、以下となる。$xxx は nginx の変数です。詳細は公式ページを参照。
1 |
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; |
DocumentRoot の指定は例えば以下のように変更。
1 2 3 |
root html; ↓ root /var/www/html; |
このくらいでしょうか。他に追記あれば更新していきます。
以上です。
↓↓↓ 持っていると便利な一冊。