すべての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です。
何が足りないのですか?たぶん私のアプローチはネットワークを使用することとは完全に異なるはずですか?
敬具、
ダニエル
解決済み。私はこれが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 => {