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

2019年5月29日システムNginx,PHP,プログラム入門

PHP-fpmの環境設定するにあたって理解出来るように仕組みについて調べてみた! By UTの日常
PHP-fpmの環境設定するにあたって理解出来るように仕組みについて調べてみた! By UTの日常

どうも、UT(@ut_1029)です。

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の環境構築を理解するためにまずPHP-fpmの基礎から特徴を理解します。

結論:PHP-fpmの基礎知識

  • PHP-fpmはPHPをFastCGIで実行することで負荷軽減することが出来る

PHP-fpmとは

PHP-fpmとは、FastCGI Process Managerの略でPHP5.4.0から公式サポートされたPHP標準のアプリケーションサーバです。

PHP-fpmを簡単に言うと「FastCGIで動作させたPHP」となります。

FastCGIで動作させたPHPってどういうこと?

FastCGIが良くわからなかったので、FastCGIの特徴について調べます。

FastCGIとは

FastCGIは、Webサーバ上でプログラムを動かすための仕組みである「CGIを改良した」ものです。

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とPHP-fpmの違い

  • 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の特徴

  • 軽いリクエストを大量に処理するのに向いている

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/

参考:UNIXドメインソケット – 日経クロステック

ソケット

BSDソケットは、ホスト間の通信や1つのコンピュータ上のプロセス間の通信を可能とするものです。

プログラムとネットワークをつなげる接続口のこと
もしくは
プログラムでネットワーク通信部分を担当する奴等

https://wa3.i-3-i.info/word168.html

参考:ソケット – 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

さらにソケットを詳しく紹介した記事です。
参考:ソケットプログラミング HOWTO

TCPとUNIXドメインソケットの違い

  • 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 の実行環境を構築する

合わせて読んで欲しい記事

UT
UTの日常

1985年生まれ1児の父親です。ブログとか副業で収入を得る手段を模索中であります。(無理しない程度が理想wだから実績が出ないorz)
UTのプロフィール
Amazon欲しいものリスト

2019年5月29日システムNginx,PHP,プログラム入門

Posted by UT