Apache+mod_rewrite+mod_proxy+HTTP::Engineで外部アプリサーバ

2つ前のポスト では、HTTP::Server::Simple+HTTP::Engine で
スタンドアローンのアプリサーバを構築しました。
通常の Apache から Perl プログラム利用時のみこのアプリサーバを
呼び出すように、mod_rewrite と mod_proxy を組み合わせる方法まとめ。
FastCGI との違いは、Apache とアプリサーバ間の通信方式。
FastCGI では(今回の設定では)ソケット通信を使うのに対し、
↓の方式では HTTP でプロキシーしています。
 

1. Apache モジュールの設定

mod_rewrite と mod_proxy を利用する設定は以下の通り。(Debian の場合)
# cd /etc/apache2/mods-enabled
# ln -s ../mods-available/rewrite.load
# ln -s ../mods-available/proxy.load
# ln -s ../mods-available/proxy_http.load
# /etc/init.d/apache2 reload
モジュールは既にインストールされているので、設定で有効にするだけです。
 

2. .htacacess を書く

アプリサーバを呼び出したいパス /path/to/app/ に以下の .htaccess を置きます。
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/path/to/app/
RewriteRule ^ http://192.168.xxx.yyy:8080%{REQUEST_URI}?%{QUERY_STRING} [P,L]
1行目は、mod_rewrite を有効にしています。
2行目は、プロキシー対象となるパスを指定しています。
3行目は、接続先の URL を指定しています。
[P,L] はプロキシーで飛ばす場合のおまじないです。
 

3. config.yaml と run.pl を書く

config.yaml については、こちら のまま変更ありません。
アプリサーバ run.pl もそのままで動きますが、動作確認のために
少し変更してみます。
#!/usr/bin/perl

    use strict;
    use lib qw( http-engine );
    use YAML ();
    use HTTP::Engine;

    my $yaml = 'config.yaml';
    my $conf = YAML::LoadFile( $yaml );
    my $engine = HTTP::Engine->new( $conf->{global} );
    $engine->run();

sub request_handler {
    my $req = shift;
    my $hreq = $req->headers(); # HTTP::Headers
    my $uri = $req->uri();     # URI::WithBase

    my $hres = HTTP::Headers->new();
    $hres->header( 'Content-Type' => 'text/html; charset=UTF-8' );

    my $host = $hreq->header( 'X-Forwarded-Host' );
    my $path = $uri->path();
    my $query = $uri->query();
    my $body = "[HOST] $host [PATH] $path [QUERY] $query\n";

    my $res = HTTP::Engine::Response->new( headers => $hres, body => $body );
    $res;
};
ホスト名 $host に環境変数 $ENV{HTTP_HOST} は利用できないので、
HTTP::Headers オブジェクト から X-Forwarded-Host ヘッダを取り出します。
パス $path とクエリ $query は、URI オブジェクト から取得できます。
その他にも、HTTP::Engine::Request オブジェクト 経由で情報を取得できます。
 
※このサンプルでは、エスケープ処理とかは考えていません。
 

4. 試してみる

ウェブブラウザから
http://192.168.xxx.yyy/path/to/app/foo.html?bar
にアクセスしてみて、
[HOST] 192.168.xxx.yyy [PATH] /path/to/app/foo.html [QUERY] bar
が表示されれば成功です!
 
ブラウザ ⇒ Apache (mod_rewrite⇒mod_proxy) ⇒ アプリサーバ(HTTP::Engine)
 
という順で通信が繋がっています。
 
HTTP::Engine を使わずに他のアプリサーバを使う場合も同様ですね。
Apache とアプリサーバ(HTTP::Engine)間の通信は HTTP なので、
それぞれ別のマシンで動いていても OK です。
 
[参考]
HTTP::Engine のインストール ~ ServerSimple を試してみる手順
Apache+FastCGI +HTTP::Engine を使う手順 (Debian)
Apache+mod_rewrite+mod_proxy+HTTP::Engineで外部アプリサーバ

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック