Rails + Nginx HTTPSでアクセスをする

Rails + Nginx の環境でHTTPSアクセスをする方法です。

次のような感じでHTTPSアクセスに変更します。

  • 変更前:http://www.example.com -> (Rails) http://127.0.0.1:3000
  • 変更後:https://www.example.com -> (Rails) http://127.0.0.1:3000

環境

  • Rails 5.0.0 (+デフォルトのPuma)
  • Nginx 1.4.6

ステップ1. Nginxの設定

/etc/nginx/nginx.confを次のように設定します。

Rails側のアプリケーションサーバーを127.0.0.1:3000で立ち上げている場合を想定しています。

ssl_certificatessl_certificate_key に指定するサーバー証明書は事前に配置しておきます。自己署名証明書の作り方は『OpenSSL 自己署名証明書(オレオレ証明書)を作成する』を参照ください。

server {
  listen 443 ssl;
  server_name www.example.com;
  ssl_certificate /etc/nginx/conf.d/www.example.com.crt;
  ssl_certificate_key /etc/nginx/conf.d/www.example.com.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!MD5;
  location / {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_redirect off;
    proxy_pass http://127.0.0.1:3000;
  }
}

ポイントは、HTTPSアクセスであることをX-Forwarded-ProtoでRailsへ通知する点です。これがないと『リダイレクトが繰り返し行われました。』のようなメッセージがブラウザで表示されます。

ステップ2. Railsの設定

/config/environments/development.rb または production.rbを開き、SSHアクセスを強制させます。

Rails.application.configure do
 config.force_ssl = true
end

以上でHTTPSアクセスができます。

参考サイト