質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Q&A

解決済

1回答

1491閲覧

Amazon EC2上のDockerコンテナ上に立てたRailsアプリをSSL化できない。

T.Adams

総合スコア40

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

0グッド

0クリップ

投稿2020/06/07 10:16

編集2020/06/07 10:32

前提

AWSのEC2上に作成したRailsアプリをSSL化させたいと考え、以下を参考にしました。

【画像付きで丁寧に解説】AWS(EC2)にRailsアプリをイチから上げる方法

異なる点は、私の環境では、WebサーバにNginx、RailsアプリとWebサーバ、DBサーバがdockerコンテナ上に構成されているという点です。

疑問点

nginx.confファイルを記事を参考に修正すると、docker-compose logsコマンドを実行すると以下が出る。なお、web_1はnginxを動作させているコンテナ名です。

web_1 | 2020/06/07 10:06:22 [emerg] 6#6: no "ssl_certificate" is defined for the "listen ... ssl" directive in /etc/nginx/nginx.conf:52 web_1 | nginx: [emerg] no "ssl_certificate" is defined for the "listen ... ssl" directive in /etc/nginx/nginx.conf:52

SSL証明書が存在しないという旨のエラーメッセージが出ていますが、記事に記載されている「3.Route53の設定」の部分で既に設定しているという認識です。何か確認の漏れがあるでしょうか。ご助言いただければと思います。

/etc/nginx/nginx.confの中身は以下です。

conf

1 2user nginx; 3worker_processes 1; 4 5error_log /var/log/nginx/error.log warn; 6pid /var/run/nginx.pid; 7 8 9events { 10 worker_connections 1024; 11} 12 13 14http { 15 include /etc/nginx/mime.types; 16 default_type application/octet-stream; 17 18 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 19 '$status $body_bytes_sent "$http_referer" ' 20 '"$http_user_agent" "$http_x_forwarded_for"'; 21 22 access_log /var/log/nginx/access.log main; 23 24 sendfile on; 25 #tcp_nopush on; 26 27 keepalive_timeout 65; 28 29 #gzip on; 30 31 include /etc/nginx/conf.d/*.conf; 32 33 server { 34 listen 80; 35 proxy_set_header X-Forwarded-Proto $scheme; 36 if ( $http_x_forwarded_proto != 'https' ) { 37 return 301 https://$host$request_uri; 38 } 39 40 location / { 41 } 42 43 error_page 404 /404.html; 44 location = /40x.html { 45 } 46 47 error_page 500 502 503 504 /50x.html; 48 location = /50x.html { 49 } 50 } 51 52 server { 53 listen 443 ssl; 54 server_name www.test.example.com; 55 } 56}

補足

参考にした記事4.Nginxの設定通りにnginx.confをhttpディレクティブに記載すると、下記エラーが出たため、疑問点に記述した方式をとりました。include /etc/nginx/default.d/*.conf;の記載位置が異なります。

web_1 | 2020/06/07 09:59:46 [emerg] 6#6: "upstream" directive is not allowed here in /etc/nginx/conf.d/railsapp.conf:1 web_1 | nginx: [emerg] "upstream" directive is not allowed here in /etc/nginx/conf.d/railsapp.conf:1
#server{}欄を以下の通り修正 #httpでアクセスされたものをhttpsにリダイレクト server { listen 80; proxy_set_header X-Forwarded-Proto $scheme; if ( $http_x_forwarded_proto != 'https' ) { return 301 https://$host$request_uri; } # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } } #httpsサーバー server { listen 443 ssl; server_name www.greeting-app.xyz;#ドメイン名に修正 }

バージョン情報

  • Rails 5.2.4
  • Ruby 2.7.2
  • nginx 1.17.8
  • Docker version 19.03.6-ce, build 369ce74
  • docker-compose version 1.25.4, build 8d51620a

参考文献(他も含む)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

参考にしているQiita記事ではロードバランサがSSL終端になっています.
すなわち,エンドユーザ → ロードバランサ間はhttpsで接続し, ロードバランサ → nginx 間は httpで接続します.
このため,nginxでは443で接続を待ち受けませんし,httpsの設定は不要です.

一方で,作成したnginx.confでは直接443でhttps接続を待ち受けようとしています.
このとき,nginxが直接証明書ファイルを参照できる必要がありますが,その設定がありません.
このため,エラーの通り証明書に関する設定がないので no "ssl_certificate" is defined とエラーが出ています.

対策としては2つで,1つは参考記事の通りロードバランサを利用する方法.
詳細は記事の通りなので省略します.
もう1つはLet's Encrypt等他の証明書発行サービスを利用して証明書を取得して,nginxの設定として指定する方法.
この方法であれば期待するnginxでhttps接続を待ち受けることが可能です.

逆に,AWS Certificate Managerは証明書のエクスポートは対応していないので,
AWS Certificate Managerで証明書を発行し,その証明書を利用してnginxでhttpsに利用するということはできません.

投稿2020/06/07 14:44

thaim

総合スコア175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

T.Adams

2020/06/08 03:42

ご回答ありがとうございました。上記、nginx.confファイルから、server { listen .... } の部分を取り除き、コンテナ再起動しましたら、正常に起動できました。本件はこれでクローズですが、ブラウザから、ドメインにアクセスしたところ、http, httpsでアクセスした時、共に「503 Service Temporarily Unavailable」が出てしまいました。引き続き調査行います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問