web-dev-qa-db-ja.com

/ etc / hosts内の異なるIPアドレスを持つ複数のホスト名エントリの予想される動作は何ですか?

私はこれが議論されたことを知っています inseveralplaces ですが、まだ決定的な答えはないようです-少なくともRHEL6については。誰かが指摘できるかもしれないことを願っていますhowそれは機能しているので、少し掘ることができます。

ショートバージョン:OpenVZホストがありますNodeパブリックIPアドレスは、のリバースプロキシとして機能していますプライベートIPアドレスを持つOpenVZコンテナの束。同じ名前のコンテナを2つ作成しました(理由を知りたい場合は、以下の長いバージョンにスキップしてください)。HNの/etc/hostsにもこれらのエントリがあります(とりわけ)。

# Generated by make_clone.sh
10.0.0.130 testbackup.xxx.yy
10.0.0.131 testbackup.xxx.yy

OpenVZを使用して、これらのホストのいずれかをIDで一時停止/再開できます。リバースプロキシは、実行中のホスト(IPアドレス10.0.0.130または10.0.0.131など)にリクエストを魔法のようにルーティングしているようです。しかし、私は一生できません。これを実行しているソフトウェアのビットを調べます。それはApacheですか?HNのネットワークシステムにあるものですか?他のものですか?動作しているようですが、理由/方法について詳しく知りたいのですが、それが機能するかどうかについては意見の大きな違いがありますshouldまったく機能します。明確にするために、ここではラウンドロビンや負荷分散を探していません。1つのOpenVZコンテナから1つのOpenVZコンテナから別の。

Lomgバージョン:一連のOpenVZコンテナーを作成および管理するためのスクリプトをいくつか設定しながら、テンプレートを取得して新しいを作成するmake_clone.shというスクリプトを作成しました。コンテナ。スクリプトは、コンテナIDと目的のホスト名の2つのパラメータを取ります。それが行うことの1つは、コンテナに新しい10.0.0.* IPアドレスを割り当て、ネットワークを構成することです。そのうちの1つの要素は、ホストノードの/etc/hostsファイルにエントリを配置します。

これらのコンテナのバックアップ/復元スクリプトをテストしているときに、特定のコンテナが死んだふりをして、同じ名前の別のコンテナを起動し、バックアップを復元したいと思いました。元のコンテナを実際に削除するのではなく、vzctl stop 130を使用してオフラインにしました。次に、ID 131で、同じ名前の新しいコンテナを作成しました。それが起動したら、MySQLデータベースを復元し、それにアクセスできることを(ブラウザーを介して)確認しました-それはいくつかのカスタマイズでJoomlaを実行しています-そしてすべてが順調でした。

しかし、ホストノードの/etc/hostsに、次の2つのエントリがあることに気付きました(とりわけ):

# Generated by make_clone.sh
10.0.0.130 testbackup.xxx.yy
10.0.0.131 testbackup.xxx.yy

ホストNodeはリバースプロキシとしても機能します。ホストNodeのみが外部IPアドレスを持ち、そのApache構成はサブドメインをコンテナに効果的にマップします。 、/ etc/hostsの上記のエントリと同様に、httpdconfigには次のようなセクションもあります。

`ServerName testbackup.xxx.yy

    ProxyRequests Off
    <Proxy *>
            Order deny,allow
            Allow from all
    </Proxy>

    ProxyPass /server-status !
    ProxyPass / http://testbackup.xxx.yy/
    ProxyPassReverse / http://testbackup.xxx.yy/

    <Location />
            Order allow,deny
            Allow from all
    </Location>

`

私が説明しているシナリオでは、スクリプトが原因で実際​​にはこれらのセクションの2つになりますが、それらは同じです-IPではなくホスト名でコンテナを参照しているため、Apache自体ではないように思われます「動作中の」コンテナ。これでhttp://testbackup.xxx.yy/を参照できるようになり(明らかに実際のドメイン名を使用)、Apacheは10.0.0.130または10.0.0.131のどちらかが稼働している方にリクエストをルーティングできるようです。 OpenVZコンテナーを一時停止/再開するだけで、それらを切り替えることができます。

私はこれがうまくいくとは思っていませんでしたが、うまくいくのは素晴らしいことです。私の質問は、そうすべきですか?頼りにできますか?それとも、どこかで他の構成ファイルに入った綿毛が片付けられたときに動作を停止するのは単なるまぐれですか?

3
dsl101

ホストは複数のIPアドレスを持つことができるため、表示されるのは予想される動作です。ボスマン、ハウス、ジャングルジムなど、複数のニックネームを持っているようなものです。私を知っている人なら誰でも、それらが私のニックネームであることを知っています(実際には私のニックネームではありません)。

IPアドレスを介してリソースにアクセスしようとしない限り、システムは何も起こらなかったかのように機能するはずです。 (技術的に言えば、コンテナーで新しいIPアドレスを生成しても、それらのサービスがIPアドレスに関連付けられていない限り、サービスに影響を与えることはありません。あなたの場合、アプリがスムーズに実行されているので運が良かったかもしれません。 )

例:1つのホストに4つのIPアドレスを割り当てることができます。

10.0.0.130 testbackup.xxx.yy
10.0.0.131 testbackup.xxx.yy
10.0.0.132 testbackup.xxx.yy
10.0.0.133 testbackup.xxx.yy

Example1

これらのIPアドレスはすべてtestbackup.xxx.yyを指しています。つまり、testbackup.xxx.yyにアクセスしようとすると、それらのいずれかにアクセスします。リクエスト時にアクティブ/レスポンシブなIPアドレスによって異なります。繰り返しますが、これは、アクセスしようとしているサービスがそのIPアドレスに特に関連付けられていない限りのみ機能します。

ただし、ダウンした場合10.0.0.1、10.0.0.133からリソースに具体的にアクセスしようとした場合(つまり、http://10.0.0.133/)エラーが発生します。

更新:

Apache VirtualHostsを使用している場合:

<VirtualHost *:80>
DocumentRoot /www/example1
ServerName www.example.com

# Other directives here

</VirtualHost>

<VirtualHost *:80>
DocumentRoot /www/example2
ServerName www.example.org

# Other directives here

</VirtualHost>

この構成により、2つのサイトが同じIPアドレスとポートを使用できるようになります。これがVirtualHostsの設定方法である場合、VirtualHostsは自動ルーティングを処理します(理論的には、両方のServerNameフィールドを同じホストとしてリストした場合)。

あなたはOpenVZを使用していることを示しました。 OpenVZを使用すると、サイトを独立して実行できる場合がありますが、物理的には、すべて同じホスト上にあります。個々のVEに独自のホスト名を割り当て、そのホスト名にアクセスしようとしない限り具体的にはダウンしているときに、サイトがアップしていると予想される動作が得られます。

たとえば、OpenVZ/IPアドレスの1つに別のホスト名を割り当てた場合:

10.0.0.133 mybackup.xxx.yy

10.0.0.133を削除すると、mybackup.xxx.yyからはアクセスできなくなりますが、testbackup.xxx.yyからはアクセスできます(他のIPアドレスを経由するため)それはまだ稼働していて、testbackup.xxx.yyに関連付けられています)。

enter image description here

1
CIA