XREAでPHP以外のFastCGIは使えるのか

XREAはPHP版のFCGIをサポートしているが、他の言語でどうすればできるか。

必要な設定等の確認

まずXREAでのFastCGI実現方法を確認する。
Apacheには複数FastCGIのモジュールがあるが、.fast-cgi-bin/php.fcgiの内容からするにmod_fcgidで実現されていると思われる。
http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html

#!/bin/bash
PHPRC="php.ini"
PHP_FCGI_CHILDREN=1
PHP_FCGI_MAX_REQUESTS=10000
export PHPRC
export PHP_FCGI_CHILDREN
export PHP_FCGI_MAX_REQUESTS
exec /usr/local/bin/php

Apache側の設定

FastCGIとして特定の拡張子のプログラムを開始するには、上記公式ページにもあるように、以下の3行で実現できる。

AddHandler fcgid-script .php
Options +ExecCGI
FcgidWrapper /usr/local/bin/php-wrapper .php

上記はPHPに関するものだが、(1行目).phpファイルについてfcgid-scriptで処理することを決め、(3行目)環境変数をお好みに設定を行ってからFastCGIアプリケーションを開始するラッパスクリプトのパスを指定している。
(なお実際に実行するアプリケーションはそれ自体がFastCGI対応になっている必要がある)

例えば仮に全く同じことをPerlでやるなら以下のような感じになるだろう。

AddHandler fcgid-script .pl
Options +ExecCGI
FcgidWrapper /path/to/perl-wrapper .pl

もし環境変数をいじくる必要がなければ、3行目のラッパスクリプトを指定しなおす必要はなく、そのまま定義を削除することができる。
また2行目については、XREAをはじめすでにCGI実行権限が付与されていれば重ねて定義する必要はないので、敢えて書く必要もない。

CGI実行環境を実際にCGIを動かして調査

以下のコードをアップロードし実行してセットされる環境変数や参照可能なバイナリファイルを調査すべく、以下のCGIスクリプトを配置し実行。

#!/bin/sh

echo "Content-Type: text/html"
echo

cat <<HTML
<html>
<head><title>Index.CGI</title></head>
HTML

cat <<HTML
<body>
<h2>EnvVars</h2>
<ul>
HTML
env | while read _l
do
    _key=$(echo ${_l} | awk -F= '{ print $1 }')
    _value=$(echo ${_l} | awk -F= '{ print $2 }')
    echo "<li>${_key}<ul><li>${_value}</li></ul></li>"
done
cat <<HTML
</ul>
<h2>Bin in PATH</h2>
<ul>
HTML
echo ${PATH} | tr ":" "\n" | while read _l
do
    echo "<li>${_l}<ul>"
    ls -la "${_l}" 2>/dev/null | while read _m
    do
        echo "<li>${_m}</li>"
    done
    echo "</ul></li>"
done

cat <<HTML
</ul>
</body>
</html>
HTML

..ChaSenとかTeX、Mono、LibreOffice、ClamAVも入っていることが分かった。
(またHTTPSのリクエストは、ss1.xrea.comでSquidが待ち受けており、続くパスを解釈して適宜HTTPサーバにリクエストを送っていることも分かった)

PerlでFastCGIアプリケーションを作成、動作確認

手元で手っ取り早くできたのがPerlだったので、今回はPerlで実装。

例えば/virtual/${アカウントID}/public_html/fcgi/ディレクトリを作り、そこに.htaccessを以下の内容で作成する。

AddHandler fcgid-script .pl virtual

test_fastcgi_app.plを以下の内容で作成しアップロード、実行権限を付与する。

#!/usr/bin/perl

use strict;
use FCGI;

my $cnt = 0;

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

アクセスしてみると、同一プロセスが処理しているため”It works. (N times)”のNがアクセスのたびにインクリメントされて表示されて見えることが確認できる。

欠点としては、FCGIファイルを更新しただけではプロセスの再起動がなされないので、FTP DELETE⇒FTP PTU⇒chmod +xを毎回しなければならないところか。
FTPアップロードをバッチ処理でやらせるなら注意が必要。

コメントを残す

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