🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

2899閲覧

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

kobahiro

総合スコア10

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2019/11/18 00:18

編集2019/11/18 00:28

前提・実現したいこと

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からの接続先

1REACT_APP_API_BASE_URL=http://backend/api

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

nginx

1server { 2 listen 80; 3 4 location / { 5 root /usr/share/nginx/html; 6 index index.html index.htm; 7 } 8 9 location /api { 10 proxy_pass http://localhost:8080; 11 add_header Access-Control-Allow-Origin *; 12 add_header Access-Control-Allow-Methods "POST, GET, OPTIONS, PUT, DELETE, PATCH"; 13 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"; 14 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; 15 add_header Access-Control-Allow-Credentials true; 16 } 17 18 error_page 404 /404.html; 19 location = /40x.html { 20 root /usr/share/nginx/html; 21 } 22 23 error_page 500 502 503 504 /50x.html; 24 location = /50x.html { 25 root /usr/share/nginx/html; 26 } 27}

SpringBoot

1server.port=8080(変更せず)

hosts

1127.0.0.1 backend

試したこと

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

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

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

docker

1nginx: 2 image: nginx:1.17.5 3 ports: 4 - "80:80" 5 volumes: 6 - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kobahiro

2019/11/18 03:00

ご回答ありがとうございます。 upstreamの設定は行っていません。upstreamは複数ホストを束ねるための設定という認識ためです。 上記URLの内容も今回の問題とは事象がことなりそうです。
退会済みユーザー

退会済みユーザー

2019/11/18 05: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 仮定が違ってた場合は面倒なので他の方を待ってください。 質問するときは最低限状況が分かるようにしてください。 そうでないと伝言ゲームになってしまいます。
退会済みユーザー

退会済みユーザー

2019/11/18 05:27

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

2019/11/18 06:38

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

回答1

0

自己解決

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

#解決方法

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

nginx

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

投稿2019/11/18 10:42

kobahiro

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問