Поддомены в nginx
Есть необходимость прописать около 70 поддоменов на хосте nginx.
Думаю это же жирно для каждого домена вида company.domain.ru создавать файл?
Как это сделать лучше?
Да, получается у каждого поддомена будет общая строка, это http_proxy, и своя собственная, например IP с которого туда можно попадать.
Да не совсем понимаю как будет выглядеть строка с путем для сертификата Letsencript: в секции для домена, или в общей секции?
Помогите пожалуйста, знаю как решить задачу самым неоптимальным путем, но хочется чтобы было красиво.
Shulman ☆
27.08.21 11:40:01 MSK
У меня было максимум 5 поддоменов — настраивал все, как отдельные сайты (каждый со своим конфигом), в том числе и для LetsEncrypt.
Вероятно, пихнуть в один конфиг можно, ели все поддомены проксируют единственный источник.
ololoid ★★★★
( 27.08.21 11:44:03 MSK )
Ответ на: комментарий от ololoid 27.08.21 11:44:03 MSK
вот и тут так пишут
Shulman ☆
( 27.08.21 11:45:45 MSK ) автор топика
Ответ на: комментарий от Shulman 27.08.21 11:45:45 MSK
server_name xyz.com *.xyz.com;
ololoid ★★★★
( 27.08.21 12:00:52 MSK )
Проще работать с конфигом когда на каждый сайт свой файл. общие части вынеси в отдельный файл (или несколько файлов если там какие-то логически независимые вещи) и подцепляй их инклюдом.
Можно конечно заруливать все домены на один сайт и уже внутри его конфига как-то разбираться с домен-специфичным поведением. Может иметь смысл если домены добавляются динамически (вроде того что в ЖЖ, каждому юзеру по поддомену). Но во-первых это усложняет конфиг сайта, во-вторых нужен будет один сертификат валидный для всех доменов (что, при использовании LE, сложнее вороха сертификатов)
MrClon ★★★★★
( 27.08.21 12:00:52 MSK )
Думаю это же жирно для каждого домена вида company.domain.ru создавать файл?
Если руками и больше доменов не планируется, то ИМХО да, лучше объединить в несколько файлов по другому признаку.
Если количество поддоменов будет дальше расти, то лучше сделать темплейт в ansible и разворачивать им в отдельных файлах. ИМХО.
Да не совсем понимаю как будет выглядеть строка с путем для сертификата Letsencript: в секции для домена, или в общей секции?
Во-первых, letsencrypt, не порть поисковую выдачу для будущих пользователей. Во-вторых, не совсем понятен вопрос, тут указано, где прописывается сертификат (http и server)
А, да. Одинаковые опции ssl я выношу в ssl.conf и потом его подцепляю через include.
zemidius ★
( 27.08.21 12:07:23 MSK )
Последнее исправление: zemidius 27.08.21 12:08:32 MSK (всего исправлений: 1)
Динамические поддомены на nginx
Заметка об использовании переменных в домене на web сервере nginx, или динамические поддомены.
Важно не забыть выше расположить статические поддомены, чтоб динамические их не перебивали.
Ну и примеры ниже:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
server server_name www.example.com; location / proxy_pass 127.0.0.1:80; > > server server_name ~^(?[a-z0-9\-]+)\.example.com$; location / proxy_pass 127.0.0.1:80/sites/$dynamic$uri$is_args$args; > >
Вот ещё вариант:
Если у вас много поддоменов или вы хотите создавать их автоматически, тогда имеет смысл создать одну универсальную конфигурацию, которая будет обслуживать все поддомены, направляя запросы посетителей в соответствующие каталоги.
В первую очередь, необходимо настроить DNS: добавить поддомен с именем * (звездочка, без кавычек) и направить его на IP вашего веб-сервера. Измените секцию server вашего сайта следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12
server listen 80; server_name example.com *.example.com; root /var/www/example.com/$subdomain; set $subdomain ""; if ($host ~* ^([a-z0-9-\.]+)\.example.com$) set $subdomain $1; > if ($host ~* ^www.example.com$) set $subdomain ""; > >
Не забудьте поменять example.com на имя вашего домена. Эта конфигурация работает следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Адрес URL Путь на сервере http://example.com/ /var/www/example.com/ http://www.example.com/ /var/www/example.com/ http://vasya.example.com/ /var/www/example.com/vasya/ http://vasya.ivanov.example.com/ /var/www/example.com/vasya.ivanov/
nginx, пользовательские поддомены и rewrite
В самых разнообразных веб-проектах возникает задача организации пользовательских поддоменов «на лету». При использовании nginx приходит на помощь следующая конструкция:
server < listen 80; server_name example.com *.example.com; location / < root /var/www/example.com/$subdomain; index index.html index.php; >set $subdomain ""; if ($host ~* ^([a-z0-9-\.]+)\.example.com$) < set $subdomain $1; >if ($host ~* ^www.example.com$) < set $subdomain ""; >>
Сама по себе она не нова и упоминалась уже на хабре. Тем не менее остался не рассмотренным вопрос организации rewrite для пользовательских поддоменов.Сразу обращаю ваше внимание, что решаемая задача — организация различных rewrite для небольшого количества пользовательских поддоменов.Основная проблема применения правил rewrite для конкретного поддомена заключается в том что часто мы вынуждены использовать два if. Первый — для явного задания поддомена, второй — является частью самого правила. Например:
if (!-e $request_filename) < rewrite ^(.+)$ /index.php?q=$1 last; >
К сожалению, на даннный момент nginx не позволяет использовать ни вложенные конструкции if ни оператор «И» в них. Таким образом прийдется пойти на небольшую хитрость.Создадим в папке с конфигами nginx (у меня во FreeBSD это /usr/local/etc/nginx, в Linux, как я подозреваю, /etc/nginx) файлик checks.conf следующего содержания:
set $f "|f"; set $e "|e"; set $d "|d"; if (!-f $request_filename) < set $check $check$f; >if (!-e $request_filename) < set $check $check$e; >if (!-d $request_filename) < set $check $check$d; >set $check $subdomain$check;
Что он делает? фактически — помещает в переменную $check имя текущего поддомена, дописав в конец “флаги” относительно нашего запроса (т.е. если -f истинно — допишется “|f”, если -e истинно то “|e” и т.д.)Теперь организуем использование этого файла для поддоменовДобавим в наш конфигурационный файл следующую строку:
location / < root /var/www/example.com/$subdomain; index index.html index.php;
include example.com/*.conf;
> Создадим в папке с конфигами nginx каталог example.com. В нем будут хранится правила rewrite для каждого поддомена (по одному на файл, отсутствие файла означает что rewrite для данного поддомена не нуженВ качестве примера приведу содержимое подобного файла для поддомена docs на котором запущена DokuWiki:
if ($subdomain = "docs") < rewrite ^(/)_media/(.*) $1lib/exe/fetch.php?media=$2 last; rewrite ^(/)_detail/(.*) $1lib/exe/detail.php?media=$2 last; rewrite ^(/)_export/([^/]+)/(.*) $1doku.php?do=export_$2&id=$3 last; >include service/checks.conf; if ($check ~* ^docs.*[f].*$) < rewrite ^(/)(.*)?(.*) $1doku.php?id=$2&$3 last; rewrite ^(/)$ $1doku.php last; >
Сам файл состоит из двух частей. Первую часть (до include) составляют безусловные rewrite. Мы могли бы их вынести в сам конфиг пользовательских доменов, но хранить все яйца в одной корзине в нашем случе удобнееВторая часть (после include) в работе идентична тому, что в нормалных условиях было бы записано в виде if (!-f . ). Очевидно что если бы нам необходима была проверка вида -e достаточно заменить один символ в нашем regexp.К сожалению, данный метод не позволяет решить еще одну проблему при использовании автоматических пользовательских поддоменов — а именно ограничения доступа к тем или иным папкам сайта путем базовой аутентификации (аналог .htaccess). Это связано с тем, что директива location в которой осуществляется задание подобных правил недопустима внутри оператора if.P.S. Это моя первая статья на Хабре, если есть замечания — я с радостью постараюсь их учесть
- nginx
- rewrite
- пользовательские поддомены
- wildcard dns
Как создать поддомен nginx?
Добрый день всем, появился маленький вопросик.
Есть домен который привязан к cloudflare
nserver: mira.ns.cloudflare.com.
nserver: ned.ns.cloudflare.com.
Сам сервер хостится на hetzner.
На дебиан 10.
Получается мне нужно создать поддомен. Правильно ли что я добавляю А запись в личном кабинете cloudflare и потом как создать поддомен в ngnix? просто создаю конфиг с параметрами
subdomain.domain.info.conf и перезапускаю nginx? или что то еще надо сделать?
- Вопрос задан более года назад
- 1010 просмотров