3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

既存のRailsアプリにNginxを導入しよう!(Docker, docker-compose)

Last updated at Posted at 2020-12-05

前回の記事で作ったRailsアプリにNginxを導入していきます。やっとここまできた!

環境

  • Docker 19.03.13
  • docker-compose 1.27.4

Dockerfile

rails_test/containers/nginx/Dockerfile
FROM nginx:1.15.8

RUN rm -f /etc/nginx/conf.d/*

ADD nginx.conf /etc/nginx/conf.d/rails_test.conf

CMD /usr/sbin/nginx -g 'daemon off;'

Dockerfileを新しくディレクトリを作ってそこに置きます。ここらへんのファイル構成は任意です。
特にNginxの記事と変わったところはありませんのであまり説明しませんが、新しく設定ファイルを作成して保存するためADDしています。余計な設定ファイルはrmで消しておきます。

nginx.conf

設定ファイルを書きます。

rails_test/containers/nginx/nginx.conf
upstream rails_test {
    server unix:///rails_test/tmp/sockets/puma.sock;
}

server {
    listen 80;
    server_name localhost;

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

    root /rails_test/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 @rails_test;
    keepalive_timeout 5;

    location @rails_test {
        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://rails_test;
    }
}

ソケット通信をするためupstreamにてパスを指定しています。

docker-compose.yml

以下に修正します。

docker-compose.yml
version: '3'
services: 
  app:
    build: .
    volumes: 
      - .:/rails_test
+     - tmp-data:/rails_test/tmp
+     - public-data:/rails_test/public
+    command: puma -C config/puma.rb
-    command: bash -c "rm -f tmp/pids/server.pid && rails s -b 0.0.0.0"
-    ports:
-      - 3000:3000
    environment:
      WEBPACKER_DEV_SERVER_HOST: webpacker
    env_file: 
      - ./environments/db.env
    depends_on: 
      - db
  webpacker:
    build: .
  environment:
    NODE_ENV: development
    RAILS_ENV: development
    WEBPACKER_DEV_SERVER_HOST: 0.0.0.0
  volumes: 
    - .:/rails_test
  command: ./bin/webpack-dev-server
  ports:
    - 3035:3035
+ web:
+   build:
+     context: containers/nginx
+   volumes:
+     - public-data:/rails_test/public
+     - tmp-data:/rails_test/tmp
+   ports:
+     - 80:80
+   depends_on:
+     - app
  db:
    image: mysql:5.7
    volumes: 
      - rails-db:/var/lib/mysql
    env_file: 
      - ./environments/db.env
volumes: 
  rails-db:
+ tmp-data:
+ public-data:

ソケット通信するので3000番ポートが必要なくなります。コマンドも直接pumaを起動するものに変更します。
また、tmpディレクトリを永続化してNginxでpuma.sockを見れるようにしています。

puma.rb

pumaのファイルにて以下修正します。差分のみ表示しています。

puma.rb
- port        ENV.fetch("PORT") { 3000 }
+ app_root = File.expand_path("../..", __FILE__)
+ bind "unix://#{app_root}/tmp/sockets/puma.sock"

あとは前回同様にビルドしたのちに起動すればNginxとRailsにアクセスできます。

$ docker-compose build
$ docker-compose up -d
$ curl http://localhost
<!DOCTYPE html>
<html>
<head>
  <title>Ruby on Rails</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
             ・
             ・
             ・

所感

これで本番環境とほぼ同じ構成にできました。あとはこれをECSを使ってEC2で動かすのみといったところです。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?