У меня есть веб-сервер (в настоящее время nginx, но может быть и Apache), на котором размещены многие статические веб-сайты в качестве виртуальных. Под «многими» я имею в виду десятки, и я продолжаю добавлять и удалять их.
В моей настройке у меня есть докер-контейнер с traefik и докер-контейнер с nginx. Один и тот же контейнер nginx обслуживает всех этих веб-сайтов (этот вопрос является ключевым в моем вопросе).
Как лучше всего сообщить traefik об этих именах хостов, чтобы traefik мог создавать для него сертификаты Let's Encrypt и направлять трафик в этот контейнер?
Стандартный способ, по-видимому, заключается в использовании метки на контейнере nginx, например
docker run ...
-l traefik.backend=webserver \
-l traefik.port=80 \
-l traefik.frontend.rule="Host:example.com,www.example.com,docs.example.com,example.net,www.example.net,docs.example.net,example.org,www.example.org,example.de,www.example.de,development.com,www.development.com"
и т. Д. Этот список можно продолжать и продолжать и продолжать. Это работает, но:
Это не очень поддерживаемо.
Хуже того, Трафик, кажется, тянет один сертификат для всех этих имен. Допустим, development.com - это совершенно другая сущность, чем example.com, и я не хочу, чтобы они оба были указаны в одном сертификате.
Еще хуже, скажем, я где-то допустил ошибку. Я неправильно настроил docs.example.net. Или, что еще хуже, они все работают, но потом я забуду обновить example.net. И мой сертификат Let's Encrypt должен быть обновлен. Теперь это обновление будет неудачным, потому что, если какое-либо из имен хостов не будет проверено, Let's Encrypt откажется от сертификата, что является абсолютно правильным. Но означает, что все мои сайты будут недоступны, внезапно в любое непозволительное время в будущем, если у любого имен хостов возникнет проблема. Это большой риск. Риск, который не следует принимать. Веб-сайты должны быть независимыми в сертификате.
Похоже, я не использую это право. Итак, мой вопрос: как мне лучше настроить это так, чтобы каждый веб-сайт был независимым (в конфигурации traefik и особенно в SSL-сертификате), но я все еще использую только один контейнер веб-сервера для всех из них?
Вот что я попробовал:
- Я попытался вручную настроить сертификаты в разделах [acme]:
[[acme.domains]]
main = "example.com"
sans = [ "www.example.com" ]
[[acme.domains]]
main = "example.org"
sans = [ "www.example.org" ]
Это выглядит для меня более вменяемым, чем длинная строка метки в Docker Run. Очевидно, traefik пытается получить эти сертификаты и записывает их в acme.json. Но, похоже, не использует их. Даже с этими строками traefik по-прежнему использует сертификат, имеющий все имена хостов из traefik.frontend.rule
, вместо настроенного вручную, более конкретного сертификата. Это кажется опрометчивым.
Кроме того, если я удаляю имя хоста из traefik.frontend.rule
, traefik не находит бэкэнд и возвращает 404 клиенту. Это логично, потому что traefik не знает, куда направить трафик для этого хоста.
- Я пытался настроить правила [внешнего интерфейса].
[frontends]
[frontends.example]
backend = "webserver"
[frontends.example.routes.com]
rule = "Host:example.com,www.example.com,docs.example.com"
[frontends.example.routes.org]
rule = "Host:example.org,www.example.org,docs.example.org"
...
Кажется, это правильное направление, хотя директивы конфигурации очень болтливы, особенно. все заголовки разделов.
Но я не мог заставить это работать, все, что я получил, было "backend not found" в журнале доступа traefik.