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

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

ただいまの
回答率

88.58%

【Nginx】Nginx+Railsコンテナでdocker-composeしてブラウザでアクセスすると500の内部サーバエラーが出る

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 540

otdsh9432

score 27

実現したいこと

docker-composeで立ち上げたRailsアプリに、ブラウザからアクセスする。

解決したい事象

下記のコンテナ構成でdocker-compose upでコンテナを立ち上げました。

  • APサーバ:Rails
  • Webサーバ:Nginx
  • DBサーバ:MySQL

そして、docker-compose upではエラーが出なかったので、ブラウザでアプリへアクセスしたところ、下記のエラー画面(500 Internal Server Error)が表示され、アプリの画面が正常に表示できません。
何が原因として考えられるか、また解決方法についてお伺いしたい次第です。
イメージ説明

なお、先日までは、「Rails」+「MySQL」という構成でDockerを使用しており(Nginxなし)、 その際は問題なくアプリの画面が表示できていました。 この度、Nginxを使用したいと思い、Nginxのコンテナも追加しました。

試したこと

サーバ側のエラーメッセージに
「worker_connections are not enough while connecting to upstream」
とあったので、その内容を調査し、下記のQiita記事の内容から、
worker_connectionsを増加させる記述をNginx設定ファイル(nginx.conf)へ行いました。
しかし、事象・エラーメッセージ共に変化せずでした。
[Nginx]worker_connectionsとworker_rlimit_nofileの値は何がいいのか?

現在、nginx.confの内容に原因があるのではと推測し、
エラーメッセージで検索し、調査を続けているところですが、
並行してご質問させていただきました。

サーバ側エラーメッセージ

イメージ説明

nginx.conf

# プロキシ先の指定
# Nginxが受け取ったリクエストをバックエンドのpumaに送信
upstream myapp {
  # ソケット通信したいのでpuma.sockを指定
  server unix:///myapp/tmp/sockets/puma.sock;
}

server {

  listen 80;
  # ドメインもしくはIPを指定
  server_name 192.168.99.100;

  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log;

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

  client_max_body_size 100m;
  error_page 404             /404.html;
  error_page 505 502 503 504 /500.html;
  try_files  $uri/index.html $uri @myapp;
  keepalive_timeout 5;

  # リバースプロキシ関連の設定
  location @myapp {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://myapp;
  }

}

# エラーを受けて追加したが動作変わらず(2020/6/17)
worker_rlimit_nofile 83000;

events {
  worker_connections 4096; # 1つのworkerプロセスが開ける最大コネクション数
}

docker-compose.yml

version: '3'
services:
  db:
      (他情報は略)
    volumes:
      - db-volume:/var/lib/mysql
    ports:
      - "3306:3306"
  test-db:
    image: mysql:5.7
    environment:
      (他情報は略)
    ports:
      - '3307:3306' # ローカルPCから接続するために設定
  app:
    build:
      context: .
      dockerfile: ./docker/rails/Dockerfile
    command: bundle exec pumactl start
    tty: true
    stdin_open: true
    volumes:
      - .:/myapp
      - public-data:/myapp/public
      - tmp-data:/myapp/tmp
      - log-data:/myapp/log
      - sockets:/myapp/tmp/sockets
    privileged: true
    depends_on:
      - db
  web:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    ports:
      - '80:80'
    volumes:
      - public-data:/myapp/public
      - tmp-data:/myapp/tmp
      - sockets:/myapp/tmp/sockets
    depends_on: 
      - app
volumes:
  db-volume:
  public-data:
  tmp-data:
  log-data:
  sockets:

Puma.rbの内容

threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
port        ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { "development" }
plugin :tmp_restart

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

stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true

NginxのDockerfile

FROM nginx

# インクルード用のディレクトリ内を削除
RUN rm -f /etc/nginx/conf.d/*

# Nginxの設定ファイルをコンテナにコピー
COPY nginx.conf /etc/nginx/conf.d/myapp.conf

# ビルド完了後にNginxを起動
CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

railsのDockerfile

FROM ruby:2.6.5
# apt-utils関連のエラーを表示させないようにする
ENV DEBCONF_NOWARNINGS yes
RUN apt-get update -qq && \
    apt-get install -y --no-install-recommends build-essential \ 
                       libpq-dev \      
                       nodejs \
                       && rm -rf /var/lib/apt/lists/*

# 作業ディレクトリの作成、設定
RUN mkdir /myapp
WORKDIR /myapp

# ホスト側(ローカル)のGemfileを追加する
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock

# Gemfileのbundle install
RUN bundle install
COPY . /myapp
RUN mkdir -p tmp/sockets

# Expose volumes to frontend
VOLUME /app/public
VOLUME /app/tmp

ディレクトリ構成

app/
bin/
config/
  -puma.rb
   (ほかは省略)
core
db/
docker/
 -nginx/
    -Dockerfile
    -nginx.conf
  -rails/
    -Dockerfile
docker-compose.yml
Gemfile
Gemfile.lock
lib/
log/
nginx/
package.json
public/
Rakefile
README.md
spec/
storage/
tmp/
 -sockets/
  -pids/
  (他は省略)
vendor/

不足情報等ございましたら、お手数をお掛けし恐縮ではございますが、
ご指摘いただけますと幸いです。

何卒宜しくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

この nginx.conf では正常に動作しないと思います.
worker_rlimit_nofile は設定ファイルのトップレベルに記載すべき項目(参考→ context: main)ですが,
実際には /etc/nginx/nginx.conf の httpディレクティブにincludeされているので.

ビルドしたdockerイメージに設定が反映されていないのではないでしょうか.
nginx.confを書き換えた後はdocker-compose build等でイメージビルドし直していますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/18 19:50

    ご回答いただきありがとうございます。
    ディレクティブを考慮できておりませんでした。worker_rlimit_nofileを削除し、
    イメージビルドし直したところ、正常にブラウザでアクセスすることができました。
    nginx.confはビルドと関係ないと思ってしまっていたため、ビルドしたdockerイメージに設定が反映されていないことが原因でした。ご指摘誠にありがとうございました。

    キャンセル

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

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • nginxに関する質問
  • 【Nginx】Nginx+Railsコンテナでdocker-composeしてブラウザでアクセスすると500の内部サーバエラーが出る