PHP
FastCGI
nginx
Cgi
php-fpm

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

どうもUT(@ut_1029)です。

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

これまでは、PHPの設定とかは

ただググってとりあえず動けばOK

って感じでした。

でも、

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

それで

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

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


  • PHP-fpmってなに?

  • CGIとかFastCGIってなに?

  • PHP-fpmはPHPと何が違うの?

  • NginxとPHP-fpmの連携ってどうなってるの?

などなど。

では、

PHP-fpmで知っておくべき知識について

まずはこちらから紹介します。


ちなみに

この内容は自分のブログからの転載です。

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



PHPとは

PHP : Hypertext Preprocessor

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


ポイントは

pointプログラミング言語だよ

pointスクリプト言語だよ

pointWeb系のプログラムを作るときによく使われるよ

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

広く使われているオープンソースの汎用スクリプト言語です。

PHP は、特に Web 開発に適しており、HTML に埋め込むことができます。

PHP: PHPとはなんでしょう?


あと、

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

知っていますか?あなたの書いたPHPのコードが実行される4つのプロセス

ちなみに

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

正解は、

インタープリタ言語

です。


コンパイラ言語

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


インタープリタ言語

インタープリタ言語は、プログラムを実行する度の機械語へ変換されます。

なので、コンパイルを行うこと必要がありません。

また

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

これが、

PHP-fpmPHPの違いの第1歩です。

PHPのモジュール版とCGI版の違い


CGI版

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

Webサーバとは別プロセスで動作ということは、実行する度にメモリのロードが必要となります。

その為、動作速度がモジュール版に比べて遅くなります。


モジュール版

WebサーバのプロセスのなかでPHPを実行する方法。

CGIに比べて動作速度が高速になります。


CGIとは

Common Gateway Interface の略。

すごくかみ砕くと

ホームページでプログラムを動かすための仕組み

だそうです。

つまりは


  • 掲示板サイト

  • ショッピングサイト

など

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


ポイントは、


  • pointWebサーバ上でプログラムを動かすための仕組みだよ

  • pointWebサーバ上で(クライアントからの要求に応じて)動くプログラムを指していることもあるよ

  • point動的にページを生成して返すよ

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典



FastCGIとは

CGIの改良版で

Webサーバのプログラムを一度起動させたら、しばらくメモリ上へ保持し待機させる仕組み

だそうです。

一度起動させたプログラムを待機させることで

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

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


この用語のポイント


  • pointCGIの改良版だよ

  • point一度動き出したプログラムは、しばらくメモリ上に待機させるよ

  • point起動/終了処理が減る分、CGIと比較して、処理の高速化と負荷の軽減が見込めるよ

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典



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 ベースの設定ファイル

PHP: FastCGI Process Manager(FPM)



Nginxとは

PHP-fpmといえば

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

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

そして

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

ちなみに

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


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

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

ちなみに

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


TCP



  • ネットワーク上でマシンを越えてのプロセス間通信

  • 特定方法


    • IPアドレス+ポート番号



  • 通信箇所


    • 他マシンと通信可



調べなきゃ寝れない!と調べたら余計に寝れなくなったソケットの話


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ドメインソケット)よりも遥かにスループットが優れてるらしい。

調べなきゃ寝れない!と調べたら余計に寝れなくなったソケットの話



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

ただ

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

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

この記事の内容でおかしな点があればご指摘をお願いしますm(_ _)m

最後になりますが、

こちらの内容は以下の自分のブログへも投稿しています。

もし、気が向いたらブログも読んで見てください♪

ロゴ_100.jpeg

UTの日常


参考サイト

記事作成でメインに参考にさせてもらった記事です。

他にも色々参考にしたサイトもありますが、紹介しておきます。


ググるとこの記事がすぐに出るぐらいよく読まれている記事のようです。

今回の記事作成でメインで参考にさせてもらいました。

nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する

UNIXドメインソケット(ソケット通信)について

簡単にまとめてくれている記事。

調べなきゃ寝れない!と調べたら余計に寝れなくなったソケットの話