Назад | Перейти на главную страницу

В: NGINX - динамическое сопоставление нескольких разных доменных имен через «карту» для использования в качестве «имя_сервера»

Ищу совет и одноранговый ввод - в настоящее время я пытаюсь настроить NGINX таким образом, чтобы я мог одновременно настраивать несколько веб-сайтов без необходимости настраивать отдельные конфигурации VHost или объявлять несколько записей 'server {}' с повторяющейся конфигурацией параметры в моей конфигурации NGINX. Пока что у меня частичный успех, но меня беспокоит, что это может создать проблемы с безопасностью или случайно получить слишком широкий диапазон. Я также не уверен, как правильно / правильно использовать значение "по умолчанию" в директиве 'map'.

В общем, в настоящее время у меня есть типичная конфигурация NGINX с двумя конфигурациями VHost для одного доменного имени (и поддомена www. * Для него) в nginx_root / sites-available - одна для HTTP (порт 80) и одна для HTTPS (порт 443), которые мягко привязаны к 'nginx_root / sites-enabled'. Но, как упоминалось ранее, я хотел бы добавить дополнительные доменные имена, но сохранить количество и размер этих конфигураций, как они есть в настоящее время, используя функции карты NGINX для динамической настройки новых доменных имен.

На данный момент я сопоставил его с помощью создания файла конфигурации: 'nginx_root / mapped_fqdn.conf', который я затем включил в начале своей конфигурации NGINX (чтобы он отображался до того, как он будет вызван / на него будет ссылаться далее в конфигурации) а затем используя карту как параметр server_name. Если это возможно расширить до других параметров конфигурации и безопасно, я хотел бы добавить новые доменные имена таким же образом.

mapped_fqdn.conf:

### Domain name mapping
    map $host $fqdn_map {
        hostnames;
        default 0;

        domain-1.com 0;
        www.domain-1.com 0;
    }

00-http.conf:

server {
    listen 80;
    listen [::]:80;
    server_name $fqdn_map;
    root /var/www/public_html;
    index index.html;
    access_log /var/log/nginx/nginx_access.log nginx_access;;

    ### HTTP to HTTPS Redirect
    return 301 https://$server_name$request_uri;
}

Чтобы не повторяться, я пропущу добавление конфигурации HTTPS, которая выглядит примерно так же, за исключением того, что она имеет несколько второстепенных дополнительных параметров, а также добавлены параметры конфигурации, специфичные для SSL, и не имеет перенаправления 301, которое является присутствует в конфигурации HTTP.

На мой взгляд, я могу добавить дополнительные доменные имена таким же образом ...

пример обновленного mapped_fqdn.conf: (я вижу, что, возможно, добавление определенных поддоменов будет безопаснее, чем добавление их как подстановочных знаков, например: «* .domain.com»)

### Domain name mapping
    map $host $fqdn_map {
        hostnames;
        default 0;

        domain-1.com 10;
        www.domain-1.com 11;

        domain-2.co.uk 20;
        www.domain-2.co.uk 21;
        subdomain1.domain-2.co.uk 22;
        subdomain2.domain-2.co.uk 23;

        domain-3.com 30;
        www.domain-3.com 31;
        subdomain1.domain-3.com 32;
    }

пример обновленного 00-http.conf:

server {
    listen 80;
    listen [::]:80;
    server_name $fqdn_map;
    root /var/www/$fqdn_map/public_html;
    index index.html;
    access_log /var/log/nginx/$fqdn_map-nginx_access.log nginx_access;;

    ### HTTP to HTTPS Redirect
    return 301 https://$server_name$request_uri;
}

Однако, прежде чем продолжить, меня беспокоит, как это будет работать с каталогами, например: Let's Encrypt сертификаты для конфигурации HTTPS - можно ли специально выбрать, какие сопоставленные элементы использовать? Например: $ fqdn_map {10 | 20 | 30} (таким образом выбираются только доменные имена без имен поддоменов).

    ssl_client_certificate /etc/ssl/certs/$fqdn_map{10|20|30}/cloudflare_origin.pem;
    ssl_certificate /etc/letsencrypt/live/$fqdn_map{10|20|30}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/$fqdn_map{10|20|30}/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/$fqdn_map{10|20|30}/chain.pem;

Или, возможно, я ошибаюсь, и мне следует сопоставить полное доменное имя и поддомены отдельно ... или, может быть, просто создать символические ссылки и соединения из сопоставленных каталогов поддоменов с каталогами fqdn (что, хотя и приводит к меньшим / более чистым конфигурациям, приводит к большему символическая ссылка как бы побеждает цель «делать меньше, но добиваться большего»)?

Если вы просто хотите сопоставить имена хостов с каталогами сертификатов, вы можете использовать этот подход:

map $http_host $certdir {
    hostnames;

    dom1.example.com dom1;
    dom2.example.com dom2;
    .example.com dom;
}

server {
    listen 443 ssl;

    server_name something.example.com;

    ssl_certificate /path/to/certificates/$certdir/dom.crt;
    ssl_certificate_key /path/to/certificates/$certdir/dom.key;
    ...
}

Вот $certdir значение будет dom, поскольку something.example.com Спички .example.com в map определение.

--- Первый ответ, который отвечал на вопрос, который изначально не задавался ---

Возможно, вы ищете это:

server {
    listen 80 default_server;

    server_name _;

    root /var/www/$host/public_html;

    ....
}

Мы указываем default_server здесь блок, который обрабатывает все запросы, не имеющие соответствующего виртуального хоста в другом месте.

Затем мы используем $host переменная, содержащая доменное имя.

Если вы хотите использовать более конкретное соответствие только для некоторых доменов, используйте регулярное выражение:

server {
     listen 80;

     server_name ~ ^(domain-1.com|domain-2.com)$;

     root /var/www/$host/public_html;

     ....
}

Вы можете уточнить регулярное выражение.

Однако, как я сказал в своем комментарии, это наложит ограничения на то, как вы можете настроить каждый блок сервера. Вы могли бы использовать include /etc/nginx/conf.d/$host.conf чтобы добавить конфигурацию домена в другой файл.

Тем не менее, в конечном итоге система управления конфигурацией - лучший вариант.