2011/05/14

さくらVPS c++でfcgi

さくらVPS: CentOS5.5でfcgiをインストールしてc++をFastCGIとして動かしてみます。




FastCGIとは、wikiから引用すると


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

とあり、サーバにアクセスがある度にCGIプロセスを立ち上げるのではなく、CGIプロセスを立ち上げたままにすることで、パフォーマンスを向上させるものです。


・fcgiのインストール
ソースをダウンロードしようとしたところ、FastCGIのサイトが変わって(?)ソースが見つからなかったのでrpmパッケージからインストールします。

wget http://download.fedora.redhat.com/pub/epel/5/x86_64/fcgi-2.4.0-12.el5.x86_64.rpm
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/fcgi-devel-2.4.0-12.el5.x86

yum install --nogpgcheck fcgi-2.4.0-12.el5.x86_64.rpm fcgi-devel-2.4.0-12.el5.x86_64.rpm


・mod_fcgidのインストール
apacheでFastCGIを使う為にmod_fcgidモジュールをインストールします。
wget http://www6.atomicorp.com/channels/atomic/centos/5/x86_64/RPMS/mod_fcgid-2.3.5-2.el5.art.x86_64.rpm
yum install --nogpgcheck fcgi-2.4.0-12.el5.x86_64.rpm fcgi-devel-2.4.0-12.el5.x86_64.rpm

/etc/init.d/httpd restart
インストールすると、設定ファイル/etc/httpd/conf.d/fcgid.confが作成されるので、
/etc/httpd/conf/httpd.confを設定する必要はありません。


・C++でfcgiを使う
設定ができたので、c++から呼び出してみます。

ファイル名:test.cpp
#include <fcgi_stdio.h>
#include <unistd.h> // getpid

int main()
{
    while ( FCGI_Accept () >= 0 )
    {
        printf( "Content-Type: text/html\n\n" );
        printf( "<html>\n" );
        printf( "<head><title>test</title></head>\n" );
        printf( "<body>Hello world. pid=%d</body>\n",
                getpid());
        printf( "</html>\n" );
    }

    return 0;
}


・コンパイル
g++ -o test.fcgi test.cpp -lfcgi

ブラウザから、test.fcgiを呼び出すと
[Hello world.pdi=プロセスのID]
と表示され、再読み込みをしてもプロセスのIDは同じままになります。



・ソースコードの説明
fastcgiとして動作するにはfcgi_stdio.hをincludeする必要があります。
(パスは/usr/include/fcgi_stdio.hです。)

fcgi_stdio.hはstdio.hをラップし、printf、freadなどの標準入出力関数をfastcgiとして動かします。

6行目ではFCGI_Acceptを使用し、リクエストがあった時にループ内の処理を行うようにしています。

8~13行目のprintfは、stdio.hのprintfではなく、fcgi_stdio.hのprintfを呼び出してHTMLを出力しています。

0 コメント:

コメントを投稿

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Blogger Templates