skillup

技術ブログ

サーバー・ネットワーク

FastCGIに関して

投稿日:

nginxについて学習してきましたが、今回はphp-fpmについてです。

そもそもの構成

以前、nginxにも書きましたが、nginx自体はPHPを処理することはできないので、代わりにPHPを処理するソフトウェアが必要になってきます。

ざっくり示すと下記のような流れになるようです。

  1. nginxがリクエストをうけとる
  2. nginx→php-fpmに処理を流す
  3. php-fpmが処理をし、nginxに処理を変える
  4. nginxからユーザーにレスポンスを返す

http://qiita.com/niisan-tokyo/items/41eb20adafdae8633442#nginx—php-fpm%E3%81%AE%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2

PHPをApacheで処理する場合、mod_phpを用いて動作させるのが一般的でしたが、最近はphp-fpmが注目されています。

php-fpmはFastCGI形式で動作するPHPサーバーで、従来のApacheに任せたプロセス管理とはことなり、独自のプロセス管理を実装しています。PHP5.3.3以降はPHP自体に標準搭載されているようです。

CGIのメカニズム

そもそものWebサーバーの目的はクライアントからの要求に対して記憶装置に格納されているファイルを送り返すことです。

最初は静的なファイルが中心でしたが、現在では動的なファイルのやりとりをすることが一般的になりました。こういった動的なファイルの処理を行うために考え出されたプロトコルがCGI(Common Gate Interface)です。

しかし、下記のような問題点もありました。

  • 個々の要求ごとに別々のプロセスが起動されるため、メモリや各種コンテキスト情報は、要求ごとに失われてします。
  • プロセスの起動により、システムのリソースを大きく消費し、サーバーを圧迫する
  • Webサーバーとアプリケーションが別々のコンピューターで実行されるアーキテクチャはちょいムズイ

FastCGI

上記のような問題があるため、FastCGIという仕組みが考え出されました。

主に下記のようなメリットがあります。

  • 要求ごとにプロセスを起動するのではなく、複数の要求を処理することのできる永続プロセスを使う
  • Webサーバーとアプリケーションをソケット通信させることで、ネットワーク上の2つのコンピューター上で実行できる
  • ソケットベースのプロトコルなため、任意のプログラミング言語で任意のプラットフォーム上に実装できる

Nginx入門 P185~205

http://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc

ネットワークがらみになるとようわからん・・・

この仕組みを通してnginxはPHPを処理しています。phpを直接処理するのはphp-fpmになることが多いでしょう。
php-fpmについて

nginxでの設定に関して

まずnginxでphp-fpmが記載される場合どのように書かれるかを見てみましょう。

一般的に使われるディレクティブを見ていきましょう。

fastcgi_pass

FastCGIに処理が渡されるポートを記します。

phpの場合は 127.0.0.1:9000(TCP) かunix:/var/run/php-fpm/php-fpm.sock(unixソケット通信)のどちらかが選択されることが多いようです。
違いは下記参照
http://qiita.com/kuni-nakaji/items/d11219e4ad7c74ece748

TCPソケット通信で処理を行う場合は fastcgi host:port(今回はこのケース)のように書かれることが一般的です。

fastcgi_index

FastCGIサーバーは自動インデックス付与をサポートしていない。そこで、要求されたURIの末尾が/ならNginxがfastcgi_indexの値を末尾にサポートする

fastcgi_param

FastCGIに渡される要求をkey=value形式で設定します。全てのFASTCGI要求で必ずSCRIPT_NAMEとQUERY_STRINGの2つの引数が必要になります。

SCRIPT_FILENAMEは直接実行されるプログラムです。もし値を見たい場合は$document_rootやfastcgi_script_nameをデバッグしてみてみるとよいでしょう。
(例 $document_root = ‘var/www/html/’   $fast_cgi_script_name =’public/sample.php’)

http://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc

-サーバー・ネットワーク
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

ネットワークコマンド

ネットワークのコマンドはping以外ほとんど知らないんですけど、それ以外に最近少し覚えたネットワークコマンドなどについて。 適切な使い方などはまだようわかっとらんです・・・ Contents1 net …

no image

クロスサイトスクリプティング(XSS)

これまた非常によく聞く攻撃方法ですね。 Contents1 クロスサイトスクリプティングとは?2 被害3 対策 クロスサイトスクリプティングとは? 動的なページの表示生成の際に悪意のあるスクリプトを埋 …

no image

インメモリデータベース redis

インメモリデータベースのredis(レディース)について。 キャッシュとして以前はmemcachedを使っていましたが、いろいろ多機能ということでredisをちょっと触ってみようかと。 Content …

no image

メールの文字化け対策

メールの文字コードに関して、色々ごまかしながらやってましたが真面目に取り組む必要があり、ここでメモ。 Contents1 前提条件2 ヘッダー部分3 メール本文3.1 Content-Transfer …

no image

herokuネタ(頻出コマンドなど)

10月末ぐらいから使っているPaasのherokuについてよく使うコマンドについて Contents1 アカウント開設&スタート2 基本的な使い方 アカウント開設&スタート http://skill- …