lighttpd開発2日目

昨日まで色々lighttpdのモジュール開発について調べてましたけど、自分のやりたい事は「特定のURIリクエストに対して、対応レスポンスデータを返す」という単純なCGIプログラムなので、FastCGIで開発するほうが合ってる気がしてきた。
他にもFastCGIのメリットは色々あるらしく、

なのでここからの開発はFastCGIで開発することにします。
(折角調べたlighttpdモジュールの作り方が無駄に)

開発ライブラリなどのインストール

sudo apt-get install libfcgi-dev lighttpd

FastCGIプログラム

一番簡単と思われるリクエスURIをそのまま返すようなCGIを作ってみます
プログラムの中身

#include "fcgi_config.h"
#include "fcgi_stdio.h"
#include 

extern char **environ;

int main (int argc, char *argv[]) {
        int count = 0;
        while (FCGI_Accept() >= 0) {
                        printf("Content-type: text/html\r\n\r\n");
                        printf("%s\r\n", getenv("REQUEST_URI"));
        }
        return 0;
}

コンパイル

g++ -o test.fcgi test.cpp -lfcgi

サーバ(lighttpd)の設定(mod_fastcgiの有効化)

FastCGIプログラムを実行するには、

  1. 設定ファイルに書いておいてlighttpdと同時に起動させる方法、
  2. 別プロセスとして起動してlighttpdからUNIXドメインソケットとかで繋ぐ方法、

の2つがあるらしい。両方やってみましたが1番目の方が

sudo /etc/init.d/lighttpd restart

とコマンド1発で修正プログラムを起動できるので楽かな?
2番目の方法は参考リンク先をみて試してみてください

vi /etc/lighttpd/lighttpd.conf

#モジュールの追加
server.modules              = (
            "mod_fastcgi", ←これを追加

#mod_fastcgiの設定
fastcgi.server = (
    "/test.fcgi" => (  ←ここにアクセスしたときにCGI動作
        (
            "socket" => "/tmp/test.fcgi.2", ←CGIと通信するUNIXドメインソケット
            "bin-path" => "/home/user/test.fcgi", ←実際のfastcgiプログラム
            "check-local" => "disable",
            "min-procs" => 1, ←試験中なのでプロセスは1で固定
            "max-procs" => 1,
            "max-load-per-proc" => 50,
            "idle-timeout" => 360
        )
    )
)

サーバ(FastCGI)の起動

sudo /etc/init.d/lighttpd restart

これでhttp://localhost/test.fcgiとかにアクセスすれば動作するはず

メモ

URI文字列取得方法

char *uri = getenv("REQUEST_URI");

調べたい項目

200 OK以外のステータスの返し方とか