PoundでReverse Proxy環境を構築してHTTPとRTMPTを共存
2009.03.04 / develop
(2009/03/04 22:55追記) typesterさんから
mod_proxyでできるんじゃないのかな
なコメントをいただきましたが、ご指摘とおり、mod_proxyだけでも共存は可能だと思います。今回は試験的な意味もこめてPoundを使って環境構築をしましたが、おいおいmod_proxyも試してみたいと思っています。(ここまで追記)
Wowza Media ServerなんかのRTMPサーバは、標準の1935番ポートへの接続ができないクライアントのために、HTTPでカプセル化した通信(RTMPT)を受け付けるために、80番ポートでの待ち受けが可能です。(さらにSSL化した443番ポートでの通信RTMPSなんかもあります)
ただ、1台のマシンでWebサーバと共存させる場合、80番ポートが競合するのでこのままではうまく共存できません。そこで、Reverse Proxyを利用してHTTP, RTMPTそれぞれのアクセスを別ドメインへのアクセスとして、自身のHTTP, RTMPT待ち受けポートを80番以外のものにしてあげると共存が可能になります。たとえば、ポート番号をReverse Proxy=80, HTTP=81, RTMPT=82なんかにして、Reverse ProxyがHTTP, RTMPTをそれぞれのサービスに振り分けてあげればいいわけですね。
さて、こんな環境を構築しようと思って「Reverse Proxy何にしよう?Squidとか使えば言いわけ??」と思って@kawatasoに相談したところ、「それPoundでできるよ」とアドバイスをもらいました。Poundは初めて使ったのですが、単純なReverse Proxy環境を構築するにはものすごく簡単に実現できました。と、いうわけで今回はその構築メモを残しておきたいと思います。環境はFedora9です。
Poundのインストール
まず、Poundのビルドに必要な次のものをインストールします。
$sudo yum -y install openssl-devel $sudo yum -y install pcre-devel $sudo yum -y install google-perftools-devel $sudo yum -y install rpmbuild
Poundはソースのrpmが公式サイトにあります。
これをDL後、ビルド、インストールします。
$ sudo /usr/bin/rpmbuild --rebuild pound-2.4.4-1.src.rpm $ cd /usr/src/redhat/RPMS/i386 $ sudo rpm -ivh pound-2.4.4-1.i386.rpm
インストールしたら、サービスにも登録しておきましょう。
$ sudo /sbin/chkconfig pound on
mod_rpafの導入
いきなりPoundの話でもいいのですが、その話はもう少し後にしましょう。
Reverse Proxyを導入すると、Apacheのログがクライアントからのアクセスではなく、全部Reverse Proxyからのアクセスになってしまってしまいます。これは、ログとしては好ましくないので、まずはこれを回避します。方法は簡単で、mod_rpafを導入すればOKです。
Apacheのモジュールのインストールは、apxsが必要になりますが、これはhttpd-develがインストールされてある必要があります。
$ sudo yum -y install httpd-devel
その上で、ソースを公式サイトからDLしておきます。
$ wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz $ tar zxf mod_rpaf-0.6.tar.gz $ cd mod_rpaf-0.6
その後、Makefileを修正します。Apacheは2.x系が入っていることとします。先頭のAPXS2の実際の場所を指定してあげます。
APXS2=/usr/sbin/apxs
その後、Apache2.x系用のmake, make installを行います。
make rpaf-2.0 sudo make-install-2.0
ここで、mod_rpafを有効にするため、/etc/httpd/conf.d/ にrpaf.confの名前で次の内容のconfファイルを作成しておきます。ここでは、Reverse Proxyの場所を指定していますが、Reverse Proxyは同一マシン上に存在している前提で、127.0.0.1の自分自身を指定しておきます。
LoadModule rpaf_module modules/mod_rpaf-2.0.so RPAFenable On RPAFsethostname On RPAFproxy_ips 127.0.0.1
Poundのログの場所を修正
Poundのログは標準では/var/log/messagesに出力されるので、messages がどんどん肥大化してしまいます。そこで、/var/log/pound に出力されるように変更します。
Fedora9では標準でrsyslogが起動しているかと思いますので、/etc/rsyslog.confを編集します。
# *.info;mail.none;authpriv.none;cron.none; /var/log/messages を *.info;mail.none;authpriv.none;cron.none;local1.none /var/log/messages # に変更 # 以下の行も追加 local1.* /var/log/pound
その後、rsyslogを再起動しておきます。
$ sudo /etc/init.d/rsyslog restart
Apacheの待ち受けポートの変更
/etc/httpd/conf/httpd.conf で、次のように待ち受けポートを変更しておきます。今回は81番ポートに変更します。
#Listen 80 これを次のように変更 Listen 81
RTMPTサーバの待ち受けポートの変更
Wowza Media Server では、/usr/local/WowzaMediaServer/conf/VHost.xmlを編集します。
<HostPort> <ProcessorCount>4</ProcessorCount> <IpAddress>*</IpAddress> <Port>80</Port> <SocketConfiguration> <ReuseAddress>true</ReuseAddress> <ReceiveBufferSize>24000</ReceiveBufferSize> <SendBufferSize>65000</SendBufferSize> <KeepAlive>true</KeepAlive> </SocketConfiguration> <HTTPProvider> <BaseClass>com.wowza.wms.http.HTTPServerVersion</BaseClass> <Properties> </Properties> </HTTPProvider> </HostPort>
の箇所をコメントアウトを外し、ポート番号を80 → 82に設定しておきます。
Poundの設定
やっとこさ、Poundの設定です。今回は、HTTPの通信はwww.katsuma.tv, RTMPTの通信はrtmpt.katsuma.tvとしてアクセスを受け付けることとします。実際のApacheは81番, RTMPサーバは82番ポートでの待ち受けを行っていることを想定しています。(DNSの設定は別途行っておく必要はあります)
ここでは、/etc/pound/pound.confを次のように書き直します。(pound.confは念のためバックアップしておくことをおすすめします)
User "nobody" Group "nobody" RootJail "/usr/share/pound" Control "/var/run/pound/ctl_socket" LogLevel 3 Alive 60 Daemon 1 LogFacility local1 # Main listening ports ListenHTTP Address 0.0.0.0 Port 80 xHTTP 1 End # Catch-all server(s) # Apache Service HeadRequire "Host: .*www.katsuma.tv.*" BackEnd Address 127.0.0.1 Port 81 End End # RTMPT Service HeadRequire "Host: .*rtmpt.katsuma.tv.*" BackEnd Address 127.0.0.1 Port 82 End End Service BackEnd Address 127.0.0.1 Port 81 End Session Type BASIC TTL 300 End End
上から読むと、そのまま理解できるかと思います。ListenHTTPのディレクティブでProxyとしては80番ポート待ち受け、Serviceディレクティブで内部サーバ(ここでは自分自身ですがもちろん他のサーバを指定することは可能です)のリクエスト先のホスト情報、サーバアドレス、サーバポートを指定します。
先頭のLogLevelは次のとおりです。
- 0 - no logging
- 1 - normal log
- 2 - full log
- 3 - Apache combined log format
- 4 - Apache combined log format without virtual host
LogFacilityについては、先に書いたrsyslogとの兼ね合いですね。その他の情報についてはman poundを見られるのが一番よいかと思われます。
サービスの再起動
これで全部準備は揃ったので、全サービスを再起動します。
$ sudo /etc/init.d/httpd restart $ sudo /etc/init.d/WowzaMediaServer restart $ sudo /etc/init.d/pound start
これで、HTTPとRTMPTを1台のマシンでハンドリングさせることが可能になりました。
まとめ
今回は実質Pound以外の設定のほうが面倒なことが多かったかと思いますが、Pound自身の設定は簡単だったと思います。HTTPサーバとRTMPTサーバの共存、という形で設定を行いましたが、もちろんHTTPサーバの負荷分散という形での利用もOKです。(むしろそっちの利用方法のほうが今どきっぽく正しいはず)