レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

apache の FastCGI(mod_fcgid) で phpを動かしてみる

2011年5月23日 2015年5月16日
apache fastcgi php

前回の「apache で phpのモジュール版とcgi版の切り替えを行ってみる」でCGIの環境設定を行いました。 ここでは、更に一歩進んで、FastCGIを使ってみます。

FastCGI とは、
CGIの動作方法の仕様の一つである。プロトコルは公開されている。
CGI プログラムまたは SSI プログラムを実行する場合、通常は web サーバと同じユーザで実行されます。

CGIは、ユーザーから要求がある度に、プロセスの生成と破棄が行われる。大量の要求があればその分だけプロセスの生成と破棄が実施され、この事がパフォーマンスの悪化に繋がっている。
FastCGIは、プロセスをメモリ上に永続化させることで、その起動と終了にかかる時間をカットし、結果としてプログラム動作速度の向上およびサーバ負荷の低下が可能となる。最初にプロセスが実行された段階で、そのプロセスはメモリ上に格納され、次の要求に対してはそのメモリに格納されたプロセスを実行する。 (出典:Wikipedia)

・・・とWikipediaのサイトには記載があります。

つまりは、FastCGIは、CGIの動作方法の1つの方法で、通常のCGIプロセスは、無駄が多いので、キャッシュ機能を駆使して高速化を図りました・・・
という感じですかね。

PHPは、CGI版で動作させると phpinfo(); の出力情報に

Server API	CGI/FastCGI

と表示されます。

ここで、FastCGIと表示されることに注意してください。

これは、

今動作しているphpはFastCGIに対応していますよ

という意味です。

そのため、FastCGIを動作させるためのphpの環境は、既に整っていることを意味します。
後は、apache側の設定になります。
以降で、そのapache側の設定について簡単に解説してみましょう。

apacheのfcgidをインストールしましょう

apacheのFastCGIのためのモジュールは、2つあります。

  • fastcgi ( mod_fastcgi )
    – MTMで動作させた場合に問題があるといわれている
  • fcgid ( mod_fcgid )
    – 後発のFastCGIモジュールで、mod_fastcgiより高速で、mod_fastcgiの問題点を改善したといわれている

ここでは、速そうなfcgid ( mod_fcgid )をインストールしてみます。
CentOSなのでyumで簡単にインストールできます。

$ yum install mod_fcgid
Loaded plugins: downloadonly, fastestmirror

    :
    :

Installed:
  mod_fcgid.i386 0:2.2-11.el5


Complete!
$

と、こんな感じです。

インストールするとapacheのモジュール設定ファイル( /etc/httpd/conf.d/fcgid.conf )が自動的に作成されます。

# This is the Apache server configuration file for providing FastCGI support
# through mod_fcgid
#
# Documentation is available at http://fastcgi.coremail.cn/doc.htm

LoadModule fcgid_module modules/mod_fcgid.so

# Use FastCGI to process .fcg .fcgi & .fpl scripts
# Don't do this if mod_fastcgi is present, as it will try to do the same thing
<IfModule !mod_fastcgi.c>
    AddHandler fcgid-script fcg fcgi fpl
</IfModule>

# Sane place to put sockets and shared memory file
SocketPath /var/run/mod_fcgid
SharememPath /var/run/mod_fcgid/fcgid_shm

これについては、何も変更の必要はないと思います。

最新バージョンでは、パラメータ(ディレクティブ)名が変更になっています。
# This is the Apache server configuration file for providing FastCGI support
# through mod_fcgid
#
# Documentation is available at
# http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html

LoadModule fcgid_module modules/mod_fcgid.so

# Use FastCGI to process .fcg .fcgi & .fpl scripts
AddHandler fcgid-script fcg fcgi fpl

# Sane place to put sockets and shared memory file
FcgidIPCDir /var/run/mod_fcgid
FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm
変更前変更後
SocketPathFcgidIPCDir
SharememPathFcgidProcessTableFile
MaxRequestsPerProcessFcgidMaxRequestsPerProcess

apacheの仮想ホストでfcgidを使用するように設定しましょう

続けて、仮想ホストの設定 ( /etc/httpd/conf/httpd.conf ) を編集します。
例として、前回の「apache で phpのモジュール版とcgi版の切り替えを行ってみる」で使った、example.com を編集してみましょう。

<VirtualHost *:80>
	ServerName example.com
	DocumentRoot "/home/example"
	ServerAlias www.example.com
	<Directory "/home/example">
		Options FollowSymLinks Includes ExecCGI
		AddHandler fcgid-script .php
		FCGIWrapper /var/www/cgi-bin/php52 .php
		AllowOverride None
		Order allow,deny
		Allow from all
	</Directory>
</VirtualHost>

部分を追記すればOKです。
最初は、.php の拡張子 に対応した ハンドラをfcgidとします。
次は、.php の拡張子 に対応した CGI実行ファイルのパス(フルパス)を設定しています。
ここでは、フルパスを設定できますので、
/var/www/cgi-bin/php52 → /usr/bin/php-cgi
のように設定してもOKです。

最後にapacheを再起動でします。

$ /etc/init.d/httpd restart
httpd を停止中:                                            [  OK  ]
httpd を起動中:                                            [  OK  ]
$ 

FastCGI( fcgid )を使用してみましょう

まずは、apacheが起動したphp-cgiがあるか確認します。

$ ps aux | grep php
root      7805  0.0  0.2   5072   776 pts/5    R+   08:20   0:00 grep php
$ 

・・・と、apacheを再起動しただけなら、上記のように何のプロセスも動作してないのがわかります。

次に、wgetでphpファイルをアクセスしてみましょう。
例でいけば、http://www.example.com/info.php をwgetでアクセスすればOKになります。

$ wget http://www.example.com/info.php
--2011-05-19 10:54:00--  http://www.example.com/info.php
www.example.com をDNSに問いあわせています... 192.168.219.100
www.example.com|xxx.xxx.xxx.xxx|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 特定できません [text/html]
`info.php` に保存中

    [ <=>                                             ] 76,878      --.-K/s 時間 0.001s

2011-05-19 10:54:00 (16.6 MB/s) - `info.php` へ保存終了 [76878]

$ 

・・・と、正常にアクセスできたら、phpのプロセスを確認してみましょう。

$ ps aux | grep php
apache    7760  0.0  3.0 158712  9628 ?        S    08:13   0:00 /usr/bin/php-cgi
root      7795  0.0  0.2   5072   776 pts/5    R+   08:20   0:00 grep php

・・・と、/usr/bin/php-cgi のプロセスが動いてます。
プロセスが、ある程度の要求処理をはいてしまうまで、そのままphp-cgiプロセスが生きたままになります。

これが、FastCGIの特徴です。

suEXECで実行しているなら、php-cgi のプロセス所有者は、suEXECの実行ユーザになります。

ざっと、こんな感じですね。
FastCGIは、動作させるだけなら、簡単です。

ただ、PHPでは、APCなどとの競合やPHPの子プロセス管理について考え始めると、ちょっと大変になってきます。

apache のsuEXEC で phpを動かしてみるで説明したように php-cgi を動作させるためのスクリプトを設置する場合、よくある例が、以下のような感じです。
#!/bin/sh
PHPRC=/etc/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/bin/php-cgi
ここの各々のパラメータの意味は、以下のとおりです。
PHP_FCGI_MAX_REQUESTS : 指定された要求を処理するまでプロセス数
PHP_FCGI_CHILDREN : 同時起動する子プロセス数
これだと1つのphpを起動すると一気に8つの子プロセスが起動され、その8つのプロセスが5000件処理するまで終了しません。終了した場合は、次回の要求時に自動でphp-cgiのプロセスを再起動します。
(apacheを停止したら、php-cgiのプロセスは全て終了します。)
PHPの場合、どうしてもメモリが膨れ上がりすぎたり、リークの危険性をぬぐえませんから、このようにある程度処理したら、プロセスを入れ替えてあげる必要があるんですね。
FcgidMaxRequestsPerProcess
FcgidMaxRequestsPerProcessは、
mod_fcgidのパラメータで、1つのphp-cgiのプロセスが、どのくらい要求処理をしたら終了させるかというものです。

また、PHP_FCGI_MAX_REQUESTSは、
php-cgiのパラメータで、これもphp-cgi自身がどのくらいまで処理をするかを指定するものです。(何も指定しない場合は、500件まで処理して、終了します。)

ここで問題が発生することがあります。PHP_FCGI_MAX_REQUESTSを超えた処理を要求した場合、php-cgiは、超えたと判断したら、処理を無条件に終了します。つまり、500,503 のエラーを出力する場合があります。

それを回避するために、FcgidMaxRequestsPerProcessPHP_FCGI_MAX_REQUESTSの数値以下の数字を指定することで回避することが推奨されています。

この要求数を無駄なリソースなく効率的に処理させるためには、子プロセスを使うべきではないとされています。

mod_fcgidを利用する場合、PHP_FCGI_CHILDREN=0で子プロセスを無効にしなさいと言われるのは、このためです。

さらに、子プロセスを使えないことから、mod_fcgidは、APC(PHPのメモリキャッシュ機能)が有効活用できないという問題を含んでいます。

FastCGIと通常のCGIの処理速度の差は、どんなものだったか?

同じものをwgetで単純な計測を行った結果、
FastCGI : 0.001s
通常CGI : 0.004s

でした。
おおよそ10回やってみましたが、ほとんど変わりませんでした。
通常CGIでは、毎回、php-cgiのプロセスを起動しているようなものです。 それに対して、FastCGI(mod_fcgid)は、初回こそ、php-cgiのプロセスを起動しますが、以降しばらくは、同じプロセスを利用します。
そのことからも、この差は、当然のような気がしますね。

さあ、この結果をどう見ますか?
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

なぜ、Windowsでphp-cgiが自動で終了してしまうのか?(Windows+Nginx+php-cgi.exe)

Windowsで(L)AMP(Nginx,MySQL,PHP)インストールからWordPressを動かすまで で、Windows に (Apac ...

php-fpm は、php-cgi で代用できる

これまで、php-fpm による FastCGIの構築について書いてきました。 CentOS Scientific Linux : ...

apache の FastCGI(mod_fastcgi) + PHP-FPM で phpを動かしてみる(CentOS,ScientificLinux編)

今回は、apache + FastCGI(mod_fastcgi) + PHP-FPM でphpを動かしてみます。 以前の以下の記事が基本 ...

Nginx でPHPを動かす(php-fpmをバイナリパッケージ(rpm)を作成し、インストールする) [PHP5.2系の場合]

前回の「Nginxの最新版ソースから バイナリパッケージ(rpm)を作成し、インストールする」に続けて、nginxと一緒にPHPを動作させたいと ...

apache の FastCGI(mod_fastcgi) + PHP-FPM で phpを動かしてみる(Debian,Ubuntu編)

今回は、apache + FastCGI(mod_fastcgi) + PHP-FPM でphpを動かしてみます。 apacheをインスト ...


2 件 コメントがあります。 コメントを投稿する
  1. […] こちらのブログが参考になるかと思います。 apache の FastCGI(mod_fcgid) で phpを動かしてみる | レンタルサーバー・自宅サー… Apacheをマルチスレッド(worker)環境にしてPHP(CGI/FastCGI)を動かす – […]

  2. くりくり
    2014年5月28日, 1:47 PM

    会社のサーバーにapcと同時にmod_fcgidを導入してみました。
    apcのキャッシュがすぐクリアされる現象になやまされていましたら・・・。

    >さらに、子プロセスを使えないことから、mod_fcgidは、APC(PHPのメモリキャッシュ機能)が有効活用できないという問題を含んでいます。

    なるほど!!
    納得いきました。
    自分のサーバーで検証してみましたら、php5.5のOPcacheだった・・・。


コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.3228 [s]