SSL を使用して nginx + proxy_pass を Docker コンテナに送信する方法は?

SSL を使用して nginx + proxy_pass を Docker コンテナに送信する方法は?

サーバー上で複数のサイトを提供したい。各サイトはdocker-composeビルドとしてラップし、それぞれに1つのポートをリッスンする独自のnginxを持っている。

ホスト名が site1.com のサイトがあります。docker compose はポート 81 を公開します。

...
services:
  web:
    image: nginx
    ...
    ports:
      - '81:443'
    ...
...

そして、クライアントnginx(コンテナ内)は443ですべてをリッスンし、すべてのSSL設定を持っています

server {
        listen 443 ssl;

        ssl_certificate /etc/letsencrypt/fullchain1.pem;
        ssl_certificate_key /etc/letsencrypt/privkey1.pem;
    
        # ...
        # and everything else
}

以下はホスト nginx です。server_name に従ってポート 80 から 81 に渡しています。

server {
        listen 80;
        listen [::]:80;

        server_name site1.com;

        location / {
                proxy_pass https://localhost:81;
        }
}

今のところは動作しています。ただし、安全ではありません。そのため、443 転送を追加してみます。

server {
        listen 443;
        listen [::]:443;
        server_name bederdinov.me;

        location / {
                proxy_pass https://localhost:81;
        }
}

https://site1.comNginxは正常に再起動しましたが、ERR_SSL_PROTOCOL_ERROR

非常に明白なようです - ホスト nginx は SSL でリクエストを処理しようとしていますが、docker クライアント nginx だけがその方法を知っています

ホスト nginx に何もする必要がなく、すべての作業をクライアント nginx に渡すだけであることを伝えるにはどうすればよいですか? または、このタスクに使用できる別のサーバー ソフトウェアがあるでしょうか?

答え1

SSL ターミネーションは、コンテナ外の nginx によって処理されます。そこで SSL オプションを構成する必要があります。リバース プロキシと同じホスト上で実行されている限り、コンテナ内で SSL を構成する必要はありません。

関連情報