徒然メモ

技術的なことを書いたり書かなかったり

nginx+php-fpmでPHPを動かす。その3

nginxのconfファイルを設定

まずは結論から。編集した個所は以下の通り

diff nginx.conf.default nginx.conf
===============================================

2c2
< #user  nobody;
---
> user  nginx;
45c45
<             index  index.html index.htm;
---
>             index  index.html index.htm index.php;
65,71c65,71
<         #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;
<         #}
---
>         location ~* .php$ {
>             root           html;
>             fastcgi_pass   127.0.0.1:9000;
>             fastcgi_index  index.php;
>             fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
>             include        fastcgi_params;
>         }
===============================================

子プロセスをnginxユーザで動くようにコメントアウトし「nginx」に変更

index.phpもindex.htmlと同じように動くように追加

バックポートでphp-fpmに動いてもらうための設定をコメントアウト

通常のHTMLファイルと同じドキュメントルート配下にあるスクリプトを見に行くように「/scripts」から「$document_root」に変更。

以上でPHPが動くようになったはずです。

あとはnginxを起動させてブラウザにURLを入れて見れるか確認するだけです。

ドキュメントルート(今回の設定だと/usr/local/nginx/html)にphpinfo.phpを設置すると問題なく表示されるはずです。

nginxの起動について

nginxの起動方法については今回の手順では以下のコマンドで可能です。

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

停止するときは

/usr/local/nginx/sbin/nginx -s stop

で停止できます。

OSのリブート時や他のサービスと同様に「/etc/init.d」配下にスクリプトをおいて管理したい場合は頑張って自分で作るかepelのSRPMから拾ってくると楽ではないかなと思います。

今回私が「/etc/init.d」配下に設置したスクリプトについてはepelのSRPMから拝借しnginx本体のPATHとconfファイルのPATHを環境に合わせたものに変更しています。

設定時に困ったこと

最初設定を行ったときにnginx.confのPHPに関する項目をコメントアウトのみ行った状態でした。

その状態でドキュメントルートにphpinfoを表示させるファイルを設置しアクセスしましたが正常に表示されず以下のようなログが延々と出ていました。

[error] 27735#0: *8 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 172.16.1.83, server: localhost, request: "GET /phpinfo.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "{サーバのIPアドレス}"

この現象にドハマリしました。なぜかというとroot           html;という項目でドキュメントルートを設定し、fastcgi_param  SCRIPT_FILENAMEではドキュメントルートからのPATHだと勝手に思い込んでいました。

その為この設定のままドキュメントルート配下にscriptsのディレクトリを作りその中にphpinfoを表示させるスクリプトを設置したりしていました。

実際はサーバの絶対パスで「/script」というディレクトリを作る必要がありその配下にスクリプトファイルを設置しないといけませんでした。これに気づかずドハマリしました。

最終的には「ハイパフォーマンスHTTPサーバ Nginx入門」という書籍を参考に現在の設定に行きつきました。

同じような現象でお悩みの方はfastcgi_param  SCRIPT_FILENAMEの項目を{スクリプトファイルが置いてあるディレクトリの絶対パス}$fastcgi_script_name;で試されてみてはどうでしょうか。

ドキュメントルートとその配下のディレクトリでということであれば今回のように$document_rootを使うのもありかもしれませんね。