前提・実現したいこと
現在Docker環境で作成したアプリケーションをECS(fargate)を用いてデプロイしております。(本番環境でのデプロイまで実装済み)
デプロイ後にアプリケーションをブラウザで確認したところ,本番環境で立ち上がることは確認できたのですが、RailsアプリケーションではなくWelcome to nginx!
が表示されてしまいます。
おそらくローカル環境で、nginxがデフォルトで表示される設定になっているのではないかと疑っております。
パブリックIPアドレス、DNS、独自ドメインでそれぞれアクセスしてみましたが、すべてWelcome to nginx!
が表示されました。
発生している問題・エラーメッセージ
エラーなどは特に起きておらず、Welcome to nginx!
がブラウザで表示される。
独自ドメインでのアクセス
Railsは正常に立ち上がっており、原因はnginxにあると考えております。
ECS/サービスのタスク上のログ
- Railsコンテナ
2021-07-28 18:05:43Use Ctrl-C to stop 2021-07-28 18:05:43* PID: 1 2021-07-28 18:05:43* Listening on http://0.0.0.0:3000 2021-07-28 18:05:43Puma starting in single mode... 2021-07-28 18:05:43* Puma version: 5.2.2 (ruby 3.0.1-p64) ("Fettisdagsbulle") 2021-07-28 18:05:43* Min threads: 5 2021-07-28 18:05:43* Max threads: 5 2021-07-28 18:05:43* Environment: production 2021-07-28 18:05:39=> Booting Puma 2021-07-28 18:05:39=> Rails 6.1.3.1 application starting in production 2021-07-28 18:05:39=> Run `bin/rails server --help` for more startup options 2021-07-28 18:05:20Database 'locat' already exists
Listening on http://0.0.0.0:3000
にアクセスするとRailsアプリケーションが立ち上がるのですが、こちらはローカルからの立ち上げになりますでしょうか?
(理由は立ち上げのログを見ると、ローカル上のDockerログが確認できるため)
- nginxコンテナ
2021-07-28 18:05:05/docker-entrypoint.sh: Configuration complete; ready for start up 2021-07-28 18:05:0510-listen-on-ipv6-by-default.sh: error: /etc/nginx/conf.d/default.conf differs from the packaged version 2021-07-28 18:05:05/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh 2021-07-28 18:05:0510-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf 2021-07-28 18:05:05/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 2021-07-28 18:05:05/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration 2021-07-28 18:05:05/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
本番環境でエラーなどは起きていない
本番環境上のエラーから起きているのではなく、ローカルで設定しているnginxファイルを修正する必要があるとわかりました。
ECS周りの設定などを調べてみましたが、設定などは正しく入力されていたのでDocker関係の設定に原因があると考えています。
該当のソースコード
Dockerfile (Rails)
FROM ruby:3.0.1 ENV RAILS_ENV=production RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs yarn WORKDIR /locat COPY Gemfile /locat/Gemfile COPY Gemfile.lock /locat/Gemfile.lock RUN gem install bundler RUN bundle install COPY . /locat COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 VOLUME /locat/public VOLUME /locat/tmp CMD ["rails", "server", "-b", "0.0.0.0"]
containers/nginx/Dockerfile
FROM nginx:1.19.1 RUN apt-get update && \ apt-get install -y apt-utils \ locales && \ sed -i -e 's/# ja_JP.UTF-8/ja_JP.UTF-8/g' /etc/locale.gen && \ locale-gen ja_JP.UTF-8 ENV LANG ja_JP.UTF-8 ENV LC_TIME C COPY ./nginx.conf /etc/nginx/nginx.conf COPY ./conf.d/default.conf /etc/nginx/conf.d/default.conf
containers/nginx/nginx.conf
user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; keepalive_timeout 600; include /etc/nginx/conf.d/*.conf; }
containers/nginx/conf.d/default.conf
upstream unicorn { server 127.0.0.1:3000; } server { listen 80 default_server; server_name localhost; root /usr/share/nginx/html; try_files $uri/index.html $uri @unicorn; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; location @unicorn { 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://unicorn; } }
docker-compose.yml
version: '3' services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: root ports: - "4306:3306" volumes: - ./mysql-confd:/etc/mysql/conf.d web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/locat ports: - 3000:3000 depends_on: - db tty: true stdin_open: true volumes: mysql-data:
試したこと
- 原因がdefault.confにあると考えており、今回unicornではなくpumaで動いていることに加えて、server_nameをローカルホストから本番環境のドメインに変更する必要があるのではと仮説を立てました。
upstream puma { server unix:////tmp/sockets/puma.sock;; } pumaに変更する必要があるのでは? server { listen 80 default_server; server_name localhost; localhostの部分をタスク内のパブリックIPアドレス、独自ドメインに指定する必要があるのでは? root /usr/share/nginx/html; root /locat/public; こちらの記述にルートを変更する必要があるのでは? try_files $uri/index.html $uri @unicorn; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; location @unicorn { 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://unicorn; } unicornの部分をpumaに修正する必要があるのでは? }
修正したファイル
nginx/Dockerfile
FROM nginx:1.19.1 RUN apt-get update && \ apt-get install -y apt-utils \ locales && \ sed -i -e 's/# ja_JP.UTF-8/ja_JP.UTF-8/g' /etc/locale.gen && \ locale-gen ja_JP.UTF-8 ENV LANG ja_JP.UTF-8 ENV LC_TIME C ADD ./nginx/nginx.conf /etc/nginx/nginx.conf ADD ./nginx/default.conf /etc/nginx/conf.d/default.conf
nginx/default.conf
upstream locat { server unix:///locat/tmp/sockets/puma.sock; } server { listen 80 default_server; server_name locat-app.com; root /locat/public; try_files $uri/index.html $uri @locat; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; location / { 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://locat; } }
puma.rb
# Puma can serve each request in a thread from an internal thread pool. # The `threads` method setting takes two numbers: a minimum and maximum. # Any libraries that use thread pools should be configured to match # the maximum value specified for Puma. Default is set to 5 threads for minimum # and maximum; this matches the default thread size of Active Record. # max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } threads min_threads_count, max_threads_count # Specifies the `worker_timeout` threshold that Puma will use to wait before # terminating a worker in development environments. # worker_timeout 3600 if ENV.fetch("RAILS_ENV", "development") == "development" # Specifies the `port` that Puma will listen on to receive requests; default is 3000. # port ENV.fetch("PORT") { 3000 } # Specifies the `environment` that Puma will run in. # environment ENV.fetch("RAILS_ENV") { "development" } # Specifies the `pidfile` that Puma will use. pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" } # Specifies the number of `workers` to boot in clustered mode. # Workers are forked web server processes. If using threads and workers together # the concurrency of the application would be max `threads` * `workers`. # Workers do not work on JRuby or Windows (both of which do not support # processes). # # workers ENV.fetch("WEB_CONCURRENCY") { 2 } # Use the `preload_app!` method when specifying a `workers` number. # This directive tells Puma to first boot the application and load code # before forking the application. This takes advantage of Copy On Write # process behavior so workers use less memory. # # preload_app! # Allow puma to be restarted by `rails restart` command. plugin :tmp_restart app_root = File.expand_path('..', __dir__) bind "unix://#{app_root}/tmp/sockets/puma.sock" stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true
- nginxファイル、pumaの設定などに変更を加えてみましたが、変わらず
Welcome to nginx!
が表示されました。
- タスクは Railsコンテナ(
ローカルでRails用に設定しているDockerfile
)とnginxコンテナ(ローカルでnginx用に作成したDockerfile
)を独立して作成しております。
補足情報(FW/ツールのバージョンなど)
開発環境
- rubymine
- ruby(3.0.1)
- Ruby on rails (6.1.3.1)
- Docker (20.10.7)
- AWS(ECS Fargate/ECR/VPC/ACM/ALB/S3/RDS/Route53)
- Github
あなたの回答
tips
プレビュー