質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.79%

nginxのリバースプロキシをlocal環境で動作させたいです。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 679

kobahiro

score 10

前提・実現したいこと

local環境でnginxのリバースプロキシで下記構成を動かしたいと考えています。
React(フロントエンド) → nginx → SpringBoot(バックエンド)

発生している問題・エラーメッセージ

502エラーとなり、バックエンドに接続できません。

nginx_1          | 2019/11/18 00:10:15 [error] 7#7: *7 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.128.1, server: , request: "POST /api/authentication/uuid HTTP/1.1", upstream: "http://127.0.0.1:8080/api/authentication/uuid", host: "backend", referrer: "http://localhost:3000/"
nginx_1          | 2019/11/18 00:10:15 [warn] 7#7: *7 upstream server temporarily disabled while connecting to upstream, client: 192.168.128.1, server: , request: "POST /api/authentication/uuid HTTP/1.1", upstream: "http://127.0.0.1:8080/api/authentication/uuid", host: "backend", referrer: "http://localhost:3000/"

該当のソースコード

フロントエンドからAPIのパスです。

REACT_APP_API_BASE_URL=http://backend/api

nginxの設定です。
/apiのパスをバックエンドにリバースプロキシしています。

server {
    listen       80;

    location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
    }

    location /api {
          proxy_pass    http://localhost:8080;
          add_header Access-Control-Allow-Origin *;
          add_header Access-Control-Allow-Methods "POST, GET, OPTIONS, PUT, DELETE, PATCH";
          add_header Access-Control-Allow-Headers "Origin, Authorization, Accept, Content-Type, X-Requested-With, X-studychannel-session-id, X-studychannel-admin-session-id, X-studychannel-uuid";
          add_header Access-Control-Expose-Headers "date, via, x-content-type-options, Authorization, transfer-encoding, x-cache, connection, x-xss-protection, server, x-frame-options, Access-Control-Allow-Methods, Access-Control-Allow-Origin, Access-Control-Allow-Credentials, Access-Control-Allow-Headers, X-studychannel-session-id, X-studychannel-admin-session-id, X-studychannel-uuid" always;
          add_header Access-Control-Allow-Credentials true;
    }

    error_page  404 /404.html;
    location = /40x.html {
        root   /usr/share/nginx/html;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
server.port=8080(変更せず)
127.0.0.1       backend

試したこと

リバースプロキシの接続先をlocal環境ではなく、AWSの開発環境に向けると問題なく接続ができました。

補足情報(FW/ツールのバージョンなど)

nginx:1.17.5
docker-composeで立ち上げています。

nginx:
    image: nginx:1.17.5
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dameo

    2019/11/18 14:20

    状況がよく分かりませんが、Springはどこで動いているのでしょうか?
    きちんと説明してください。local環境とは何ですか?AWSとは何を指していますか?
    多分そこの説明がないので、回答がないのだと思いますよ。

    Spring -> dockerを動かしているホスト上で動作
    nginx -> docker-composeで起動するdockerコンテナ上で動作
    local環境 -> 上記Springとnginxが動作している環境
    AWS -> 上記Springと同じServeletコンテナが動作しているAWS上のどこか

    だとすると、多分dockerコンテナからhostへのアクセスが出来ないだけかと
    ↓の記事を参考にしてyamlを書き換えてください
    https://qiita.com/Iju/items/badde64d530e6bade382

    仮定が違ってた場合は面倒なので他の方を待ってください。
    質問するときは最低限状況が分かるようにしてください。
    そうでないと伝言ゲームになってしまいます。

    キャンセル

  • dameo

    2019/11/18 14:27

    あと127.0.0.1はloopbackデバイスを指すので、そうでないデバイスのIPを指定しましょう

    キャンセル

  • kobahiro

    2019/11/18 15:38

    ご回答ありがとうございます。
    拙い質問内容で申し訳ありませんでした。

    >dockerコンテナからhostへのアクセスが出来ないだけか
    今回の問題はこれが原因でした。
    ありがとうございます。

    キャンセル

回答 1

check解決した方法

0

原因

Docker で起動したコンテナ内からホストOS(ローカルPC)内のプロセスと通信する際に、
localhost と指定しがちだけど localhost だとコンテナ内を指してしまい、
意図した通りに通信することができないため。

解決方法

MacOSのlocalhostで動作するアプリケーションへの接続は下記で行う。

proxy_pass    http://host.docker.internal:8080;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.79%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る