今回の最大の目的であるApacheでリバースプロキシをやります。グローバルIPアドレスが1つしかないので、今までこのブログサイトしか外部に公開できなかったですが、リバースプロキシで複数のサイトをインターネット側からも閲覧できるようにするのが目的です。 このサイトのテストサイトがありますので、本番サイトとテストサイトをインターネットから見えるようにしてみます。
また本番サイトであるWEBサーバは以前Apache2.2.15から2.4.7へ移行しており、2.2.15のWEBサーバがまだ残っているので、Apacheのリバースプロキシの機能によるロードバランサーで、2台の本番WEBサーバをロードバランシングしてみます。
サーバ構成
環境 | URL | ドメイン名 | ホスト名 | IPアドレス |
本番 | http://www.eastforest.jp/ | www.eastforest.jp | web1 | 192.168.1.10 |
本番 | http://www.eastforest.jp/ | www.eastforest.jp | web2 | 192.168.1.20 |
テスト | http://devwww.eastforest.jp/esthome/ | devwww.eastforest.jp | test | 192.168.1.30 |
以下、パス等はそれぞれの環境に置き換えてください。
Proxy関連のモジュールが有効か確認
# /usr/local/httpd-2.4.9/bin/httpd -M | grep proxy proxy_module (shared) proxy_connect_module (shared) proxy_ftp_module (shared) proxy_http_module (shared) proxy_fcgi_module (shared) proxy_scgi_module (shared) proxy_wstunnel_module (shared) proxy_ajp_module (shared) proxy_balancer_module (shared) proxy_express_module (shared)
Apache2.4.9構築 2で静的にインストールしたモジュール以外も有効になっているみたいです。httpd.confも一応モジュールが有効になっていることを確認してみます。
# vim -R /usr/local/httpd-2.4.9/conf/httpd.conf LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so LoadModule proxy_scgi_module modules/mod_proxy_scgi.so LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_express_module modules/mod_proxy_express.so
リバースプロキシ・ロードバランサーの設定
まずリバースプロキシの設定から。必要な設定はProxyPassとProxyPassReverseでいいかなと思います。
ディレクティブ | 内容 |
ProxyPass | URLをバックエンドサーバにマッピングする |
ProxyPassReverse | HTTPレスポンスヘッダー中のバックエンドサーバURLをProxyサーバのものに書き換える |
httpd.confは記述が多いので、管理しやすくするため別の設定ファイルを用意して取り込むようにします。
# cd /usr/local/httpd-2.4.9/ # mkdir conf.d # vim conf/httpd.conf # 追加 Include conf.d/*.conf
サイトが複数になるので、バーチャルホストを使用します。とりあえず一つだけ設定。
# vim conf.d/proxy.conf ProxyRequests Off <VirtualHost *:80> ServerName www.eastforest.jp ProxyPass / http://192.168.1.10/ ProxyPassReverse / http://192.168.1.10/ </VirtualHost>
結構試行錯誤するハメに。他のサイトや書籍で調べて"ProxyPass /esthome http://192.168.1.10/esthome/"とするのがいい気もしましたが、試しにこのサイトのURL"http://www.eastforest.jp/esthome/"ではなく"http://www.eastforest.jp/"でブラウザアクセスしてみるとプロキシサーバのドキュメントルートをみてしまい「It works!」というダサい表示がされてしまいます… 本来の動作としてはバックエンドサーバ(192.168.1.10)の「Forbidden」が表示されるのが正しいです。リクエストはすべてバックエンドに飛ばしたいので上記のような設定にしました。ProxyRequests Offでリバースプロキシとして機能します。(Onはフォワードプロキシ)
リバースプロキシが機能していることが確認できたので、ここでテストサイト側も設定を追加します。
# vim conf.d/proxy.conf ProxyRequests Off <VirtualHost *:80> ServerName www.eastforest.jp ProxyPass / http://192.168.1.10/ ProxyPassReverse / http://192.168.1.10/ </VirtualHost> <VirtualHost *:80> ServerName devwww.eastforest.jp ProxyPass / http://192.168.1.30/ ProxyPassReverse / http://192.168.1.30/ </VirtualHost>
ブラウザでそれぞれ画面表示を確認できたのでOK。続いて本番サイト側にロードバランサーの設定を追加します。
ProxyRequests Off # WordPress Producton Site <VirtualHost *:80> ServerName www.eastforest.jp ProxyPass / balancer://wpsite/ lbmethod=byrequests timeout=1 nofailover=On stickysession=PHPSESSIONID ProxyPassReverse / balancer://wpsite/ <Proxy balancer://wpsite/> BalancerMember http://192.168.1.10 loadfactor=5 BalancerMember http://192.168.1.20 loadfactor=5 </Proxy> </VirtualHost> # WordPress Developer Site <VirtualHost *:80> ServerName devwww.eastforest.jp ProxyPass / http://192.168.1.30/ ProxyPassReverse / http://192.168.1.30/ </VirtualHost>
balancer://wpsite/ | "wpsite"は任意の名前を指定し、<Proxy>ディレクティブでロードバランスするサーバURLを指定します。 |
lbmethod | ロードバランス方法の指定。byrequestsはリクエスト数の重み付けをする。他に転送量の重み付けのbytraffic、待機リクエスト数によるbybusynessがあります。 |
timeout | バックエンドサーバとのコネクションタイムアウト(秒)デフォルトは1秒 |
nofailover | Onの場合、バックエンドサーバがダウンした際にセッションを切る。バックエンドサーバがセッションレプリケーションをサポートしている場合はOffにする。 |
stickysession | スティッキーセッションの指定。セッション維持で必要。バックエンドサーバのアプリケーションがPHPならPHPSESSIONID、JavaならJSESSIONIDを指定する。 |
BalancerMember | バックエンドサーバのURLを指定 |
loadfactor | 負荷分散の重み付け。1~100で指定し、値が大きいほど使用頻度が多くなる。 |
確認はproxyとweb1、web2の各サーバにSSHログインして、シェルの画面を同時に表示させておき、tailコマンドでproxy→(web1 or web2)の流れでリクエストが来ていることを確認します。
# tail -f /usr/local/httpd-2.4.9/logs/access_log
今回は設定のURLやパスの最後に/(スラッシュ)をつけるかつけないかで結構ハマりました。
参考サイト:
http://httpd.apache.org/docs/2.4/ja/vhosts/
http://httpd.apache.org/docs/2.4/mod/mod_proxy.html
http://webos-goodies.jp/archives/51261261.html
http://d.hatena.ne.jp/rx7/20060829/p1
http://www.atmarkit.co.jp/ait/articles/0108/28/news001.html
参考