Как правильно настроить Nginx для нескольких сайтов?
Продолжаем делиться админскими хитростями, друзья. По мотивам топика на webmasters.
У человека возникла проблема с тем, что по домену с www стал открываться другой сайт, распололженный на этом же сервере. Причина проста — конфиг по умолчанию смотрит на один из сайтов, который и будет открываться для любых доменов, для которых нет конкретно прописанной конфигурации. Дабы этого избежать, нужно в директиву server_name дописывать все варианты домена сайта, по которым он должен быть доступен. Либо проставлять редиректы на основной адрес.
Как создать конфигурацию по умолчанию для nginx?
Но лучше всего создать дефолтный конфиг и настроить в нём отдачу 403 (forbidden) или 444 (epmty) кода. Это позволит избежать проблем в дальнейшем.
создайте файл default c с такой конфигурацией:
server {
server_name _;
listen *:80 default_server deferred;
return 444;
}
Как сделать конфиг Nginx в одном файле для всех сайтов на сервере?
Человек в этом топике как раз поинтересовался, я отписал предположительные варианты решения. А потом мне стало интересно самому, поскольку для меня это очень актуально. У меня несколько сайтов работают на одном сервере Nginx.
Зачем это нужно? Чтобы не плодить десятки, или даже сотни файлов — по одному на каждый сайт. Причем, конфиги отличаются лишь доменом сайта и названием папки. А если нам нужно добавить или изменить опцию для всех сайтов? Нужно будет использовать автозамену по всем файлам. Гораздо правильней использовать объектно-ориентированный подход — и настроить конфиг в одном файле для любого количества шаблонных сайтов. Если же для сайта понадобится нестандартная конфигурация — так просто создадим её в отедльном файле.
Итак, можно создать один файл с типовой конфигурацией, в котором будем использовать нехитрые проверки и переменные вебсервера:
server {
server_name ~^(www.)?(?.+)$;
root /var/www/$domain;
if (!-d /var/www/$domain) {
return 444;
}
#остальной ваш конфиг
}
Что это всё значит? Это значит, что если на сервере существует папка с названием в виде домена, то значит такой сайт мы будем открывать из этой папки по этому домену. Обратите внимание, сайт будет открываться по обоим вариантам — как с www, так и без. Если же на наш сервер обращаются по домену, который не заведён у нас на сервере — нету папки для него — мы в ответ покажем 444 код — пустой ответ. Кому то может больше нравится 403 тоже вариант, это уже дело вкуса.
Таким образом, чтобы создать новый сайт, нам не нужно писать отдельный конфиг виртуалхоста, достаточно просто создать папку с доменом в названии, направить DNS на этот сервер и сайт сразу же начнёт открываться.
Возникла ошибка при работе с WWW-доменами. Синтаксическая ошибка: ‘nginx: [emerg] pcre_compile() failed: unrecognized character after (? or (?- in «^(www.)?(?.+)$» at «.+)$» in /etc/nginx/vhosts/tester/site.ru.conf:2 nginx: configuration file /etc/nginx/nginx.conf test failed ‘
Комментарий на отдельной страницезамените
Комментарий на отдельной страницеserver_name ~^(www.)?(?.+)$;
на
server_name ~^(www.)?(?.+)$domain;
Нет же, в конфиге все правильно, а ошибки судя по всему из-за лишних типографских кавычек, которые могли туда попасть из-за неправильного копипаста.
Комментарий на отдельной страницеСпасибо за статью! После внесения корректировок что вы описали скорость загрузки по данным GTmetrik выросла на 20%! Шикарный результат на мой взгляд =)
Комментарий на отдельной страницеБлагодарю, рад, что помогло.
Комментарий на отдельной странице