前景需要#
友達の家のネットワークが爆発した後、フロントエンドと API を同じマシンに移動せざるを得なくなりました。
しかし、ある日、ある人の神秘的なデバイスを使用してアクセスしようとすると、「アクセスが禁止されているか、API サービスに問題が発生しています」というエラーが表示されました。おそらく、フロントエンドがクライアントの User-Agent を持ってバックエンドにアクセスしているため、またはフロントエンドがバックエンドにアクセスする際に CDN に渡される IP に問題が発生しているため、私の抽象的な WAF が適切にブロックされました。
したがって、フロントエンドがバックエンドにアクセスするには、まず CDN にアクセスし、CDN がバックエンドに戻る必要があります。同じサーバー上にあるので、なぜこのような大回りをする必要があるのでしょうか。それで、この記事ができました。
省流#
ホストマシンの /etc/hosts
ファイルを Docker コンテナにマッピングします。
問題分析#
Mix-Space のフロントエンドとバックエンドは、現在どちらも Docker で実行できるため、手間を省くために両方を Docker で実行しています。
フロントエンドの API は、.env
ファイルの NEXT_PUBLIC_API_URL
で提供されます。これが最も重要な部分です。
Docker コンテナ内では、127.0.0.1 は現在のコンテナ自体を指しますが、フロントエンドコンテナにはバックエンドは実行されていないため、127.0.0.1 に設定することはできません。
では、バックエンドコンテナの IP に設定すればいいのではないでしょうか?フロントエンドページの一部のシナリオでは、この URL を明示的に使用する必要があるため、サーバー上の内部アドレスに直接設定してユーザーにアクセスさせることは現実的ではありません。したがって、この方法は適切ではありません。
誰かが 2 つのコンテナを同じネットワークに配置することを提案しましたが、前の問題に戻ってしまいますので、これは適切ではありません。
IP は使用できないため、ドメインを使用する必要があります。そのため、ドメインをターゲットコンテナの IP に固定することができます。
ただし、コンテナは再起動するたびに IP が変わるようです(?ただし、docker bridge ネットワークのゲートウェイは常にホストマシンを指しているため、後ろのコンテナの Web サービスのポートをホストマシンにマッピングし、nginx を使用してポート 80 にリバースプロキシすることができます。そして、ドメインをホストマシン上の bridge の IP に指定します。これにより、2 つの問題が解決されます(確信しています)。
解決の過程#
まず、Docker のブリッジネットワークのゲートウェイを取得する必要があります。
サーバーターミナルで ifconfig
を入力し、docker0
という名前のネットワークカードを探します。これがそれです。
次に、inet
に対応する値(つまり 172.17.0.1
)がゲートウェイです。
curl でテストすることができます。ホストマシンで nginx を実行しているので、curl の結果は nginx のデフォルトページです。つまり、このアドレスはホストマシンを指していることが確認できます(もちろん、バックエンドのポートも curl で通信できます)。
次に、最初に思いついたのは、ホストマシンの /etc/hosts
ファイルを変更して、バックエンドのドメインをこのアドレスに指定することです。
そして、コンテナ内でテストしてみましたが、これはホストマシンの hosts を通過しませんでした、、、
この時点で、2 つの解決策があります。
1. ローカルで DNS を構築して IP を強制的に解決する#
実際には、ADGuard Home のカスタムルールを使用するだけでできます。
構築方法の詳細については、この記事をご覧ください。
私のローカルではこの DNS は使用していないため、2 番目を見てください。
2. ホストマシンの hosts ファイルを Docker コンテナにマッピングする#
フロントエンドコンテナの docker-compose.yml
ファイルに次の行を追加します。
volumes:
- /etc/hosts:/etc/hosts:ro
コンテナが変更を加えないように、読み取り専用でマウントします。
そして、コンテナを再起動します。
コンテナ内に戻って試してみてください。
うまく解決しました。
後書き#
この記事は少し冗長ですが、抽象的な問題に遭遇したことを記録するためです。
私のアイデアが役立つと思った場合は、いいね、共有、ブックマーク、そして最後に寄付していただければ幸いです。ありがとうございました。
この記事は Mix Space から xLog に同期されました。
元のリンクは https://blog.nekorua.com/posts/maintain/121.html です。