php-fpmやモジュール版PHPについて調べてみた

##はじめに
この記事はプログラミング初学者による備忘録用の記事であり、少しでも他の初学者のお役に立てればと思い書いています。

今回はphp-fpmについて基礎的な部分を調べてみました。
php-fpmについて調べると、モジュール版PHPとCGI版PHPという2つの存在がありましたので、そちらについても触れてみたいと思います。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

##php-fpm(FastCGI版PHP)とは
FPM ( FastCGI Process Manager ) は PHPのFastCGI実装のひとつで、 主に高負荷のサイトで有用な追加機能を用意しています。php-fpmはWebサーバーとは別のプロセス、PHP用の永続的なアプリケーションサーバーとして実行されます。

``例:`` 複数のユーザーが1つのWebサーバを共有している時
CGI版PHPで動作しているとXさんとYさんのプログラムは、別ユーザーとして実行されているので、お互いの干渉を防ぐことができる。この観点からCGI版はセキュリティや安定性が優れていると言えます。

>
``参考:``[PHP manual FastCGI Process Manager (FPM) ](http://php.net/manual/ja/install.fpm.php)
>

##モジュール版PHPとは
WebサーバーのプロセスのなかでPHPを実行する方法、少し詳しくいうと**ApacheのrootユーザーでPHPを実行する**方法です。
Webサーバー(Apache)のプロセスとして実行されるため、実行時に新しいプロセス(アプリケーションサーバー)が必要ありません。Apachaを使う場合、Apacheにモジュール(mod_php)を追加することで、アプリケーションサーバーの役割を持たせることができます。

``例:``複数のユーザーが1つのWebサーバを共有している時
モジュール版で実行される場合、XさんとYさんが作ったプログラムは、両方ともApacheのrootユーザーで実行されてしまいます。このような場合、XさんのプログラムがYさんのプログラムの実行を邪魔する可能性があると言えます。

>
``参考:``[PHP manual Apache モジュールとしてインストール](https://www.php.net/manual/ja/security.apache.php)
>

CGIやFastCGIなど、よく分からない単語が出てきたので調べてみると、、、


##CGIとは
Common Gateway Interface（コモン・ゲートウェイ・インタフェース、CGI）は、webサーバーがwebブラウザからの要求に応じてプログラムを動作させるための仕組みです。

ざっくりとした流れは

1. webブラウザからの要求を受信したwebサーバーで、CGIの仕組みによってプログラムを起動(Webサーバー上で直接プログラム処理をしない)
2. プログラムはwebブラウザから送られてきたデータやwebサーバー自身が持つデータなどからHTMLファイルなどを作成します。
3. その後、プログラムで作成されたコンテンツは、webサーバーを通してwebブラウザに送信されます。

このような仕組みのため、webサーバーからは毎回異なったコンテンツを送信することができます。

ちなみに、CGIから呼び出されるプログラムは``サーバーサイド・スクリプト``と呼ばれ、PHPやRuby、Pythonなどが該当します。

>
``参考:``[Web技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3-ebook/dp/B06XNMMC9S/ref=sr_1_1?adgrpid=110631046051&dchild=1&gclid=Cj0KCQiAs5eCBhCBARIsAEhk4r71xkTNrsIFymDB4eHCVWAGk6MnwXJEh2U47LSXaRgBpzuVEeZL0DoaAlK6EALw_wcB&hvadid=450581139328&hvdev=c&hvlocphy=1009524&hvnetw=g&hvqmt=e&hvrand=3495883152818696714&hvtargid=kwd-334312951121&hydadcr=15818_11177339&jp-ad-ap=0&keywords=web%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC&qid=1615197623&s=books&sr=1-1)
>

そして、**このCGIを改良したのがFastCGI**です。

##FastCGIとは
 役割自体はCGIと同じですが、CGIと比較すると**処理速度の高速化と負荷の軽減**が期待できる仕組みとなっています。

CGIでは、webブラウザからの要求に応じて起動したプログラムは、処理が終わり次第プログラム自体も終了します。
webブラウザからのリクエストが1回だけの場合、負荷などを考える必要はありませんが、大抵の場合はリクエストが何百回と繰り返されます。そのような場合、リクエスト毎にプログラムを起動、そして終了を繰り返していると非常に非効率でありwebサーバー側の負荷も増えます。

このような**非効率かつ負荷が増える状態を改善したのが、FastCGI**です。

FastCGIは、**一度起動したプログラムは一定時間、メモリ上で起動したままの状態にしておくことができます。**このような仕組みのおかげで、何百回とリクエストが来たとしても、プログラムを起動、終了する処理は1回で済むようになります。

>
``参考:``[FastCGI「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word12806.html)
>

##ざっくりとまとめると
``php-fpm(FastCGI版PHP)``
Webサーバー上で直接処理せずにCGIという仕組みを使うことで、プログラムを起動(アプリケーションサーバー)し処理を行い、webサーバーを通してwebブラウザの要求に応じる

``モジュール版PHP``
Apacheの拡張機能を使いwebサーバー上で直接処理をしてwebブラウザの要求に応じる

##CGI版PHPとモジュール版PHPどちらを選択すべきか
CGI版PHPとモジュール版PHPのどちらを選択するべきかについてですが、私なりの判断基準が定まっていないので明確に述べることはできませんが、参考サイトのグラフを見る限り、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/914600af-4d2f-5af5-1462-a1007bc12308.png)
>
``出典:``[boonex PHP](https://www.boonex.com/trac/dolphin/wiki/HostingServerSetupRecommendations#PHP) https://www.boonex.com/trac/dolphin/raw-attachment/wiki/HostingServerSetupRecommendations/hssr-benchmark.jpg
>

php-fpm(FastCGI版PHP)とモジュール版PHPでは、処理速度にほどんど差がないことが分かりました。

従って単純に速度を重視するのであれば、FastCGI版PHPかモジュール版PHPを選択するべきなのかなと思いました。(実際にはセキュリティ面を考慮して適宜選択すべきだと思います)

最終的にはその他の特性を考慮したり使用条件を決めた上で選定すべきだと思います。



##おわりに
個人的な開発ではセキュリティ面を重視したいので練習も兼ねてphp-fpmを使い、アプリケーションサーバとwebサーバーを作ることで、rootユーザーで管理されるのを避け、他のユーザーのプログラムに干渉しないようにしたいと思います。

php-fpmとはなんぞやと思い、色々と調べてみると、改めてプログラミングは奥が深いなと思わされました。

日々精進したいと思います。

##参考文献
[PHP manual FastCGI Process Manager (FPM) ](http://php.net/manual/ja/install.fpm.php)
[PHP manual Apache モジュールとしてインストール](https://www.php.net/manual/ja/security.apache.php)
[Web技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3-ebook/dp/B06XNMMC9S/ref=sr_1_1?adgrpid=110631046051&dchild=1&gclid=Cj0KCQiAs5eCBhCBARIsAEhk4r71xkTNrsIFymDB4eHCVWAGk6MnwXJEh2U47LSXaRgBpzuVEeZL0DoaAlK6EALw_wcB&hvadid=450581139328&hvdev=c&hvlocphy=1009524&hvnetw=g&hvqmt=e&hvrand=3495883152818696714&hvtargid=kwd-334312951121&hydadcr=15818_11177339&jp-ad-ap=0&keywords=web%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC&qid=1615197623&s=books&sr=1-1)
[boonex PHP](https://www.boonex.com/trac/dolphin/wiki/HostingServerSetupRecommendations)
[FastCGI「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word12806.html)
[nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する](https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)