SSL을 사용하여 nginx + Proxy_pass를 도커 컨테이너에 전달하는 방법은 무엇입니까?

SSL을 사용하여 nginx + Proxy_pass를 도커 컨테이너에 전달하는 방법은 무엇입니까?

내 서버에서 여러 사이트를 서비스하고 싶습니다. docker-compose 빌드로 래핑하려는 각 사이트에는 하나의 단일 포트를 수신하는 자체 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
}

그리고 여기에 server_name에 따라 포트 80에서 81로 전달되는 호스트 nginx가 있습니다.

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;
        }
}

Nginx는 잘 다시 시작되지만, 이동하면 https://site1.com다음과 같은 메시지가 나타납니다.ERR_SSL_PROTOCOL_ERROR

꽤 분명한 것 같습니다. 호스트 nginx가 SSL을 사용하여 요청을 처리하려고 하지만 docker 클라이언트 nginx만이 이를 수행하는 방법을 알고 있습니다.

호스트 nginx에 아무것도 할 필요가 없고 모든 작업을 클라이언트 nginx에 전달하기만 하면 어떻게 알 수 있나요? 아니면 이 작업에 사용할 수 있는 다른 서버 소프트웨어가 있을까요?

답변1

SSL 종료는 컨테이너 외부의 nginx에 의해 처리됩니다. 여기서 SSL 옵션을 구성해야 합니다. 역방향 프록시와 동일한 호스트에서 실행되는 한 컨테이너 내부에 SSL을 구성할 필요가 없습니다.

관련 정보