複数の処理サーバーからのすべての送信接続を単一の IP アドレス経由でチャネル化するというビジネス要件があります。
私たちの設定は次のとおりです。
当社には、受信 HTTP リクエストのロード バランサーとして機能する nginx サーバーがあります。さらに、複数の Web サーバーがあり、処理サーバーに接続し、処理サーバーは顧客のデータベースに接続します。
クライアント --> ロードバランサー --> Web サーバー --> プロセス サーバー --> データベース
クライアント <-- ロードバランサ <-- Web サーバー <-- プロセス サーバー <-- データベース
現在、データベースのホワイトリストに追加する必要がある IP アドレスのリストをお客様に提供しています。ただし、規模が拡大するにつれてこのホワイトリストは長くなり、お客様はホワイトリストを再度更新する必要が生じます。
希望する設定
この問題を回避するには、すべての送信接続を別の nginx サーバーに通して、処理サーバーの IP アドレスをマスクします。その結果、お客様がホワイトリストに登録する IP アドレスは 1 つだけになります。
クライアント --> ロードバランサー --> Web サーバー --> プロセス サーバー --> IP マスキング --> データベース
クライアント <-- ロードバランサ <-- Web サーバー <-- プロセス サーバー <-- IP マスキング <-- データベース
これは nginx だけで可能でしょうか。可能であれば、これを実現するにはどのような手順を踏む必要がありますか?
答え1
もう 1 つの解決策は、NAT を使用することです。この場合、マスキング サーバーは、ネットワーク アドレス変換が構成されたルーターになります。この場合、node.js 構成で顧客データベース IP を変更する必要はありませんが、すべてのプロセス サーバーでネットワーク (場合によってはルーティング構成) を変更し、NAT が構成されたゲートウェイを 1 つ用意する必要があります。
答え2
ご質問の内容は、nginx バージョン 1.9.0 以降で可能です。tcp (http ではない) プロキシのサポートが追加されました。1.9.13 以降では、udp プロキシも追加されました。https://www.nginx.com/resources/admin-guide/tcp-load-balancing/#upstream そしてnginx.ru/en/docs/stream/ngx_stream_proxy_module.html を参照してください。
難しいのは、(IP マスク nginx) の着信接続を区別して、どのデータベースに接続するかを決定することです。HTTP プロキシでは、ホスト名を使用できます。TCP プロキシでは、異なるポートまたは異なる IP アドレスでリッスンする必要があります。nginx.conf:
worker_processes 4;
error_log /var/log/nginx/error.log;
events { worker_connections 1024; }
stream {
server {
listen 3307;
proxy_pass client2.db.dev:3306;
proxy_buffer_size 16k;
}
server {
listen 3308;
proxy_pass client1.db.dev:3306;
proxy_buffer_size 16k;
}
}