Nginx を使用した単一ドメインで利用可能なアプリケーション サービス

Nginx を使用した単一ドメインで利用可能なアプリケーション サービス

私は Digital Ocean にサーバーを持っており、これを使用して複数の Docker コンテナーをデプロイし、リバース プロキシを使用して Nginx でそれらをホストしています。

私のサーバーには 2 つのドメインがリンクされています (単一のパブリック IP)。domain1.com と domain2.com という名前を付けます。

現在、Docker 上で 2 つのサービスが実行されています。Postgres (ポート 5432) と MySQL (ポート 3306) です。

リバース プロキシを設定して、domain1.com を localhost:5432 に、domain2.com を localhost:3306 に変換します。

server {
  listen        80;
  server_name   domain1.com;

  location / {
    proxy_pass  http://localhost:5432;
  }
}

server {
  listen        80;
  server_name   domain2.com;

  location / {
    proxy_pass  http://localhost:3306;
  }
}

ここで気になるのは、domain1.com:3306 にアクセスしようとすると、望まない接続が機能することです。各ドメインには、割り当てられたサービスからのみアクセスできるようにしたいのです。

たとえば、外部から domain1.com:5432 への telnet は機能しますが、domain2.com:3306 への telnet は機能しません。

誰か助けてくれませんか?

答え1

あなたはあなたのマイスクインスタンスはローカル (コンテナ ホスト) のみでリッスンするように設定されるため、エンド ユーザーは外部からアクセスできず、nginx とその他のローカル プロセスのみがアクセスできるようになります。

そのためには、正しい設定でイメージを再構築するだけです。マイ.cnf:

FROM mysql
COPY custom.cnf /etc/mysql/my.cnf

または、イメージを再構築せずに(実行前に)次のようにします。

docker run -v <path_to_custom.cnf>:/etc/mysql/conf.d

どこマイ.cnf次の設定が含まれている必要があります:

 bind-address=<host_ip>

同じことがポストグレ

編集1: 前回のコメント以降:

server{
  listen        3306;
  server_name   domain2.com;
  return 403; 
} 

逆に、トラフィックをブロックすることもできますnginxレベルですが、トラフィックを完全にブロックしてカーネルで処理されないようにしたい場合、例えばtelnetが接続拒否を表示するようにするには、レイヤー3iptables

関連情報