railsアプリを公開するため、SSL対応をしました。httpでのアクセスもhttpsで受けられるように自動で設定できる便利な機能があるそうなので、試してみたら上記エラーでハマりました。
前提
rails + unicorn + nginx でアプリを構築しています。
nginxの設定ファイルに、リダイレクト設定を記述しました。
経緯
「/etc/nginx/conf.d/default.conf」
の設定に、「return 301 https://$host$request_uri;」の一文を付け加えます。
「/etc/nginx/conf.d/*****.conf」
*****の部分は、アプリで変更していたのでそのファイル名です。
server {
listen 80;
server_name XXXXX;
return 301 https://$host$request_uri; ← この一文を追加
root /var/www/XXXX/public;
listen 443 ssl;
access_log /var/log/nginx/XXXXX_access.log;
error_log /var/log/nginx/XXXXX_error.log;
location @unicorn {
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_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unicorn;
}
(略)
ssl_certificate /etc/letsencrypt/live/XXXXX/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/XXXXX/privkey.pem;
}
原因
いろいろ調べた結果、「server」という記述内に「listen」が二つあるのは超絶おかしいらしいのです。僕と同じような質問をされていた方の回答の中に、そのようなコメントがありました。何もわからないまま続けていると、こういうことがよくあります。
対策
server {
listen 80;
server_name XXXXX;
return 301 https://$host$request_uri;
root /var/www/XXXX/public;
}
server { ← 段落を追加
listen 443 ssl;
access_log /var/log/nginx/XXXXX_access.log;
error_log /var/log/nginx/XXXXX_error.log;
location @unicorn {
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_set_header X-Forwarded-Proto $scheme;
proxy_pass http://unicorn;
}
(略)
ssl_certificate /etc/letsencrypt/live/XXXXX/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/XXXXX/privkey.pem;
}
「server」 段落を追加して、二つに分けるとうまくいきました。
「http」でも「https」でも、どちらでも「https」で表示できるようになりました。
まとめ
ハマると二日三日は平気で進まなくなってしまうので、自分用に備忘録として残しておきます。
よく考えると、わからないままここまで動いているのって怖いですね。
コメント