プロメモグラム

誰が見てもわかるような文章を目指す

Railsデプロイで困ったことメモ

調べながら解決していったので、自分の詰まったところとそのリンクのまとめに近い。

やっていること

  1. 規模が小さい趣味プログラムをサブディレクトリによって、複数のWebサービスを同一のサーバで起動させる。
  2. HTTPSの設定と、HTTPへのリクエストをHTTPSにリダイレクト。

環境

Rails側設定

/config/environments/production.rb

SSLの強制、/publicの公開、サイトのトップページをサブディレクトリに。

config.force_ssl = true
config.public_file_server.enabled = true
ENV["RAILS_RELATIVE_URL_ROOT"] = "/siteA"
Rails.application.config.relative_url_root = "/siteA"

/config.ru

サブディレクトリで起動するように変更。

require_relative 'config/environment'

map ActionController::Base.config.relative_url_root || "/" do
        run Rails.application
end

/config/puma.rb

ここで、nginxで振り分けるsockを生成する設定。 ポート番号もアプリごとに分ける。

_app_path = "#{File.expand_path("../..", __FILE__)}"
_app_name = File.basename(_app_path)
_home = ENV.fetch("HOME") { "/home/アプリケーションのディレクトリ" }
pidfile "#{_home}/run/#{_app_name}.pid"
bind "unix://#{_home}/run/#{_app_name}.sock"
daemonize true
directory _app_path
port        ENV.fetch("PORT") { ポート番号をアプリごとに設定 }

nginx側設定

設定ファイルをいじり、サブディレクトリをRailsのアプリケーションのポートに振り分ける。 Rails側のタイムアウトの時間設定はproxyのタイムアウトで設定するのが注意どころ。

upstream siteA {
  server unix:///home/~/run/~.sock fail_timeout=0;
}
upstream siteB {
  server unix:///home/~/run/~.sock fail_timeout=0;
}
server {
        listen 80;
        server_name www.example.com;
        return 301 https://$host$request_uri;
}
server {
        server_name www.example.com;
        listen 443 default ssl;
        ssl on;
        ssl_certificate     /etc/letsencrypt/live/www.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
        location /pll {
                proxy_pass http://siteA;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Proto https;
                proxy_redirect off;
        }
        location /hateconcat {
                proxy_pass http://siteB;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host $http_host;
                proxy_set_header X-Forwarded-Proto https;
                proxy_redirect off;
        }

        location / {
                root /var/www/html;
                index index.html;
        }

        error_page 500 502 503 504 /500.html;
        client_max_body_size 4G;
        proxy_connect_timeout       605;
        proxy_send_timeout          605;
        proxy_read_timeout          605;
        send_timeout                605;
        keepalive_timeout           605;
}

問題と解決のリンク

サブディレクトリへの展開

An unhandled lowlevel error occurred.

このようなエラーはSECRET_KEY_BASEが無いときに出ることが多いらしい。 起動時に環境変数を渡してあげる。

puma_error.logで確認できるのでわかりやすい。

Assetsをプリコンパイルしても、404エラーが出る。

プロダクション環境ではデフォルトでは、public/を公開しない。おそらくnginxなどに委ねることもできるからだと思う。