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

2019年5月29日システムphp-fpm

どうもUT(@ut_1029)です。
PHP-fpmでプログラミングしているとあまり気にしていなかったんですが、PHP-fpm環境構築設定などするにあたり、何も知らないなぁっと自分で感じたので、基本的なことを調べることにしました。

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

これまでは、PHPの設定とかは
ただググってとりあえず動けばOK
って感じでした。

でも、
細かなチューニングや正しい設定となるとお手上げでした。。。

それで
少しでも理解できればと思い本記事を書きました。

今回、以下の事を中心に調べてみました。

  • PHP-fpmってなに?
  • CGIとかFastCGIってなに?
  • PHP-fpmPHPと何が違うの?
  • NginxPHP-fpmの連携ってどうなってるの?

などなど。

では、
PHP-fpmで知っておくべき知識について
まずはこちらから紹介します。

PHPとは

PHP : Hypertext Preprocessor
Webシステムの作成によく使われるプログラム言語のひとつ。

ポイントは

・pointプログラミング言語だよ
・pointスクリプト言語だよ
・pointWeb系のプログラムを作るときによく使われるよ

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

広く使われているオープンソースの汎用スクリプト言語です。
PHP は、特に Web 開発に適しており、HTML に埋め込むことができます。

https://www.php.net/manual/ja/intro-whatis.php

あと、
PHPの詳しい動作について書かれている記事がありましたので、紹介しておきます。

ちなみに
PHPは、インタープリタ言語コンパイラ言語どちらでしょうか?

正解は、
インタープリタ言語
です。

コンパイラ言語

コンパイラ言語は、プログラム作成後にコンパイルを行う必要があります。

インタープリタ言語

インタープリタ言語は、プログラムを実行する度の機械語へ変換されます。
なので、コンパイルを行うこと必要がありません。

また
PHPには、モジュール版CGI版の二種類があります。

これが、
PHP-fpmPHPの違いの第1歩です。

CGI版

Webサーバとは別のプロセスで実行される。

Webサーバとは別プロセスで動作ということは、実行する度にメモリのロードが必要となります。
その為、動作速度がモジュール版に比べて遅くなります。

モジュール版

WebサーバのプロセスのなかでPHPを実行する方法。
CGIに比べて動作速度が高速になります。

CGIとは

Common Gateway Interface の略。

すごくかみ砕くと
ホームページでプログラムを動かすための仕組み
だそうです。

つまりは

  • 掲示板サイト
  • ショッピングサイト
  • など

は、CGIの仕組みでプログラムを動かしているWebサイトになります。

ポイントは、
・pointWebサーバ上でプログラムを動かすための仕組みだよ
・pointWebサーバ上で(クライアントからの要求に応じて)動くプログラムを指していることもあるよ
・point動的にページを生成して返すよ

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

FastCGIとは

CGIの改良版で
Webサーバのプログラムを一度起動させたら、しばらくメモリ上へ保持し待機させる仕組み
だそうです。

一度起動させたプログラムを待機させることで
プログラムの起動や終了の処理を軽減させ、Webサーバの負荷軽減が期待できます。

一定期間待機しているプログラムはメモリ上に展開されます。

この用語のポイント
・pointCGIの改良版だよ
・point一度動き出したプログラムは、しばらくメモリ上に待機させるよ
・point起動/終了処理が減る分、CGIと比較して、処理の高速化と負荷の軽減が見込めるよ

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

PHP-FPMとは

FastCGI Process Managerの略。
つまり
PHPFastCGIで動作させることが出来るものになります。

PHP の FastCGI 実装のひとつで、
主に高負荷のサイトで有用な追加機能を用意しています。
以下のような機能があります。
・緩やかな (graceful) 停止/起動 機能を含む高度なプロセス管理
・異なる uid/gid/chroot/environment でのワーカーの開始、 異なるポートでのリスン、異なる php.ini の使用 (safe_mode の代替)
・標準出力および標準エラー出力へのログ出力
・opcode キャッシュが壊れた場合の緊急再起動
・高速なアップロードのサポート
・“slowlog" – 実行時間が非常に長いスクリプトの記録 (スクリプト名だけでなく、PHP バックトレースも記録します。バックトレースを取得するために、 ptrace やそれと同等の仕組みを使ってリモートプロセスの execute_data を読みます)
・fastcgi_finish_request() – 何か時間のかかる処理 (動画の変換や統計情報の処理など) を継続しながら リクエストを終了させてすべてのデータを出力させるための特殊な関数
・動的/静的 な子プロセスの起動
・基本的な SAPI の動作状況 (Apache の mod_status と同等)
・php.ini ベースの設定ファイル

http://php.net/manual/ja/install.fpm.php

Nginxとは

PHP-fpmといえば
Nginxで動作させるのが一般的っぽいので、Nginxについても少し触れておきます。

Nginxは、通常FastCGIを使っているみたいです。

そして
Nginxは、PHPプロセスとは別で動作するため、PHPの処理が高負荷になっても影響は、Apacheに比べて軽減されます。

ちなみに
初期設定では9000番ポートで起動するが、UNIXドメインソケットに変更することも可能みたいです。

PHP-fpmとNginxを連携させる(通信)にあたって

どういった設定を行っているのか具体的に理解していなかったので、改めて整理してみました。

ちなみに
TCPとかUNIXドメインソケットとかはまた詳しく調べようと思います。。。

TCP

ネットワーク上でマシンを越えてのプロセス間通信
・特定方法IPアドレス+ポート番号
・通信箇所他マシンと通信可

https://qiita.com/kuni-nakaji/items/d11219e4ad7c74ece748

NginxPHP-fpmのサーバが物理的に別の場合は、
TCPを利用する理由が分かった気がします。

PHP-fpmとNginxの設定例

※設定して実際に動かしてないのであくまで参考程度にしてください。

# $ 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
# $ 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;
}
$ 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ドメインソケット

・同じマシン上で動いているプロセスが通信を行うためのソケット。
・アドレス・名前空間としてファイルシステムを使用している。
・ファイルシステム内のinodeとしてプロセスから参照される。
・特定方法ファイル名で一致
・通信箇所自マシンのみ
・TCPソケット(INETドメインソケット)よりも遥かにスループットが優れてるらしい。

https://qiita.com/kuni-nakaji/items/d11219e4ad7c74ece748

PHP-fpmとNginxの設定例

※設定して実際に動かしてないのであくまで参考程度にしてください。

# $ 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
# $ 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;
}
$ 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について分かった気がしました。

ただ
まだまだ分からないことは、たくさんあるのでもう少し深掘りして行こうかなぁっと思います。

いつになるか分からないですが、その時はまたブログへ投稿します♪

参考サイト

記事作成でメインに参考にさせてもらった記事です。
他にも色々参考にしたサイトもありますが、紹介しておきます。

UTについて
UTの日常

当ブログの管理者UT(プロフィール)です。
無理せず投稿をモットーに頑張っています。なので、更新頻度は低いです。

フォローしてね!

2019年5月29日システムphp-fpm