前回の記事で作った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で動かすのみといったところです。