PHP-fpmを理解して環境設定するために調べた内容

PHP-fpmの基本的な知識について環境構築や設定するにあたって理解するために調べた内容をまとめました。
PHP-fpmの基礎知識
これまで「PHPの環境構築はググってとりあえず動けばOK」って感じでした。

Webサーバの細かなチューニングとなるとお手上げでした💦
これではダメと思い「PHP-fpmを理解して環境構築する」ように勉強しました。
- PHP-fpmとは
- PHPをFastCGIで動かしたもの
- FastCGIで動かすことでWebサーバの負荷軽減が期待できる
- FastCGIとは
- CGIの改良版
- 起動したプログラムをメモリへ一時保存して起動と終了による処理を軽減する仕組み
- PHPのCGI版とは
- PHP-fpmはPHPのCGI版
- PHP-fpmとNginxの連携について
- 連携にはTCPとUNIXドメインソケットがある
では、詳しく調べます。
PHP-fpmとは
PHP-fpmとは、FastCGI Process Managerの略でPHP5.4.0から公式サポートされたPHP標準のアプリケーションサーバです。
PHP-fpmを簡単に言うと「FastCGIで動作させたPHP」となります。

FastCGIで動作させたPHPってどういうこと?
FastCGIが良くわからなかったので、FastCGIの特徴について調べます。
FastCGIとは
FastCGIは、Webサーバ上でプログラムを動かすための仕組みである「CGIを改良した」ものです。
- Common Gateway Interface の略
- すごくかみ砕くとホームページでプログラムを動かすための仕組み
- 例:掲示板サイトやショッピングサイト
FastCGIの特徴は
FastCGIは、Webサーバのプログラムを一度起動させてしばらくメモリ上へ保持し待機させる仕組みとなっています。
なので、一度起動させたプログラムを待機させることでプログラムの起動や終了の処理を軽減できます。
参考:FastCGIとは – 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
まとめ:PHP-fpmの特徴は「FastCGI」
PHP-fpmの特徴は、FastCGIで動作させていることです。

PHPをFastCGIで実行することで「負荷軽減することが出来る」ということになります。
PHPとPHP-fpmの違い
PHP-fpmがFastCGIで動くPHPだと理解できました。次にPHPとPHP-fpmは何が違うのか調べます。

PHP-fpmってPHPと何が違うんだろう。。。
- PHP-fpmはPHPのCGI版
まずは基本のPHPについて調べます。
PHPとは
PHPは、Hypertext Preprocessorが正式名称です。
特徴は、Webサーバ(ApacheやNginx)上で動作するオープンソースの汎用スクリプト言語です。
あと、PHPはコンパイルを行う必要がないインタープリタ言語です。
- スクリプト言語とは
- 可読性が高く比較的簡単に書きやすいプログラミング言語の総称
- オープンソースとは
- ソースコードが一般公開されており修正や改変することができるソフトウェアのライセンス
- 例:WordPress
- インタープリタ言語
- プログラムを実行する度に機械語へ変換されるので、コンパイルを行うこと必要がない
- コンパイラ言語
- プログラム作成後にコンパイルを行う必要がある
さらにPHPの詳しい動作について書かれている記事を紹介しておきます。
参考:知っていますか? あなたの書いたPHPのコードが実行される4つのプロセス
PHPのモジュール版とCGI版
PHPにはモジュール版とCGI版の2種類があります。
モジュール版
PHPのモジュール版は、Webサーバ(ApacheやNginx)のプロセスの中でPHPを実行するのが特徴です。通常はApacheのモジュール版を意味します。

Webサーバの起動時に読み込まれてWebサーバの一部として実行されます。
つまりWebサーバであるApacheの拡張機能で直接処理する方法です。
モジュール版のポイント
CGI版に比べて動作速度が高速になります。
phpinfoでの確認
Server API項目でApache 2.x Handler、Apacheなどと表示されます。
CGI版
PHPのCGI版は、Webサーバ(ApacheやNginx)と別プロセスで実行されるのが特徴です。

Webサーバと別プロセスで動作するのでPHPを実行する度にメモリのロードが必要となります。
つまりWebサーバで直接処理せずにCGIプログラムを別途起動して処理する方法となります。
PHP-fpmはこのCGI版ということです。
CGI版のポイント
動作速度がモジュール版に比べて遅くなります。
phpinfoでの確認
Server API項目でCGI、 FastCGI、FPM/FastCGIなどと表示されます。
まとめ:PHPとPHP-fpmの違い
PHPとPHP-fpmの違いとして、PHP-fpmはWebサーバ(ApacheやNginx)と別プロセスで実行される点にありました。

PHP-fpmは「PHPのCGI版」です。
参考:PHPのモジュール版とCGI版の違いは?メリット・デメリット・パフォーマンスを比較
参考:CGI版PHPとモジュール版(スクリプト版)PHP
PHP-fpmと連携するNignx
PHP-fpmで環境構築する上でWebサーバと連携します。
では、PHP-fpmと連携するWebサーバのNginxについてから調べます。
Nginxとは
Nginx(エンジンエックス)とは、Webサーバのオープンソースのソフトウェアです。
WebサーバのソフトウェアといえばApache(アパッチ)があります。ですが、最近だとApacheよりNginxを使用するケースが多くなりました。

Nginx使ってるけどApacheとの違いってなんだろう。。。
では、ApacheとNginxの違いについて軽く調べます。
NginxとApacheの違いを比較
NginxとApacheの違いを比較してNginxの特徴を理解します。
- 高速化
- NginxはApacheより高速化が見込める
- ただし高速化は環境などによって変動する
- 負荷に強い
- NginxはApacheより高負荷に強い
- これはNginxが高負荷となる集中アクセスに耐える設計であるため
- 重い処理は苦手
- NginxはApacheより重い処理が苦手
- これはNginxのCPUリソースが多く必要であるため
- リバースプロキシ機能
- Nginxにはリバースプロキシ機能がある
- 負荷分散を行うことができる
- 軽いリクエストを大量に処理するのに向いている
Nginxの特徴は理解しました。では、PHP-fpmとNginxの連携(通信)について調べます。
PHP-fpmとNginxの連携する通信
PHP-fpmとNginxの連携ですが、一般的には「TCPかUNIXドメインソケットのどちらかで通信」します。

TCP?UNIXドメインソケットってなんだっけ。。。
TCPとUNIXドメインソケットの違いを理解するために特徴を調べます。
TCPとは
TCPとは、Transmission Control Protocolの略でトランスポート層で動作する信頼性の高い通信プロトコルです。
安全性重視で通信するときに使うお約束事「TCP」とインターネット用のお約束事「IP」を一緒くたにした表現
https://wa3.i-3-i.info/word1540.html
参考:TCP/IP – 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
IPの上位プロトコルのトランスポート層で動作するプロトコルです。インターネットにおいて標準的に利用されているプロトコルでネットワーク層のIPとセッション層以上のプロトコル(例:HTTP、FTP、Telnet) の橋渡しをする形で動作しています。
TCPは、高信頼性(3 way ハンドシェイクによる通信前の打診、ack による相手の受信確認や再送処理、等)や 通信効率の最適化機能(Windowによるフロー制御や輻輳制御)を提供します。そのため、UDPと比べて負荷がかかります。
https://hldc.co.jp/blog/2019/07/11/2819/
参考:TCPとUDPの違いとは?~Ethernet接続におけるオーバーヘッド削減ノウハウ~
UNIXドメインソケットとは
UNIXドメインソケットとは、単一のローカルマシン上で実行されるプロセス間のデータ交換通信用に利用するソケットです。
ローカルマシン上のプロセス同士の通信に使われるインタフェースです。
https://xtech.nikkei.com/it/article/Keyword/20100205/344262/
ソケット
BSDソケットは、ホスト間の通信や1つのコンピュータ上のプロセス間の通信を可能とするものです。
プログラムとネットワークをつなげる接続口のこと
https://wa3.i-3-i.info/word168.html
もしくは
プログラムでネットワーク通信部分を担当する奴等
参考:ソケット – 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
さらにソケットを詳しく紹介した記事です。
参考:ソケットプログラミング HOWTO
- TCP
- 信頼性の高い通信が行える
- UNIXドメインソケット
- ローカルマシン上で通信が行える
- なので、PHPとWebサーバ(Nginx)を別サーバにすると使えない
PHP-fpmとNginxを連携する方法
最後に実際にPHP-fpmとNginxを連携する方法について調べます。
PHP-fpmとNginxのTCPで連携する方法とUNIXドメインソケットで連携する方法の設定例を紹介します。
※設定して実際に動かしてないのであくまで参考程度にしてください。
TCPで連携する設定方法
PHP-fpmの設定をします。
$ sudo vi /etc/php-fpm.d/www.conf
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' – to listen on a TCP socket to a specific IPv4 address on
; a specific port;
; '[ip:6:addr:ess]:port' – to listen on a TCP socket to a specific IPv6 address on
; a specific port;
; 'port' – to listen on a TCP socket to all addresses
; (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' – to listen on a unix socket.
; Note: This value is mandatory.
; PHP-FPMが待ち受けを行うポートの設定
; listen = /var/run/php-fpm/www.sock
listen = 127.0.0.1:9000
Nginxの設定をします。
$ sudo vi /etc/nginx/nginx.conf
location ~ \.php$ {
root /var/www/html;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
}
PHP-fpmとNginxを再起動します。
$ sudo /etc/rc.d/init.d/php-fpm restart
$ sudo /etc/rc.d/init.d/nginx restart
動作確認します。
$ netstat -a –tcp
tcp 0 0 localhost:9000 *:* LISTEN
UNIXドメインソケットで連携する設定方法
PHP-fpmの設定をします。
$ sudo vi /etc/php-fpm.d/www.conf
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' – to listen on a TCP socket to a specific IPv4 address on
; a specific port;
; '[ip:6:addr:ess]:port' – to listen on a TCP socket to a specific IPv6 address on
; a specific port;
; 'port' – to listen on a TCP socket to all addresses
; (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' – to listen on a unix socket.
; Note: This value is mandatory.
; PHP-FPMが待ち受けを行うポートの設定
listen = /var/run/php-fpm/www.sock
; listen = 127.0.0.1:9000
Nginxの設定をします。
$ sudo vi /etc/nginx/nginx.conf
location ~ \.php$ {
root /var/www/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
PHP-fpmとNginxを再起動します。
$ sudo /etc/rc.d/init.d/php-fpm restart
$ sudo /etc/rc.d/init.d/nginx restart
動作確認します。
$ netstat -a –unix
unix 2 [ ACC ] STREAM LISTENING 20655 /var/run/php5-fpm.sock
まとめ:PHP-fpmを理解して環境設定するために調べた内容
今回はPHP-fpmの基本的な知識について環境構築や設定するにあたって理解するために調べました。
- PHP-fpmとは
- PHPをFastCGIで動かしたもの
- FastCGIで動かすことでWebサーバの負荷軽減が期待できる
- FastCGIとは
- CGIの改良版
- 起動したプログラムをメモリへ一時保存して起動と終了による処理を軽減する仕組み
- PHPのCGI版とは
- PHP-fpmはPHPのCGI版
- PHP-fpmとNginxの連携について
- 連携にはTCPとUNIXドメインソケットがある
ちょっとPHP-fpmとNginxの連携に関するTCPやUNIXドメインソケットについては理解できていない部分がありますが、ざっくり理解はできました。
次回はPHP-fpmの設定項目やNginxの設定について深堀しようと思います。
最後まで読んでもらいありがとうございます。
参考:nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する
合わせて読んでもほしい記事
PHPのおすすめ書籍
PHPを勉強する人にとって定番本の「パーフェクトPHP」です。脱初心者を目指す人にとって超おすすめです。
ディスカッション
コメント一覧
まだ、コメントがありません