ようこそゲストさん

Magical Diary, beta version

[Apache] mod_perl用Apacheを分離

2007/07/22 15:11 HIRATA Yasuyuki

Perlを高速に動かすためにはApache HTTPDにmod_perlを組み込むが、mod_perlを読み込んだApacheはメモリを大量に消費する。このため、本格的なサービスを行う場合にはバックエンドでmod_perl用の専用サーバを動作させるが、そこまで用意しなくてもmod_perlだけは分離したいという要求は多い。ここでは、1つのサーバ内でApacheを複数動作させ、mod_perlを分離する方法を以下に解説する。

設計

  • 通常 (mod_perlなし) のApache (a) は *:80 で待ち受け。
  • Apache + mod_perl のApache (b) は 127.0.0.1:8000 で待ち受け。
  • 共通する設定は別ファイルに書いておいて、それぞれの設定ファイルから Include する。
  • アクセスは一度 (a) で受け取って、特定のパスに対しては (b) に逆プロクシする。
   the net
     | ^
     v |
+-----------+
| *:80      |
| Apache(a) |
+-----------+
     | ^  reverse
     v |  proxy
+-----------+
| L:8000    |
| Apache(b) |
+-----------+

設定

  1. 現在利用している httpd.conf を共通設定ファイルとしてファイル名を変更する。
    # cd /usr/local/etc/apache
    # mv httpd.conf httpd.common.conf
    
  2. /usr/local/etc/apache/httpd.conf を下記内容で作成する。これは /myapp/ 以下を mod_perl を組み込んだ Apache に対するプロクシアクセスとする例である。
    Include /usr/local/etc/apache/httpd.common.conf
    ProxyRequests Off
    ProxyPass /myapp/ http://localhost:8000/myapp/
    ProxyPassReverse /myapp/ http://localhost:8000/myapp/
    
  3. /usr/local/etc/apache/httpd.mod_perl.conf を下記内容で作成する。この例では、/myapp/ 以下で Catalyst の MyApp を動作させている。
    Include /usr/local/etc/apache/httpd.common.conf
    Listen 127.0.0.1:8000
    PidFile /var/run/httpd.mod_perl.pid
    ScoreBoardFile /var/run/httpd.mod_perl.scoreboard
    ErrorLog /var/log/httpd/mod_perl/error.log
    CustomLog /var/log/httpd/mod_perl/access.log combined
    AddModule mod_perl.c
    <Location /myapp/>
      <Perl>
        use lib qw[/www/app/MyApp/lib];
      </Perl>
      SetHandler perl-script
      PerlHandler MyApp
    </Location>
    
  4. サーバ (a) は今までどおり起動されるが、サーバ (b) は別途起動スクリプトを用意する必要があるので、/usr/local/etc/rc.d/apache.mod_perl.sh を作成する。
    # cd /usr/local/etc/rc.d
    # sed 's/apache/apache_mod_perl/g' apache.sh > apache.mod_perl.sh 
    # vi apache.mod_perl.sh
    # chmod 555 apache.mod_perl.sh
    
    viでは以下を書き換える。
    apache_mod_perl_flags="-f /usr/local/etc/apache/httpd.mod_perl.conf"
    apache_mod_perl_pidfile="/var/run/httpd.mod_perl.pid"
    
  5. /etc/rc.conf に下記内容を追加する。
    apache_enable="YES"
    apache_mod_perl_enable="YES"
    
  6. Apache (a) を再起動、Apache (b) を起動する。
    # /usr/local/etc/rc.d/apache.sh restart
    # mkdir /var/log/httpd/mod_perl/
    # /usr/local/etc/rc.d/apache.mod_perl.sh start
    

以上の設定により、http://server/myapp/ 以下へのアクセスが、mod_perl 側サーバへのプロクシアクセスとなる。

問題点

  • 1つのサーバ内で複数のApacheを起動するため混乱しやすい。
  • Apache (b) では常に REMOTE_ADDR が 127.0.0.1 となる。このため、HTTP_X_FORWARDED_FOR を参照するか、Apache (a) 側で処理を行う必要がある。

mod_rewrite

mod_rewriteを使用して逆プロクシを設定する場合には、下記のように設定する。これは、/moe/*.cgi についてのみ Apache (b) へのプロクシを実施する。ディレクトリ単位で設定すると、プログラム以外の画像ファイルまで Apache (b) で処理されることもあるため、mod_rewrite で処理するほうが望ましいと言える。

RewriteEngine on
RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 9
RewriteRule ^/moe/([^/]+\.cgi)$ http://localhost:8000/moe/$1 [P]


#  非公開コメント   

  • TB-URL(確認後に公開)  http://diary.asuka.net/017/tb/
© 2007 HIRATA Yasuyuki <yasu@asuka.net>, all rights reserved