前提
現在こちらのサイトを参考に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)
となってしまいます。どうすればいいのでしょうか。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/26 08:11