Database JUNKY

MySQL,MariaDBを中心としたブログです

apache mod_proxy1つのグローバルIPを複数のWEBサーバで共有する

ざっくり話しますとここサイトは、一般のプロバイダから、動的なグローバルIPを1つ提供してもらって公開しております。今回はこの1つグローバルIPを利用して複数のドメインを、複数のサーバに振り分けて利用する方法を考えてみました。結果どれがベストだったかについては、文書の一番最後のほうに書いてあります。

このサイトはプロバイダからグローバルIPをひとつ使って、このサイトを公開しているわけでですが、当然通常の設定ですと外部から自宅のサーバに接続でき ないのでルータ側のポートを開放するわけなので、その場合、http通信を外部から内部のサーバに接続するために、80番のポートを開く必要があります。

たとえば、こちらの場合ですと、ルータの設定をこんな形で設定しております。

ポートマッピングでサーバを振り分ける

ポートマッピングの指定で、80ポートのリクエストがあったら、上記192.168.101.200 にパケットを転送する、みたいな説明になりますかね。これだけでLAN内にある、wwwサーバが 外部から接続できる状態になっているわけです。上記と同様、ルーターの設定で80ポートだけではなく、8080ポート、8888ポート、9999ポートとポート番号によって、異なるサーバ を指定すればそれぞれに振り分けることができます。例としてのイメージではこんな感じになります。

[code lang=text] http://www.s-quad.com/  → 192.168.101.200 の wwwサーバへ http://www.s-quad.com:80/ → 192.168.101.200 の wwwサーバへ http://www.s-quad.com:8080/ → 192.168.101.201 の wwwサーバへ http://www.s-quad.com:8888/ →  192.168.101.202 の wwwサーバへ http://www.s-quad.com:9999/ →  192.168.101.203 の wwwサーバへ [/code]

つまり、httpの待ちうけ(listen)ポートを上記のように変更すれば、それぞれの異なるサーバに、リクエストを振り分けられるわけです。

* メリット ルータのNAT変換を行うだけで、まったく異なるサーバにリクエストを振り分けることができる。 webサーバ側の設定はあまりいじる必要がない、しいてあげればhttpd.conf 上にある、下記を設定箇所を、ルータで設定したおのおのの、ポートと同じにすればいいです。

[code lang=text] #

Listen: Allows you to bind Apache to specific IP addresses and/or

ports, instead of the default. See also the ;VirtualHost

directive.

#

Change this to Listen on specific IP addresses as shown below to

prevent Apache from glomming onto all bound IP addresses.

#

Listen 12.34.56.78:80

Listen 80 [/code]

* デメリット URLにポート番号を指定しなくてはならない、ただし、80は、httpのデフォルト待ちうけポートなので指定しなくても良い 当たり前ですが、ルータの設定で、ポート 80 を複数のサーバに設定することはできない(ルータ側でどちらのサーバに振り分ければよいのかわからないので) 知人に案内するのが面倒(汗)僕のサイトは、http://www.s-quad.com:8888 だよ!(8888って何?って聞かれるだけならまだしもまず、聞いた人の記憶にポート番号の記憶はない)

バーチャルホストの設定をする

ポートで異なるサーバに振り分けるわけではなく、たとえばひとつのグローバルIPを利用して複数のドメイン保有するサイトを作っていき、それぞれが違うコンテンツを持っている形式にしたい場合には、apacheの機能のひとつバーチャルホスト などを利用するほうが得策です。例としては、こんな時に有効です

192.168.101.200 の wwwサーバ内で。。 http://www.s-quad.com (GIP:121.106.16.161)  → /var/www/html/main 配下をホームディレクトリに

http:/aaa.xyz.jp (GIP:121.106.16.161) → /var/www/html/aaa 配下をホームディレクトリに

http://bbb.xyz.jp (GIP:121.106.16.161) → /var/www/html/bbb 配下をホームディレクトリに

このような構成とった場合、まった違うコンテンツを、一台のサーバで持つことができます。どうすれば良いか?単純にapacheのhttp.confに以下を追記すればよいだけです。

[code lang=text] NameVirtualHost 192.168.101.200

VirtualHost 192.168.101.200 ServerName www.s-quad.com DocumentRoot /var/www/html/main ServerAdmin webmaster@www.s-quad.com ErrorLog logs/n_error_log TransferLog logs/n_access_log ;/VirtualHost

;VirtualHost 192.168.101.200 ServerName aaa.xyz.jp DocumentRoot /var/www/html/aaa ServerAdmin webmaster@www.s-quad.com ErrorLog logs/a_error_log TransferLog logs/a_access_log ;/VirtualHost

;VirtualHost 192.168.101.200 ServerName bbb.xyz.jp DocumentRoot /var/www/html/bbb ServerAdmin webmaster@www.s-quad.com ErrorLog logs/b_error_log TransferLog logs/b_access_log ;/VirtualHost [/code]

どうでしょうか?結構簡単にいくのではないでしょうか?

* メリット グローバルIPがひとつで、複数のドメインを持つことができ、それぞれ違うコンテンツを表示する設定が行える ルータ側のNAT変換もポートは、80番しか使わないので一つだけ開放すれば良い

* デメリット 複数サイトを立ち上げるわけなので、当然ながらWEBサーバに対する負荷は高い

リバースプロキシを利用する

正直なところバーチャルホストの対応だけで、ほとんどアクセスのないことサイトでは十分満足していたのですが、ひょんなところからインストールマニアックス の参戦が決定し、サーバが自宅に送られ、当然のことなのですが、Hyper-VWindows WEB Serverを立て、それを公開してといわれました

ん?まてよ?ポート80番はこのサイトで利用しているから、公開できないぞ?(汗)

さてどうしようと思いポート8080ならいいか?と個人的に思っていたら主催者側から80番ポート以外は認められないといわれる始末で、、このサイト自体細々と、8~9年続けていたらつぶしたくないなあ。。という気持ちから、

  • ポート 80 番で
  • バーチャルホストを利用して
  • Windowsサーバにリクエストを飛ばす

ことはできないかと思考錯誤した結果、apacheのモジュールでmod_proxyを利用すればできるのではないかと思いちょっと設定をいじってみました。 以下がhttpd.confの内容になります。以下箇所が追記、または編集した箇所になります。

[code lang=text]

Dynamic Shared Object (DSO) Support

To be able to use the functionality of a module which was built as a DSO you

have to place corresponding `LoadModule' lines at this location so the

directives contained in it are actually available before they are used.

Statically compiled modules (those listed by `httpd -l') do not need

to be loaded here.

Example:

LoadModule foo_module modules/mod_foo.so

LoadModule status_module modules/mod_status.so

LoadModule proxy_module /usr/lib64/httpd/modules/mod_proxy.so LoadModule proxy_http_module /usr/lib64/httpd/modules/mod_proxy_http.so

;VirtualHost 192.168.101.201 ServerName installmaniax.aaa.bbb KeepAlive Off ProxyPass / http://192.168.101.201/ ;/VirtualHost [/code]

バーチャルホストの設定にて、installmaniax.aaa.bbbからのリクエストがあった場合は、無条件に、192.168.101.201のWindows IISにリクエストを投げるという仕組みです、ただし単純な転送ではないのであたかも、192.168.101.200で動いているように見えて実は、192.168.101.201での情報を持ってきているといったイメージです。 これで上記で抱えていたデメリットの部分が改善され、現在複数のホストでコンテンツを振り分ける運用が実現できています。apacheってすごい!!!