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

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

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

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

nginx

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Ruby on Rails 7

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

Q&A

解決済

1回答

5332閲覧

nginxとpumaの接続が上手く行かないので解決したい (2: No such file or directory)

senseIY

総合スコア281

docker-compose

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

nginx

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Ruby on Rails 7

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

0グッド

0クリップ

投稿2022/08/26 01:31

編集2022/08/26 03:06

前提

現在こちらのサイトを参考にdocker-compose を使用してバックエンド側(Rails7系 APIモード)とフロントエンド側(React TypeScript)で開発したポートフォリオをAWSにデプロイしようとしています。現在サイトの通りに、一旦ローカル環境でRailsが本番環境で正常に作動するかチェックをしています。しかし、コンテナを起動すると以下のエラーが発生してしまいます。

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

yml

1web_1 | 2022/08/26 00:46:25 [crit] 7#7: *1 connect() to unix:///myapp/tmp/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream, client: 172.25.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://unix:///myapp/tmp/sockets/puma.sock:/", host: "localhost" 2web_1 | 2022/08/26 00:46:25 [crit] 7#7: *1 connect() to unix:///myapp/tmp/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream, client: 172.25.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://unix:///myapp/tmp/sockets/puma.sock:/500.html", host: "localhost" 3web_1 | 172.25.0.1 - - [26/Aug/2022:00:46:25 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36" 4web_1 | 2022/08/26 00:46:25 [crit] 7#7: *1 connect() to unix:///myapp/tmp/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream, client: 172.25.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", upstream: "http://unix:///myapp/tmp/sockets/puma.sock:/favicon.ico", host: "localhost", referrer: "http://localhost/" 5web_1 | 2022/08/26 00:46:25 [crit] 7#7: *1 connect() to unix:///myapp/tmp/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream, client: 172.25.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", upstream: "http://unix:///myapp/tmp/sockets/puma.sock:/500.html", host: "localhost", referrer: "http://localhost/" 6web_1 | 172.25.0.1 - - [26/Aug/2022:00:46:25 +0000] "GET /favicon.ico HTTP/1.1" 502 559 "http://localhost/" "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.production.yml

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

config/puma.rb

rb

1threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i 2threads threads_count, threads_count 3port ENV.fetch("PORT") { 3000 } 4environment ENV.fetch("RAILS_ENV") { "development" } 5plugin :tmp_restart 6 7app_root = File.expand_path("../..", __FILE__) 8# bind "unix:#{app_root}/tmp/sockets/puma.sock" 9bind "unix://#{app_root}/tmp/sockets/puma.sock" 10 11stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true

nginx.conf

json

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

試したこと

・まず、エラーの通り/myapp/tmp/sockets/puma.sockファイルがないのだと思い、以下を試しました。

1 パスの確認

 このサイトを参考に進めました。私の場合、docker-compose で同じサーバ(EC2インスタンス)上で同時にrailsとnginxを立ち上げるため、「1. WEB/APサーバが一体化された構成」というのが当てはまりそうです。
「上記の設定後はrails server起動時にsockファイルがlistenされるようになります。」とあるようにpuma.rbを設定後railsコンテナは

yml

1api_1 | Puma starting in single mode... 2api_1 | * Puma version: 5.6.4 (ruby 3.1.2-p20) ("Birdie's Version") 3api_1 | * Min threads: 5 4api_1 | * Max threads: 5 5api_1 | * Environment: production 6api_1 | * PID: 1 7api_1 | * Listening on http://0.0.0.0:3000 8api_1 | * Listening on unix:///myapp/tmp/sockets/puma.sock 9api_1 | Use Ctrl-C to stop

となっているので正常に動作してそうです。
しかし、connect() to unix:///myapp/tmp/sockets/puma.sock failed (2: No such file or directory)というエラーがnginx側で出ています。

yml

1$docker-compose -f docker-compose.production.yml exec web nginx -t 2nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 3nginx: configuration file /etc/nginx/nginx.conf test is successful

となっているので恐らくnginxは起動はしています。

2なぜかファイルエラーが起きるので再度作成

イメージ説明
このように、puma.sockがvscodeで開けないようです。一度消して再度作り直した(pumaにより強制的に作られる)のですがこうなってしまいます。これは仕様でしょうか。

3 myappディレクトリが何なのかよくわからない

 私のディレクトリにはmyappというディレクトリは存在しません。appならあります。ですが、

rb

1app_root = File.expand_path("../..", __FILE__) 2bind "unix://#{app_root}/tmp/sockets/puma.sock"

puma.rbにあるこの部分でパスを生成しているので合っている?と思われます。
・何かしらアドバイスがあればよろしくお願いいたします。不備があれば追記いたします。

追記

bind "unix://#{app_root}/backend/tmp/sockets/puma.sock" bind "unix:/backend/tmp/sockets/puma.sock"

puma.rb nginx.confのパスをそれぞれ書き換えましたが、今度は

bundler: failed to load command: puma (/usr/local/bundle/bin/puma)

というエラーでディレクトリやファイルが見つからないというエラーが起きました。
また、この記事を参考に

puma.rb

rb

1bind "unix:#{app_root}/tmp/sockets/puma.sock"

nginx.conf

conf

1upstream myapp { 2 # ソケット通信したいのでpuma.sockを指定 3 server unix:/myapp/tmp/sockets/puma.sock; 4 # server unix:///myapp/tmp/sockets/puma.sock; 5}

このように書き換え、再度ビルドしましたが

connect() to unix:/myapp/tmp/sockets/puma.sock failed (2: No such file or directory)

となってしまいます。どうすればいいのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

server unix:/myapp/tmp/sockets/puma.sock;

この部分はあくまでnginxコンテナの中のパスを指しているので、railsのコンテナ内のどこにあっても実際はあまり関係がありません。

参考の記事とdocker-compose.ymlの内容が違うのできちんと見比べてみましょう。

参考記事中ではdocker-compose.ymlの下記の部分でローカルホストのボリュームマウントをしています。
左側がdockerを起動している環境、右側がコンテナ内のディレクトリです
左側に絶対パスでも相対パスでもない名前を指定している箇所(tmp-dataなど)がありますが、それはdocker-compose.yml内にvolumesを定義することで名前付きボリュームをdocker-compose.yml内で使用できます。
今回だと最下部で指定していますね。

  • railsコンテナのvolumesの箇所抜粋

yml

1 volumes: 2 - .:/myapp 3 - public-data:/myapp/public 4 - tmp-data:/myapp/tmp 5 - log-data:/myapp/log 6 - /myapp/node_modules
  • nginxコンテナのvolumesの箇所抜粋

yml

1 volumes: 2 - public-data:/myapp/public 3 - tmp-data:/myapp/tmp
  • 名前付きボリュームの定義

yml

1volumes: 2 db: 3 driver: local 4 public-data: 5 tmp-data: 6 log-data: 7 mysql-data:

これによってrailsコンテナ内の/myapp/tmpを名前付きボリュームのtmp-dataにマウントし、
同時にnginxコンテナ内の/myapp/tmpを同じように名前付きボリュームのtmp-dataディレクトリにマウントしています。
つまり、この設定だとtmp-dataに配置されたファイルは双方のコンテナから参照できるようになります。
よって、
railsのコンテナが自コンテナ内の/myapp/tmpディレクトリ配下にsockファイルを作成する

tmp-dataにrailsのsockファイルが作成される(実際には↑で作成されたものをそのまま参照している)

nginxのコンテナが自コンテナ内の/myapp/tmpディレクトリにあるrailsのsockファイルを参照する

ということが行えるようになります。

しかし、この質問に貼ったdocker-compose.ymlではソケットファイルの存在するボリュームをnginxでマウントしていないため参照できていません。
貼ったファイルではrailsコンテナはローカルのbackendディレクトリをマウントしています

yml

1 volumes: 2 - ./backend:/myapp 3 - ./backend/vendor/bundle:/myapp/vendor/bundle

しかしnginxはtmp-dataをマウントしているだけなので、そこにはsockファイルはなくエラーになります。

いずれかの定義を修正して、nginxからsockファイルが見える状態にしてください。

投稿2022/08/26 06:49

yu_1985

総合スコア7506

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

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

senseIY

2022/08/26 08:11

ご指摘の通りにdocker-compose.ymlのvolumes部分をnginxからsockファイルが見える状態に編集したところエラーが解消されました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問