埼玉在住エンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことについて残していきたいと思っています。https://ikujip.jpの開発も行っているため、そこで使った知識なども載せられればと思います。

NginxでPHPを動かす

Nginxとは何じゃらほいというところからですが、ここは他のサイトを見た方が細かくわかりやすく説明されていると思うので説明は割愛させていただきますが、NginxとPHPの説明について軽く触れたいと思います。

最初にPHPについてですが、モジュール版とCGI版があることをご存知ですか?

まずモジュール版についてですが、Webサーバのプロセスの中でPHPを実行する方法です。
メリットとしては、PHP起動時にわざわざPHPの実行プロセスを立ち上げずにWebサーバと一緒に起動させるため、動作速度が高速になります。
デメリットとしては、Webサーバはrootなどユーザー1つで動かすため、共用サーバなどユーザーが複数いる環境では色々リスクがあります。
例えば1つのユーザが作ったPHPの処理に高負荷がかかった時、同一のWebサーバプロセスで動いている他のユーザの処理にも影響が発生します。

次にCGI版ですが、こちらはWebサーバとは別のプロセスでPHPが実行されます。
メリットとしては、PHPの処理ごとにプロセスが異なるため、ユーザーが複数いる環境でもモジュール版で発生していたようなリスクは軽減されます。
高負荷のPHP処理があった場合でも、そのプロセスだけ停止させれば良いのです。
ただしデメリットとしては、Webサーバとは別のプロセスとして動かすため、実行するたびにプロセスの生成と破棄が必要となり、動作速度が遅くなります。

ApacheとNginxの区分けで言いますと、
モジュール版がApacheCGI版がNginxになります。

あれ?
NginxはCGI使ってるの?
じゃあApacheより遅くなるんじゃないの?
と思いますよね。

ご安心ください。
Nginxは通常のCGIではなく、FastCGIというものを使っています。

FastCGIは、プロセスをメモリ上に永続化させるため、生成と破棄にかかる時間を短縮します。
こうして通常のCGIに比べてパフォーマンスを向上させるのです。

また、NginxではサーバとPHPの処理プロセスが異なるため、
PHPの処理が高負荷になってもサーバへの影響はApacheに比べて軽減され、メモリの消費も抑えることができるのです。

さて、前おきが長くなりますが、設定作業に移ります。
今回はルートディレクトリを/var/wwwとし、phpinfo()の結果が出力されるまでの動作確認とします。

CentOSのバージョンは6.8を使用しています。

まずはphp-fpmのインストールです。
php-fpmはPHPFastCGIで動作させるための仕組みです。

yum -y install php-fpm

設定ファイルを編集しましょう。

/etc/php-fpm.d/www.conf
(変更前後のdiffになります)

39c39
< user = apache
---
> user = nginx
41c41
< group = apache
---
> group = nginx

yumリポジトリCentOSに登録します。
(これやらないとyumでNginxのインストールができません。)

rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

Nginxをインストールします。

yum -y install nginx

Nginxの設定ファイルを編集します。

/etc/nginx/conf.d/default.conf
(ルートディレクトリを/var/wwwとしています。)

9,10c9,10
<         root   /usr/share/nginx/html;
<         index  index.html index.htm;
---
>         root   /var/www;
>         index  index.php;
30,36c30,36
<     #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           /var/www;
>         fastcgi_pass   127.0.0.1:9000;
>         fastcgi_index  index.php;
>         fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
>         include        fastcgi_params;
>     }

上記を見ていただければ分かりますが、
FastCGIで起動させるスクリプトの場所を指定しています。

動作確認用のファイルを用意します。

cd /var
mkdir www
vim index.php
<?php phpinfo(); ?>

php-fpmを起動します。

/etc/init.d/php-fpm start
chkconfig php-fpm on

Nginxを起動します。

/etc/init.d/nginx restart

これでブラウザからアクセスしてphpinfo()の情報が表示されればOKです!
全然難しくないですね。