▼ [Apache] mod_perl用Apacheを分離
2007/07/22 15:11
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) |
+-----------+
設定
- 現在利用している httpd.conf を共通設定ファイルとしてファイル名を変更する。
# cd /usr/local/etc/apache # mv httpd.conf httpd.common.conf
- /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/
- /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> - サーバ (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"
- /etc/rc.conf に下記内容を追加する。
apache_enable="YES" apache_mod_perl_enable="YES"
- 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]
▼ コメント(0件)
- TB-URL(確認後に公開) http://diary.asuka.net/017/tb/
