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です。(むしろそっちの利用方法のほうが今どきっぽく正しいはず)

参考

手軽なロードバランサ Pound を導入してみました