Unselected Kid Blog

プログラミングを中心に好きなことを好きなように書くブログ

Centos7 + Nginx + Ruby on Rails をVPSにセットアップ その2

独自ドメインSSL + Http2化

ConoHa + お名前.com に独自ドメイン設定

お名前.comで,DNSレコード設定で 登録したいURL Type A で ConoHa の ip を設定する. VPS設定 で IPアドレス の逆引きホスト名に登録したいURLを登録します.

SSL + Http2化

参考文献

qiita.com

SSLは,Let's Encrypt で発行してもらいます.

その為,準備としてNginx を止めます.

systemctl stop nginx

そして ipv6 も無効化しておきます.
ipv6 の ConoHa でポートを閉じておきましょう. cerbot をインストールして自動設定してもらいます.
メールアドレスを聞かれるので設定するのはそこだけです.

yum install epel-release
yum install certbot
certbot-auto certonly --standalone -d URL

次に Nginx の設定です. etc/sysctl.conf に設定した.

    server{
        listen       443 ssl http2;
        server_name URL;
        ssl on;
        ssl_certificate /etc/letsencrypt/live/URL/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/URL/privkey.pem;
        location / {
           proxy_pass http://unicorn;
        }
    }

あとはこのサイトで HTTP2 をテストすることができます.
HTTP/2 Test | A simple HTTP/2.0 test tool

Capistrano で自動デプロイ

qiita.com

Gemfile に追加

group :development, :test do
  gem 'capistrano'#, '~> 3.2.1'
  gem 'capistrano-rails'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano3-unicorn' #Unicornの起動を簡単に行える
end

Capistrano の設定

初期テンプレートファイルを作ってくれるコマンドを叩きます.

bundle exec cap install

作られた Capfile に以下を追記します.

# Load DSL and Setup Up Stages
require 'capistrano/setup'

# Includes default deployment tasks
require 'capistrano/deploy'

require 'capistrano/setup'
require 'capistrano/deploy'

# rbenvを使用している場合
require 'capistrano/rbenv'

# デプロイ先のサーバで、ユーザディレクトリでrbenvをインストールしている場合
set :rbenv_type, :user
set :rbenv_ruby, '2.5.0'

require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'

require 'capistrano3/unicorn'

デプロイ設定

共通部分の設定を config/deploy.rb に記述する

lock '3.10.1'
set :application, "sample"
set :repo_url, "https://GitHub_Personal access tokens:@github.com/GitHub_User/sample.git"
set :deploy_to, '/var/www/sample'
set :rbenv_ruby, '2.5.0'
set :scm, :git
set :log_level, :debug
set :pty, true
set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets bundle public/system public/assets}
set :default_env, { path: "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH" }
set :keep_releases, 5

after 'deploy:publishing', 'deploy:restart'
namespace :deploy do

  desc 'Restart application'
  task :restart do
    invoke 'unicorn:restart'
  end
end

Railsアプリの稼働ディレクトリである/var/www/sampleと設定 config/unicorn/staging.rb

@app_path = '/var/www/sample'
working_directory @app_path + "/current"

worker_processes 2
preload_app true
timeout 30
listen "/tmp/unicorn.sock", :backlog => 64
pid "/var/www/sample/shared/tmp/pids/unicorn.pid"

stderr_path "#{@app_path}/log/unicorn.stderr.log"
stdout_path "#{@app_path}/log/unicorn.stdout.log"

before_fork do |server, worker|
  ENV['BUNDLE_GEMFILE'] = File.expand_path('Gemfile', ENV['RAILS_ROOT'])
end

before_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end

after_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
  end
end

/config/environments/staging.rbは、production.rbをコピー

cp /config/environments/production.rb /config/environments/staging.rb

/config/deploy/staging.rbに対象のサーバとSSHの設定を記述

set :rails_env, "staging"
set :unicorn_rack_env, "staging"

role :app, %w{IP:PORT}
role :web, %w{IP:PORT}

server 'ip', user: 'USER', roles: %w{app web}, port: PORT
set :ssh_options, {
  keys: %w(~/.ssh/SSH_RSA),
  forward_agent: false,
  auth_methods: %w(publickey)
}

最後にデプロイコマンドです.

bundle exec cap staging deploy