#はじめに#
dockerでredashのnginxをssl化したら思いの外ハマった
社内でデータを統計表示するのにredashを使っており、
一応webアクセスできるため、ssl化しておこうとなった
さくっとググった限りでは、手順は簡単だと思っていたが(実際後から振り返ると簡単だった)、
しょうもないところでハマって時間がかかってしまったため、
記録だけ残しておこうと思う
#redash構築#
公式のdocker-composeを使用して構築する
詳細は割愛
#証明書を準備する#
今回はletsencryptなどを使わず、第三者の証明書発行を使用した。
用意したファイルは以下のもの
/root/ssl/とかに配置しておく
証明書 server.crt
中間証明書 server_bundle.crt
証明鍵 server.key
証明書と中間証明書を一緒にしておく
# cat server_bundle.crt >> server.crt
#nginxの設定ファイルを準備する
ホスト側のubuntuに、docker上で適用させるnginx設定ファイルを作成する
# vi /root/nginx/default.conf
upstream redash {
server redash:5000;
}
server {
listen 80 default;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443;
ssl on;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2;
ssl_ciphers "ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS";
gzip on;
gzip_types *;
gzip_proxied any;
server_name example.com;
ssl_certificate /etc/nginx/ssl/server.crt; # サーバー証明書のパス
ssl_certificate_key /etc/nginx/ssl/server.key; # 秘密鍵のパス
error_log /var/log/nginx/nginx_error.log;
access_log /var/log/nginx/nginx_access.log;
location / {
proxy_ssl_server_name on;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_pass http://redash;
}
}
#docker-composeファイルを編集する
docker-compose.ymlの中で、nginxの部分を以下のように編集する
443ポートを通信許可し、
上記で作ったファイルへパスを通す
vi docker-compose.yml
~略
nginx:
image: redash/nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- /root/nginx/default.conf:/etc/nginx/conf.d/default.conf
- /root/ssl:/etc/nginx/ssl
depends_on:
- server
links:
- server:redash
restart: always
#dockerの再構築
準備ができたら一度既存のdocokerを壊し、再構築する
# docker-compose down
# docker-compose up -d
#アクセスする
以下のようなurlでブラウザからアクセスするとhttps化されてるはず
https://IPアドレス/dashboards
#はまったところ
##ファイアウォール
超初歩的なところだが、クラウド上のファイアウォールで443の通信を許可しておらず、
ブラウザでアクセスしようとするたびにタイムアウトになっていた
OS上ではufwをアクティブにしていなかったためしばらく混乱していたが、
クラウド側で通信許可をしたらすぐにつながった
##リダイレクト
nginxのdefault.confにおいて、
当初リダイレクトの部分を下記のようにしており、
ssl化した後も「Bad Gateway」の表示となっていた
proxy_pass https://redash;
上記のurlをhttpにすることで正常な画面を表示させることができた
どうもクライアントからwebアクセスするときは443ポートを使用し、
サーバー内のdockerネットワークにおいて通信するときは80ポートを使用している、
というような仕組みのようである
dockerについて一つ勉強になった。