Ищу совет и одноранговый ввод - в настоящее время я пытаюсь настроить 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
чтобы добавить конфигурацию домена в другой файл.
Тем не менее, в конечном итоге система управления конфигурацией - лучший вариант.