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

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

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

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

nginx

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

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

Q&A

解決済

1回答

2840閲覧

Docker-composeでNginxからRails(Puma)に接続できない("2: No such file or directory"と出てpuma.sockを参照できない)

hajsu00

総合スコア151

docker-compose

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

nginx

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Docker

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

0グッド

0クリップ

投稿2022/05/26 05:27

編集2022/05/26 05:50

Docker上でRails(Puma) + Nginxの構成で、アプリを作成中です。
NginxがRailsのpuma.sockを参照できないエラーが解決できずにいます。
ご助言をいただけると幸いです。

開発環境

  • ruby 3.0.1
  • Rails 6.1.4.4
  • puma 5.5.2
  • nginx 1.21.6

起きている問題

ブラウザからnginxのlocalhost:80にアクセスすると、nginxから502 Bad Gatewayが返ってくる。
このとき、$docker-compose logsを実行すると次のエラーが返ってくる。

bash

1nginx_1 | 2022/05/26 04:37:12 [crit] 9#9: *1 connect() to unix:///var/www/myapp/tmp/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream, client: 172.23.0.1, server: localhost:3000, request: "GET / HTTP/1.1", upstream: "http://unix:///var/www/myapp/tmp/sockets/puma.sock:/", host: "localhost"

前提事項

  • RailsとNginxのイメージを$docker build -t ...で各々作成し、docker-compose.ymlで起動しています。
  • Rails用のDockerfileは本番環境用(ECS Fargate用)にCMD bash -c "bundle exec puma -e production"を実行しており、これを開発環境用にdocker-compose.ymlcommand: "bundle exec puma -C config/ruby.puma"で置き換えています。
  • /var/www/myapp/tmp/sockets/puma.sockが存在することおよびアクセスできることは、Railsコンテナ内に直接入って確認済みです。
  • Railsのdevelopment.logにはアクセス履歴はありません。
  • ymlのRailsコマンドをcommand: "bundle exec puma -p 3000 -C config/puma.rb"としてブラウザからlocalhost:3000にアクセスすると、正常にアプリケーションが表示される。

関連コードおよびログ

ログ($ docker-compose logs)

bash

1Attaching to myapp_app_development, myapp_nginx_development, myapp_db_development 2nginx_1 | 2022/05/26 04:36:09 [notice] 8#8: using the "epoll" event method 3nginx_1 | 2022/05/26 04:36:09 [notice] 8#8: nginx/1.21.6 4nginx_1 | 2022/05/26 04:36:09 [notice] 8#8: built by gcc 10.2.1 20210110 (Debian 10.2.1-6) 5nginx_1 | 2022/05/26 04:36:09 [notice] 8#8: OS: Linux 5.10.76-linuxkit 6nginx_1 | 2022/05/26 04:36:09 [notice] 8#8: getrlimit(RLIMIT_NOFILE): 1048576:1048576 7nginx_1 | 2022/05/26 04:36:09 [notice] 8#8: start worker processes 8nginx_1 | 2022/05/26 04:36:09 [notice] 8#8: start worker process 9 9nginx_1 | 2022/05/26 04:36:09 [notice] 8#8: start worker process 10 10nginx_1 | 2022/05/26 04:36:09 [notice] 8#8: start worker process 11 11nginx_1 | 2022/05/26 04:36:09 [notice] 8#8: start worker process 12 12nginx_1 | 2022/05/26 04:37:12 [crit] 9#9: *1 connect() to unix:///var/www/myapp/tmp/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream, client: 172.23.0.1, server: localhost:3000, request: "GET / HTTP/1.1", upstream: "http://unix:///var/www/myapp/tmp/sockets/puma.sock:/", host: "localhost" 13nginx_1 | 172.23.0.1 - - [26/May/2022:04:37:12 +0000] "GET / HTTP/1.1" 502 559 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36" "-" 14app_1 | [1] Puma starting in cluster mode... 15app_1 | [1] * Puma version: 5.5.2 (ruby 3.0.1-p64) ("Zawgyi") 16app_1 | [1] * Min threads: 5 17app_1 | [1] * Max threads: 5 18app_1 | [1] * Environment: development 19app_1 | [1] * Master PID: 1 20app_1 | [1] * Workers: 2 21app_1 | [1] * Restarts: (���) hot (���) phased 22app_1 | [1] * Preloading application 23app_1 | [1] * Listening on unix:///var/www/myapp/tmp/sockets/puma.sock 24app_1 | [1] ! WARNING: Detected 6 Thread(s) started in app boot: 25app_1 | [1] ! #<Thread:0x00005577ea5c6158@listen-run_thread /usr/local/bundle/gems/listen-3.7.0/lib/listen/thread.rb:17 sleep> - /usr/local/bundle/gems/rb-inotify-0.10.1/lib/rb-inotify/notifier.rb:317:in `select' 26app_1 | [1] ! #<Thread:0x00005577ea5c48f8@listen-wait_thread /usr/local/bundle/gems/listen-3.7.0/lib/listen/thread.rb:17 sleep_forever> - /usr/local/lib/ruby/3.0.0/forwardable.rb:238:in `pop' 27app_1 | [1] ! #<Thread:0x00005577ea4d2d28@listen-run_thread /usr/local/bundle/gems/listen-3.7.0/lib/listen/thread.rb:17 sleep> - /usr/local/bundle/gems/rb-inotify-0.10.1/lib/rb-inotify/notifier.rb:317:in `select' 28app_1 | [1] ! #<Thread:0x00005577ea4d1bf8@listen-wait_thread /usr/local/bundle/gems/listen-3.7.0/lib/listen/thread.rb:17 sleep_forever> - /usr/local/lib/ruby/3.0.0/forwardable.rb:238:in `pop' 29app_1 | [1] ! #<Thread:0x00005577ea25fde8@listen-run_thread /usr/local/bundle/gems/listen-3.7.0/lib/listen/thread.rb:17 run> - <internal:dir>:15:in `open' 30app_1 | [1] ! #<Thread:0x00005577ea25e9e8@listen-wait_thread /usr/local/bundle/gems/listen-3.7.0/lib/listen/thread.rb:17 sleep_forever> - /usr/local/lib/ruby/3.0.0/forwardable.rb:238:in `pop' 31app_1 | [1] Use Ctrl-C to stop 32app_1 | [1] - Worker 0 (PID: 22) booted in 0.08s, phase: 0 33app_1 | [1] - Worker 1 (PID: 23) booted in 0.09s, phase: 0 34db_1 | 2022-05-26 04:36:09+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.28-1debian10 started. 35db_1 | 2022-05-26 04:36:09+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' 36db_1 | 2022-05-26 04:36:09+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.28-1debian10 started. 37db_1 | '/var/run/mysqld/mysqld.sock' -> '/tmp/mysql.sock' 38db_1 | 2022-05-26T04:36:10.318617Z 0 [Warning] [MY-010918] [Server] 'default_authentication_plugin' is deprecated and will be removed in a future release. Please use authentication_policy instead. 39db_1 | 2022-05-26T04:36:10.318685Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.28) starting as process 1 40db_1 | 2022-05-26T04:36:10.333106Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 41db_1 | 2022-05-26T04:36:10.588885Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 42db_1 | 2022-05-26T04:36:10.843918Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. 43db_1 | 2022-05-26T04:36:10.844011Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. 44db_1 | 2022-05-26T04:36:10.848101Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. 45db_1 | 2022-05-26T04:36:10.902405Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock 46db_1 | 2022-05-26T04:36:10.902727Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.28' socket: '/tmp/mysql.sock' port: 3306 MySQL Community Server - GPL.

Dockerfile

1FROM ruby:3.0.1 2 3RUN apt-get update -qq && apt-get install -y nodejs 4RUN mkdir -p /var/www/myapp 5RUN mkdir -p /var/www/myapp/tmp/sockets 6RUN mkdir -p /var/www/myapp/tmp/pids 7WORKDIR /var/www/myapp 8COPY Gemfile /var/www/myapp/Gemfile 9COPY Gemfile.lock /var/www/myapp/Gemfile.lock 10RUN bundle install 11RUN curl https://deb.nodesource.com/setup_16.x | bash 12RUN curl https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - 13RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list 14RUN apt-get update && apt-get install -y nodejs yarn 15 16COPY . /var/www/myapp 17 18# Add a script to be executed every time the container starts. 19COPY entrypoint.sh /usr/bin/ 20RUN chmod +x /usr/bin/entrypoint.sh 21ENTRYPOINT ["entrypoint.sh"] 22 23RUN bundle exec rails assets:precompile 24RUN bundle exec rails tailwindcss:build 25 26VOLUME /var/www/myapp/public 27VOLUME /var/www/myapp/tmp 28 29# Start the main process. 30CMD bash -c "bundle exec puma -e production"

docker-compose.yml

yml

1version: '3' 2 3services: 4 nginx: 5 container_name: myapp_nginx_development 6 image: myapp_nginx_development 7 ports: 8 - 80:80 9 volumes: 10 - ./nginx/myapp.conf:/etc/nginx/conf.d/myapp.conf 11 - ./nginx/nginx.conf:/etc/nginx/nginx.conf 12 tty: true 13 14 app: 15 container_name: myapp_app_development 16 image: myapp_app_development 17 environment: 18 RAILS_ENV: development 19 command: "bundle exec puma -C config/puma.rb" 20 volumes: 21 - ./src:/var/www/myapp 22 ports: 23 - 3000:3000 24 depends_on: 25 - db 26 - nginx 27 tty: true 28 29 db: 30 image: mysql:8.0.28 31 container_name: myapp_db_development 32 volumes: 33 - ./etc/my.cnf:/etc/mysql/conf.d/my.cnf 34 - myapp_data:/var/lib/mysql 35 environment: 36 MYSQL_ROOT_HOST: '%' 37 MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD} 38 command: --default-authentication-plugin=mysql_native_password 39 ports: 40 - 3306:3306 41 env_file: 42 - .env 43 tty: true 44 45volumes: 46 myapp_data: 47 external: true

puma.rb

ruby

1workers Integer(ENV['WEB_CONCURRENCY'] || 2) 2max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } 3min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } 4threads min_threads_count, max_threads_count 5 6preload_app! 7environment ENV.fetch("RAILS_ENV") { "development" } 8bind "unix:///var/www/myapp/tmp/sockets/puma.sock" 9 10pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } 11plugin :tmp_restart 12 13on_worker_boot do 14 ActiveRecord::Base.establish_connection 15end

myapp.comf

upstream puma { server unix:///var/www/myapp/tmp/sockets/puma.sock; } server { listen 80; server_name localhost:3000; keepalive_timeout 0; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log; client_max_body_size 4G; root /var/www/myapp/public; location ~ .*\.(swf|SWF|ico|ICO|jar|txt|gz|js) { root /var/www/myapp/public; expires 15m; break; } location ~ ^\/assets\/* { root /var/www/myapp/public; break; } location ~ ^/assets/|favicon.ico { root /var/www/myapp/app/assets/images; break; } location = /manifest.json { root /var/www/myapp/app/config; break; } location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; #auth_basic "Restricted"; #auth_basic_user_file /etc/nginx/.htpasswd; #if ($http_x_forwarded_proto = "http") { #rewrite ^(.*) https://$server_name$1 #break; #} proxy_pass http://puma; } }

よくあるエラーですが、puma.sockも意図した場所に存在しており長時間解決できずにいます。puma.sockへのアクセス制限等も考えましたが、前例を見つけることができずに困っています。

お手数お掛けしますが、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

docker-compose.ymlでポート番号:3000を指定していることが該当しそうです

ポートを指定してPumaを起動するとsocketファイルをlistenしなくなる

現状、tcpでは接続できるのでしょうか

upstream puma { server localhost:3000; }

投稿2022/05/26 06:32

yukky1201

総合スコア2751

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

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

hajsu00

2022/05/26 08:11

ご回答ありがとうございます。 まずdocker-compose.ymlについて、ご指摘されるまでこのポート指定については全く意識していませんでした。ポートの指定を削除して検証しましたが、症状は変わりませんでした。 次に、現在TCPでの接続について確認をしております。こちらの方法は一度も試したことがないため、調べながら作業しております。進展がありましたらコメントさせていただきます。
yukky1201

2022/05/26 13:52 編集

DockerでのRails環境構築について調べてみたのですが コンテナ間で共有出来る様にnginxコンテナとappコンテナで同じVolumes:を指定しなければいけないようです 検索するとそのように導入説明しているサイトがヒットするので参考にしてみてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問