jwilder/nginx-proxy: не может интегрировать ssl с Nginx
Мы работаем над настройкой хостинга нескольких веб-сайтов с одним портом и jwilder/nginx-proxy через SSL. Мы можем развернуть решение без ssl и оно работает нормально, но пока мы пытаемся поставить его с SSL, его сбой при вызове HTTPs. Наш файл docker-compose выглядит так:
докер-compose.yml
site1:
build: site1
environment:
VIRTUAL_HOST: site1.domainlocal.com
VIRTUAL_PROTO: https
restart: always
site2:
build: site2
environment:
VIRTUAL_HOST: site2.domainlocal.com
VIRTUAL_PROTO: https
restart: always
site3:
build: site3
environment:
VIRTUAL_HOST: site3.domainlocal.com
VIRTUAL_PROTO: https
restart: always
nginx-proxy:
image: jwilder/nginx-proxy:alpine
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- certs:/etc/nginx/certs:ro
restart: always
privileged: true
PS: папка "certs" находится в той же папке, что и файл docker-compose.
Использование самозаверяющего сертификата с использованием openssl
Структура папок выглядит так:
Main_folder-|
|- docker-compose.yml
|
|- certs/.csr and .key files
|
|- site1/Dockerfile + Nodejs
|- site2/Dockerfile + Nodejs
|- site3/Dockerfile + Nodejs
Пожалуйста, предложите возможную причину проблемы и ее решение.
Вывод докера ps:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c71b52c3e6bd compose_site3 "/bin/sh -c 'node ..." 3 days ago Up 3 days 80/tcp compose_site3_1
41ffb9ec3983 jwilder/nginx-proxy "/app/docker-entry..." 3 days ago Up 3 days 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp compose_nginx-proxy_1
a154257c62ec compose_site1 "/bin/sh -c 'node ..." 3 days ago Up 3 days 80/tcp compose_site1_1
3ed556e9287e compose_site2 "/bin/sh -c 'node ..." 3 days ago Up 3 days 80/tcp compose_site2_1
2 ответа
Поэтому, потратив на это столько времени, я наконец смог решить проблему. Таким образом, для интеграции ssl с jwilder/nginx-proxy не требуется указывать сертификат и ключ в имени домена, вместо этого он может иметь любое имя, просто вам нужно указать имя сертификата в файле docker-compose (я нашел такой подход просто ударом и пробой). Итак, ваш составной файл докера должен выглядеть так:
site1:
build: site1
environment:
VIRTUAL_HOST: site1.domainlocal.com
CERT_NAME: mycertificate
volumes:
- /etc/ssl/certs:/etc/ssl/certs:ro
restart: always
site2:
build: site2
environment:
VIRTUAL_HOST: site2.domainlocal.com
CERT_NAME: mycertificate
volumes:
- /etc/ssl/certs:/etc/ssl/certs:ro
restart: always
site3:
build: site3
environment:
VIRTUAL_HOST: site3.domainlocal.com
CERT_NAME: mycertificate
volumes:
- /etc/ssl/certs:/etc/ssl/certs:ro
restart: always
nginx-proxy:
image: jwilder/nginx-proxy:alpine
ports:
- "80:80"
- "443:443"
environment:
DEFAULT_HOST: domainlocal.com #default host
CERT_NAME: mycertificate # Wildcard Certificate name without extension
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /etc/ssl/certs:/etc/nginx/certs #certificate path in docker container
restart: always
privileged: true
и просто соберите и запустите compose, используя "docker-compose up --build", и поздравляем вас теперь с защищенным слоем.
Ваш сертификат должен заканчиваться расширением.crt, а не.csr. Также убедитесь, что он назван соответствующим образом для домена, соответствующего переменной VIRTUAL_HOST. Согласно документации:
Сертификат и ключи должны быть названы в честь виртуального хоста с расширением.crt и.key. Например, контейнер с VIRTUAL_HOST=foo.bar.com должен иметь файл foo.bar.com.crt и foo.bar.com.key в каталоге certs.