前回:VMサーバーをコンテナに移行する計画
これはそろそろDockerを使えるようになりたい筆者の試行錯誤の軌跡です。
あらすじ
VMサーバー群をコンテナに置き換えるために、一旦コンテナからVMへリバースプロキシしたい。
画像のようにnginxのコンテナを起動し、VMにリバースプロキシするよう設定し、http系のアクセスがVMからコンテナに向くよう変更しました。
が、つながりませんでした。
ブラウザにはERR_SSL_PROTOCOL_ERRORと表示されており、コンテナのnginxは文字化けしていて解読できませんでした。
とりあえず進展があったので記事にしますが、正しい理屈はまだ理解しておらず、うまく動いたケースの分析を根拠にしています。
原因①SSL証明書のインストール場所
SSL証明書がDeployにしかないためにエラーになったのだと思います。
コンテナのリバースプロキシを挟む前はDeployがWANからの窓口になっていたので、Deployに全サービスのSSL証明書がインストールされています。
また、常時SSLにしており、HTTPでDeployにアクセスすると、HSTSを設定した上でHTTPSのアクセスへリダイレクトします。
だからブラウザはHTTPSで通信しますが、リバースプロキシサーバーにSSL証明書がないので、認証できないですね。
- HTTPSでアクセスしなければならない
- 認証できない
の板挟みでエラーになっていたと推測できます。
原因②凡ミス
SSL証明書をDeployからコンテナのリバースプロキシに移動しましたが、エラーは解消されませんでした。
このとき、コンテナのリバースプロキシは以下のような設定をしていました。
server {
listen 80;
listen [::]:80;
server_name [ドメイン名];
include /etc/nginx/params/hsts_params;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name [ドメイン名];
root /var/www/html;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS';
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_certificate /etc/letsencrypt/live/[ドメイン]/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/[ドメイン]/privkey.pem;
location / {
include /etc/nginx/params/proxy_params;
proxy_pass http://[DeployのローカルIP];
}
}
おわかりいただけたでしょうか。
ブラウザからHTTPでアクセスしたとしましょう。
- 1つめのserverセクションにより、HTTPSにリダイレクトされます。
- HTTPSでのアクセスになり、2つめのserverセクションに処理され、DeployへHTTPで転送します。
- HTTPを受けたDeployも常時SSL設定のため、HTTPSでのリダイレクト指示を出します。
この3ステップで無限ループができていました。
上記設定ファイルのDeployへの転送をHTTPSにしてあげる、もしくはDeployでHTTPも受け入れるようにすれば問題解決です。
(どっちがベターなのかわかりません。教えていただけると幸いです。)
(前者だとリバースプロキシサーバーにも転送先にもSSL証明書が必要になってしまうので、後者のほうがいいのかなと思っています。)
今後の展望
これでとりあえず、コンテナのリバースプロキシを介して、VMサーバー群をこれまでどおり使えるようになりました。
あとはサービスを一つずつコンテナにして、リバースプロキシの向きを変えるという作業の繰り返しになります。
大きく分類して、
- PHP製のアプリケーション(owncloud)
- Ruby制のアプリケーション(gitlab)
- Python制のアプリケーション
- Node.js制のアプリケーション
- 静的コンテンツ
の5種類コンテンツがあります。
順に取り上げて作業していきます。
次回:VMのgitlabをコンテナへ(ついでにバージョンアップ 12.0.3→13.2.4)(ついでにdocker-compose)