PSGIミドルウェア
PSGIミドルウェアとは
PSGIアプリケーションとPSGIサーバの間にあり,Plack::Middleware
という名前空間のもとに実装され,
Plack::Builder
モジュールを利用すると,
use Plack::Builder;
my $app = sub {…};
$app = builder {
enable 'Plack::Middleware::Lint';
enable 'Plack::Middleware::StackTrace';
$app;
};
Plack::Builderが提供するbuilderブロックの中で,
以降ではプロダクション環境で使用されるPlack::Middlewareをいくつか紹介します。
Static ── 静的コンテンツの配信
Plack::Middleware::StaticはCSSやJavaScriptなどの静的コンテンツの配信を行うミドルウェアです。Plackのディストリビューションに含まれています。
builder {
enable 'Static',
path => qr!^/(css|js|img)/!,
root => '/path/to/public';
$app;
}
上記のような設定を行うと,
ただし,
AccessLog ── アクセスログの表示
AccessLogはその名のとおりアクセスログを出力するためのミドルウェアです。
builder {
enable "AccessLog",
format => "combined";
$app;
};
ログのフォーマットにはcombined
,common
,
AccessLogミドルウェアでApacheでサポートされる,%D
enable "AccessLog::Timed",
format => '%h %l %u %t "%r" %>s %b %D';
ログの出力先はデフォルトでは$env->{psgi.
が示すファイルハンドルになります。多くの場合は標準エラーです。ファイルに書き出すときはloggerオプションにコードリファレンスを渡します。
use File::RotateLogs;
my $logger = File::RotateLogs->new();
builder {
enable "AccessLog",
format => 'combined',
logger => sub { $logger->print(@_) }
$app;
}
File::RotateLogsはログファイルを指定した時間ごとに分割し,
ReverseProxy── アクセス元IPアドレスの取得
PSGIアプリケーションをApacheやnginxなどのリバースプロキシのもとで動作させた場合,$env->{REMOTE_
はリバースプロキシのIPアドレスとなります。同じホスト上にリバースプロキシがあれば127.
が格納されます。本来のクライアントのIPアドレスはどうなるかというと,X-Forwarded-For
というヘッダの末尾に追加されて送られてきます。X-Forwarded-For
ヘッダはRFCなどで定義されているヘッダではありませんが,
PSGIアプリケーションでは次のようなコードで,X-Forwarded-For
から取得できます。
my $xff = $env->{HTTP_X_FORWARDED_FOR};
my ($ip) = $xff =~ /([^,\s]+)$/;
Plack::Middleware::ReverseProxyはX-Forwarded-For
からIPアドレスを取得し,$env->{REMOTE_
の上書きのほか,
リスト4 reverse_
use Plack::Builder;
builder {
enable_if { $_[0]->{REMOTE\_ADDR} eq '127.0.0.1' }
'ReverseProxy';
$app;
};
X-Forwarded-For
ヘッダはクライアント側で簡単に詐称できてしまうので,X-Forwarded-For
を信用するようにしてください。
ServerStatus::Lite── サーバ状態の可視化
Starman,
ServerStatus::Liteにはいくつかオプションがあります。
builder {
enable "Lite",
path => '/server-status',
allow => ['127.0.0.1','192.168.0.0/16'],
counter_file => '/path/to/counter_file',
scoreboard => '/path/to/scoreboard';
$app;
};
path
にサーバの状態を表示するためのURIを指定し,allow
にそのURIに対してアクセス許可されるIPアドレスを指定します。もしIPアドレスが指定されていない場合,counter_
はアクセス数と総転送量を記録するためのファイルです。そしてscoreboard
にワーカプロセスの状態を記録するためのディレクトリを指定します。
HTTPクライアントでpath
に指定したURIにアクセスすると,
図4 server-status
$ curl http://localhost:5000/server-status Uptime: 1381942535 (23 seconds) Total Accesses: 3 Total Kbytes: 0 BusyWorkers: 1 IdleWorkers: 9 -- pid status remote_addr host method uri protocol ss 80060 _ 127.0.0.1 localhost:5000 GET / HTTP/1.1 14 80061 _ 127.0.0.1 localhost:5000 GET / HTTP/1.1 13 80062 _ 127.0.0.1 localhost:5000 GET / HTTP/1.1 13 80063 A 127.0.0.1 localhost:5000 GET /server-status HTTP/1.1 0 80064 .
図5は,