spawn-fcgiを使う

FastCGIについて調べていたらspawn-fcgiというものがあるのを知ったので、これを使ってみたメモ。

インストール

RPM

EPELに上がっているのでそれを利用する。

# EPELをリポジトリに追加している場合
yum install spawn-fcgi

# EPELをリポジトリに追加していない場合
# RPM URLを直接指定しちゃう
yum install https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/s/spawn-fcgi-1.6.3-5.el7.x86_64.rpm

ソースからビルド

EPELのspawn-fcgi(RPM)はいくつか共有オブジェクトを参照しているので、もしアプリケーションサーバがEPELのものをそのまま使えなそうであれば、共有オブジェクトを一切使用しないspawn-fcgiを作成する。
https://github.com/lighttpd/spawn-fcgi

# glibcの静的ライブラリ群をダウンロード
yum install gilbc-static

# 前処理
git clone https://github.com/lighttpd/spawn-fcgi.git
cd spawn-fcgi
./autogen.sh

export CFLAGS="-static"
./configure

# ビルド
make

ls -l src/spawn-fcgi
ldd src/spawn-fcgi

使い方

今回はPerlのFCGIを使ったスクリプトを使用した例。

FCGIスクリプトの準備

FCGIをインストールしておく。
spawn-fcgiは、あくまでFastCGIアプリケーションを生成しておくためのもので、CGIアプリケーションをFCGI化してくれるわけではないことに注意。

#!/usr/bin/perl

use FCGI;

my $req = FCGI::Request();
while($req->Accept() >= 0) {
    print "Content-type: text/html\r\n\r\n";
    print "<html><head></head><body>It works.</body></html>";
}

上記をtest.fcgiとして保存した場合、以下で起動する。

spawn-fcgi -a ${BIND_ADDRESS} -p ${BIND_PORT} -f $(pwd)/test.fcgi

スクリプトのパスはフルパスで指定する必要がある。

Apacheの設定

以下は未検証だが、おそらくこうすればできそう、ということを記しておく。

  • UNIXドメインソケットを使ってspawnした場合
    • mod_fcgidをインストール
    • “FcgidIPCDir ${PATH_TO_SOCKET}”を*.confに書く
    • http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#fcgidmaxprocesses
  • IP:Portでspawnした場合
    • mod_proxy_fcgiをインストール
    • “\’ProxyPass “/” “fcgi://${BIND_ADDRESS}:${BIND_PORT}/”‘を*.confに書く
    • https://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html

なお、spawn-fcgiで作成したプロセスにtelnetで動作確認をしようとしたら簡単にはできなそうだった。
FastCGIにはヘッダにバイナリデータが含まれているので、これをtelnetで実現するのが難しい。
https://wiki.wireshark.org/SampleCaptures#FastCGI_.28FCGI.29

コメントを残す

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