Traefik: Как мне лучше настроить множество веб-сайтов (статических виртуальных хостов) в одном и том же внутреннем контейнере? - PullRequest
0 голосов
/ 11 января 2019

У меня есть веб-сервер (в настоящее время 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-сертификате), но я все еще использую только один контейнер веб-сервера для всех из них?

Вот что я попробовал:

  1. Я попытался вручную настроить сертификаты в разделах [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 не знает, куда направить трафик для этого хоста.

  1. Я пытался настроить правила [внешнего интерфейса].

    [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.

...