web-dev-qa-db-ja.com

アップストリームへの接続中にdockernginxプロキシnginxconnect()が失敗しました(111:接続が拒否されました)

すべてのWebサイトとWebサービスのメインエントリポイントとしてnginxコンテナを実行しようとしています。 portainer をコンテナとして実行でき、インターネットからアクセスできます。現在、別のnginxコンテナでホストされている静的なWebサイトにアクセスしようとしていますが、アクセスできません。URLにアクセスすると、次のようになります。

502 Bad Gateway

メインのnginxの構成にアップストリームセクションを追加しようとしましたが、何も変更されていません(構成を変更するたびに、メインのnginxサービスをコンテナー内にリロードします)。

一方、アップストリームを追加することは、可能であれば避けたいものです。複数の異なるアプリケーションを生成するには、アプリケーションごとにアップストリームを追加する必要があるためです。これは、予想よりもはるかに多くの作業です。

これが私のメインのnginxの設定ファイルです:

events {
    worker_connections 1024;
}
http {
    server {
        listen 80;

        location /portainer/ {
            proxy_pass http://portainer:9000/;
        }
        location /helicon/ {
            proxy_pass http://helicon:8001/;
        }
    }
}

メインのnginxコンテナを起動する方法は次のとおりです。

docker run -p 80:80 --name nginx -v /var/nginx/conf:/etc/nginx:ro --net=internal-net -d nginx

これが私の静的ウェブサイトのnginx構成ファイルです:

events {
    worker_connections 1024;
}
http {
    server {
        listen  80;

    server_name helicon;
        root /var/www/html/helicon;

        error_log /var/log/nginx/localhost.error.log;
        access_log /var/log/nginx/localhost.access.log;
    }
}

Docker-composeファイルでそのコンテナーを作成して開始する方法は次のとおりです。

version: '3.5'
services:
    helicon:
        build: .
        image: helicon
        ports:
            - "127.0.0.1:8001:80"
        container_name: helicon
        networks:
            - internal-net
networks:
    internal-net:
        external: true

internal-netの非推奨の--linkオプションではなく、docker runネットワークを使用してすべてのアプリを同じネットワークに保持しています。

http://my.server.ip.address/helicon にアクセスすると、502が表示されます。次に、docker logs nginxでログを確認すると、情報があります。

2018/06/24 11:15:28 [error] 848#848: *466 connect() failed (111: Connection refused) while connecting to upstream, client: Y.Y.Y.Y, server: , request: "GET /helicon/ HTTP/1.1", upstream: "http://172.18.0.2:8001/", Host: "X.X.X.X"

ヘリコンコンテナのIPアドレスは172.18.0.2です。

何が足りないのですか?たぶん私のアプローチはネットワークを使用することとは完全に異なるはずですか?

敬具、

ダニエル

5
Aranha

解決済み。私はこれがnginxの設定の問題だと思って何時間も取り組んでいました。 nginx.confを際限なく変更しましたが、修正できませんでした。 502 Bad Gatewayを取得していましたが、エラーの説明は次のとおりです。

failed (111: Connection refused) while connecting to upstream

私は間違った場所を探していました。 index.jsファイルのhttpサーバーがURL「localhost」をリッスンしていたことがわかりました。

httpServer.listen(PORT, 'localhost', async err => {

これは開発マシンでは正常に機能しますが、コンテナー内で実行する場合は、コンテナー自体のURLという名前を付ける必要があります。私のコンテナはネットワーク化されており、私の場合、コンテナの名前は「バックエンド」です。

URLを「localhost」から「backend」に変更しましたが、すべて正常に機能します。

httpServer.listen(PORT, 'backend', async err => {
1
Energytwist