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

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

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

nginx

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

React.js

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

Q&A

解決済

1回答

902閲覧

バックエンド側とフロントエンド側に分けて開発する際のnginxのドキュメントルートとdocker-compose.ymlのvolumesの関係について

senseIY

総合スコア281

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

nginx

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

React.js

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

Ruby on Rails 7

Ruby on Rails 7は、2021年12月に正式リリースされました。Ruby on Railsのバージョン7であり、フロントエンド開発環境を大幅に刷新。Node.jsを用いない構成がデフォルトになっています。

0グッド

1クリップ

投稿2022/08/27 01:53

編集2022/08/27 02:12

前提

現在こちらのサイトを参考にdocker-compose を使用してバックエンド側(Rails7系 APIモード)とフロントエンド側(React TypeScript)で開発したポートフォリオをAWSにデプロイしようとしています。現在サイトの通りに、一旦ローカル環境でRailsが本番環境で正常に作動するかチェックをしています。しかし、コンテナを起動した後にコンテナ同士の通信(React側で受け取った情報をRailsに送るなど)をすると、失敗してしまうで解決したいです。

また、以前の質問とやや趣旨が異なるので別に質問させていただきます。

発生している問題・エラーメッセージ(コンソール上のnginxコンテナで発生)

j

1web_1 | 172.30.0.1 - - [26/Aug/2022:23:17:45 +0000] "GET /api/v1/users HTTP/1.1" 500 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"

docker-compose.yml(webのpublic-dataは調整中です。)

yml

1version: "3.3" 2services: 3 api: 4 build: 5 context: ./backend/ 6 dockerfile: Dockerfile 7 # command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" 8 command: bash -c "rm -f tmp/pids/server.pid && bundle exec puma -C config/puma.rb -e production" 9 volumes: 10 - ./backend:/myapp 11 - ./backend/vendor/bundle:/myapp/vendor/bundle 12 - tmp-data:/myapp/tmp 13 - log-data:/myapp/log 14 # - public-data:/myapp 15 environment: 16 TZ: Asia/Tokyo 17 RAILS_ENV: production 18 # RAILS_ENV: development 19 # ports: 20 # - "3001:3000" 21 depends_on: 22 - db 23 stdin_open: true 24 tty: true 25 env_file: 26 - .env 27 user: root 28 29 front: 30 build: 31 context: ./frontend/ 32 dockerfile: Dockerfile 33 volumes: 34 - ./frontend/app:/usr/src/app 35 command: sh -c "yarn && yarn start" 36 ports: 37 - "4000:3000" 38 environment: 39 - WDS_SOCKET_PORT=0 40 41 db: 42 image: mysql:8.0 43 environment: 44 MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} 45 command: --default-authentication-plugin=mysql_native_password 46 volumes: 47 - mysql-data:/var/lib/mysql 48 - /tmp/dockerdir:/etc/mysql/conf.d/ 49 ports: 50 - "3306:3306" 51 cap_add: 52 - SYS_NICE 53 54 web: 55 build: 56 context: backend/containers/nginx 57 volumes: 58 - public-data:/myapp 59 - tmp-data:/myapp/tmp 60 ports: 61 - 80:80 62 depends_on: 63 - api 64 65volumes: 66 db: 67 driver: local 68 public-data: 69 tmp-data: 70 log-data: 71 mysql-data:

nginx.conf

json

1# プロキシ先の指定 2# Nginxが受け取ったリクエストをバックエンドのpumaに送信 3upstream myapp { 4 # ソケット通信したいのでpuma.sockを指定 5 # server unix:/backend/tmp/sockets/puma.sock; 6 server unix:/myapp/tmp/sockets/puma.sock; 7 # server unix:///myapp/tmp/sockets/puma.sock; 8} 9 10server { 11 listen 80; 12 # ドメインもしくはIPを指定 13 # server_name localhost:4000; 14 server_name localhost; 15 # server_name .*; 16 17 access_log /var/log/nginx/access.log; 18 error_log /var/log/nginx/error.log; 19 20 # ドキュメントルートの指定 21 root /myapp; 22 # root /myapp/public; 23 24 client_max_body_size 100m; 25 error_page 404 /404.html; 26 error_page 505 502 503 504 /500.html; 27 try_files $uri/index.html $uri @myapp; 28 keepalive_timeout 5; 29 30 # リバースプロキシ関連の設定 31 location @myapp { 32 proxy_set_header X-Real-IP $remote_addr; 33 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 34 proxy_set_header Host $http_host; 35 proxy_pass http://myapp; 36 # proxy_pass http://api:3000; 37 } 38}

試したこと

こちらのサイトを参考にデバッグしていたところnginx.confの

# ドキュメントルートの指定 root /myapp; # root /myapp/public;

この部分の設定が間違っている可能性に気づきました。参考にしたサイトではバックエンド側とフロントエンド側に分けて開発をしていなかったので、ドキュメントルートをそのまま/myapp/publicにすればrailsのpublicフォルダの内容(404.htmlなど)を読み込むことができ、

try_files $uri/index.html $uri @myapp;

このような記載をすると、特定のURLが来た時にそのフォルダ(URLのパスに依存)の中のindex.htmlを表示することができるのだと解釈しました。そのため、バックエンド側とフロントエンド側に分けて開発している私の場合、この部分を修正する必要がありそうです。ですが、私の場合、railsのAPIモードを使用しているため、jsonを返すような設定にしなければなりません。しかし、どのように記載すればnginxがrailsのjsonだけを返す機能を仲介できるのでしょうか。
この記事をみたのですが、もしかするとdocker-composeで一発で全てのコンテナを立ち上げる場合、私のディレクトリ構造を変更する必要があるかもしれません。現在の私のディレクトリ構造は以下の通りです。
イメージ説明
この記事の場合、nginxがreactを包含している?ような構成になっていますが、このような構成に変更する必要があるのでしょうか?また、私の構成では
・React(この画面を表示して必要があればrailsと通信をする) ⇔nginx(仲介)⇔rails⇔db*通信の大まかな流れ
・全てを一つのEC2インスタンス上で起動する(DBは除く)
・AWSにデプロイする際にはEC2上でDocker-compose upするだけ(DBやPIアドレスなどの調整はする)
このように、考えていたのですが、間違えていますでしょうか。
・なにかしらアドバイスがあればよろしくお願いいたします。不備があれば追記いたします。

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

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

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

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

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

guest

回答1

0

自己解決

https://qiita.com/hijitoshi/items/c75d20d5615630b1a23f
こちらの記事のとおりにディレクトリ構造を書き換えることで対応できました。ありがとうございました。

投稿2022/08/28 23:25

senseIY

総合スコア281

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問