/etc/hosts に異なる IP アドレスを持つ複数のホスト名エントリがある場合、どのような動作が予想されますか?

/etc/hosts に異なる IP アドレスを持つ複数のホスト名エントリがある場合、どのような動作が予想されますか?

この件については議論されているが いくつかの 場所、しかし、まだ決定的な答えはないようです - 少なくともRHEL 6については。誰かが指摘してくれることを期待していますどうやって動作しているので、少し掘ることができます。

短縮版:パブリック IP アドレスを持つ OpenVZ ホスト ノードがあり、これはプライベート 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.13010.0.0.131しかし、どのソフトウェアがこれを実行しているのかをどうしても見つけることができません。Apacheですか?HNのネットワークシステムの何かですか?他の何かですか?動作しているようですが、それが機能するかどうかについては意見が大きく分かれているようですので、理由/方法についてもっと知りたいです。すべきまったく機能しません。明確に言うと、ここではラウンドロビンや負荷分散を求めているわけではありません。OpenVZ コンテナーから別のコンテナーへの単純な手動切り替えだけを求めています。

ロングバージョン: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

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

` サーバー名 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 自体が「動作中の」コンテナーを選択しているわけではないと考えられます。これで、(もちろん実際のドメイン名を使用して) を参照でき、Apache は、稼働中のまたはhttp://testbackup.xxx.yy/のいずれかに要求をルーティングするようです。OpenVZ コンテナーを一時停止/再開するだけで、それらを切り替えることができます。10.0.0.13010.0.0.131

これが機能するとは思っていませんでしたが、機能するのはうれしいことです。私の質問は、これが機能するべきかどうかです。これは信頼できるものですか? それとも、どこか他の構成ファイルに入り込んだ余分な部分が整理されると、機能しなくなる単なる偶然でしょうか?

答え1

ホストは複数の IP アドレスを持つことができるため、ここで表示される動作は想定どおりです。これは、bossman、haus、jungle-jim などの複数のニックネームを持つようなものです。私を知っている人なら誰でも、これらが私のニックネームであることを知っています (ただし、実際のニックネームではありません)。

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

例1

これらのIPアドレスはすべてテストバックアップ.xxx.yyつまり、アクセスしようとするとテストバックアップ.xxx.yy、リクエスト時にどの IP アドレスがアクティブ/応答しているかに応じて、いずれか 1 つにアクセスします。繰り返しますが、これは、アクセスしようとしているサービスがその IP アドレスに特に結び付けられていない場合にのみ機能します。

しかし、もしあなたが10.0.0.133、リソースにアクセスしようとしました具体的には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)。

ここに画像の説明を入力してください

関連情報