• このエントリーをはてなブックマークに追加

2011-06-17 17:40 追記
kazeburoさんからご指摘をいただき,一部追記しました.ありがとうございます!

nginx とかでバックエンドのplackなアプリケーションにリバースプロキシするスタイルが,ようやく個人的にも定番になってきた今日この頃ですが,そういえば,アクセスログの冒頭に記録されるIPアドレスが「127.0.0.1」のままでした...orz

plackup --access-log=/path/to/access_log のようにせずに,psgiファイルで Log::DispatchPlack::Middleware::AccessLog とを明示的に利用し,また,クライアントのIPアドレスを記録するように書き換えたので,そのメモです.

use strict;
use Log::Dispatch;
use Plack::Builder;
 
my $logdir = '...';
 
my $logger = Log::Dispatch->new(
    outputs => [
        [
            'File',
            min_level => 'debug',
            max_level => 'debug',
            filename  => "${logdir}/access_log",
            mode      => '>>',
        ],
    ],
);
 
builder {
    ...
 
    enable 'AccessLog',
        format => "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"",
        logger => sub { $logger->debug( @_ ) };
 
    ...
};

2011-06-17 17:40 追記

kazeburoさんから Plack::Middleware::ReverseProxy の存在をご指摘いただきました.(あぁ,Middlewareをさがすという頭がスッカリ抜けていました><)

これを利用すると,builder { ... } の部分は,次のように書けます.

builder {
    ...
 
    enable_if { $_[0]->{REMOTE_ADDR} eq '127.0.0.1' }
        'ReverseProxy';
 
    enable 'AccessLog',
        logger => sub { $logger->debug( @_ ) };
 
    ...
};

シンプルになりました!

参考