Studio3104::BLOG.new

uninitialized constant Studio3104 (NameError)

CGI,FCGIの中の変数を、apacheのLOGに安全に出す方法


Twitterでこんな発言をしていたら、apacheモヒカンの人たちが願いを叶えてくれました。
皆さん本当にありがとうございます。
@++, @++, @++

やりたいこと

・ mod_fastcgiな環境で動いているperlスクリプト内の変数を、apacheのLOGに安全に出力したい。
--> 『LogFormat "・・・%{HOGE}n"』のようにフォーマットを定義して、LOG出力したい。

まぁ要は、phpapache_note関数みたいなことをperlFCGIでやりたかったわけです。
PHP: apache_note - Manual


mod_copy_headerを使おう

mod_copy_headerを使えばやろうとしていたことがかなってしまいます。
@さんが書いてくれました。ありがとうございます!
kazeburo/mod_copy_header · GitHub

インストール

これだけ。簡単。

git clone http://github.com/kazeburo/mod_copy_header
cd mod_copy_header/
apxs -c -i mod_copy_header.c

mod_copy_header使用例

ユーザのIDをリクエスト毎にLOGに記録したい場合の使用例です。

CGIサンプル

まぁ適当にこんな感じで。FCGIでやりたいって書いてるのにCGIなのかよといった類のツッコミは棄却します。

#!/usr/bin/perl

use strict;
use warnings;
use CGI;

my $user_id = 12345;
my $q = CGI->new;

print $q->header(
  -type    => 'text/html',
  -charset => 'utf-8',
  -'X-UID' => $user_id,
);
print
  $q->start_html(-title=>'test mod_copy_header'),
  'mod_copy_headerのテスト',
  $q->end_html;
httpd.conf設定例

デフォルトのcombinedなLOGに追記するのであればこんな感じ。

LoadModule copyheader_module   modules/mod_copy_header.so

<IfModule copyheader_module>
  CopyHeaderActive On
  CopyHeader X-UID
</IfModule>
Header unset X-UID
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-UID}n" combined
CustomLog logs/access_log combined
出力サンプル

こんな感じでLOGが出るようになります。末尾にUIDが出ていますね。

xxx.xxx.xxx.xxx - - [06/Aug/2012:07:56:00 +0000] "GET /test.cgi HTTP/1.0" 200 370 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.57 Safari/537.1" 12345

ポイント

レスポンスヘッダはユーザに丸見えになってしまうので本来重要な情報を含めるべきではありません。
mod_copy_headerで任意のレスポンスヘッダをNotesにコピーし、Notesの内容をLOGに書き込み、コピー元のヘッダをmod_headersで消しているので、大変安全にスクリプトの変数をLOGに渡すことが出来て素晴らしいですね。

細かいことなどはこちらへどうぞ

モジュールの動作についてや、LOG出力の挙動については、@さんと @さんの記事で詳しく解説していただいております。
勉強させていただきました。ありがとうございます。
Apache上のPerl FastCGIはCustomLogにデータを書くことができるか?ついでにmod_perlでのお話 | #interest_ae
mod_copy_header ってのを書いた話 Re: Apache上のPerl FastCGIはCustomLogにデータを書くことができるか? - blog.nomadscafe.jp