LoginSignup
0
2

More than 3 years have passed since last update.

DockerでVMへのリバースプロキシ

Last updated at Posted at 2020-08-13

前回:VMサーバーをコンテナに移行する計画
これはそろそろDockerを使えるようになりたい筆者の試行錯誤の軌跡です。

あらすじ

VMサーバー群をコンテナに置き換えるために、一旦コンテナからVMへリバースプロキシしたい。

Untitled(3) (1).png
画像のように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. 1つめのserverセクションにより、HTTPSにリダイレクトされます。
  2. HTTPSでのアクセスになり、2つめのserverセクションに処理され、DeployHTTPで転送します。
  3. 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)

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2