Настройка виртуальных хостов в Nginx на Ubuntu 14.04

Будем работать под учетной записью обычного пользователя с sudo правами. Так же вам понадобится установленный веб-сервер Nginx. При желании можно установить полностью LEMP (Linux, Nginx, MySQL и PHP). Чтобы установить Nginx достаточно выполнить следующую команду:

sudo apt-get update
sudo apt-get install nginx

Прежде чем продолжить читать статью, настоятельно рекомендуем выполнить вышеописанные условия. Для примера, мы настроим два домена на нашем сервере. Их имена — example.com, test.com. Если в наличии у вас нет двух свободных имен, то просто придумайте два, а позднее мы покажем как настроить ваш локальный сервер, чтобы проверить их работоспособность.

Шаг 1 — настройка новой корневой директории

По-умолчанию на вашем Nginx сервере активирован только один виртуальный хост. Он работает с документами по адресу: /usr/share/nginx/html. Мы изменим эту настройку, так как чаще всего приходится работать с каталогом /var/www. Nginx не использует эту директорию по-умолчанию, так как это противоречит политике Debian по использованию пакетов в каталоге /var/www.

Но так как мы простые пользователи, и с вопросами хранения пакетов редко сталкиваемся, проигнорируем эту политику и установим этот каталог в качестве корневого. Точнее говоря, каждый каталог внутри корневой директории должен соответствовать отдельному сайту. А все файлы сайта разместим в директории /var/www/site_name/html. Сначала создадим все необходимые подкаталоги. Для этого выполним следующую команду:

sudo mkdir -p /var/www/example.com/html
sudo mkdir -p /var/www/test.com/html

Флаг  указывает оболочке, чтобы она создавала новые каталоги если их не существует в указанном пути. Теперь передадим права на этот каталог обычному пользователю. Воспользуемся переменной окружения $USER, чтобы не вводить имя своего аккаунта. После этих действий мы сможем создавать в каталоге /var/www/ файлы, а посетители сайта — нет.

sudo chown -R $USER:$USER /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/test.com/html

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

sudo chmod -R 755 /var/www

Мы полностью подготовили структуру для нашего сервера, можем двигаться дальше.

Шаг 2 — Создаём шаблон страницы для каждого сайта

Давайте создадим страницу, которая будет отображаться по-умолчанию при создании нового сайта. Создайте файл index.html в каталоге первого домена:

nano /var/www/example.com/html/index.html

Внутри сделаем минимальное наполнение, чтобы понимать на каком сайте мы находимся. Вот примерное содержание:

<html>
   <head>
       <title>Добро пожаловать на Example.com!</title>
   </head>
   <body>
       <h1>Это виртуальный хост example.com!</h1>
   </body>
</html>

Сохраните и закройте файл. Так как второй файл будет с похожим содержанием, просто скопируем его:

cp /var/www/example.com/html/index.html /var/www/test.com/html/

Внесём в него небольшие изменения:

nano /var/www/test.com/html/index.html
<html>
   <head>
       <title>Добро пожаловать на Test.com!</title>
   </head>
   <body>
       <h1>Это виртуальный хост test.com!</h1>
   </body>
</html>

Сохраните и закройте этот файл. Теперь мы будем видеть правильно ли настроены наши сайты.

Шаг 3 — создание файлов виртуальных хостов для каждого домена

Теперь у нас есть содержимое для каждого сайта, настало время создать виртуальный хосты (точнее в Nginx они называются server block, но мы будет пользоваться термином виртуальный хост). По-умолчанию, Nginx использует один виртуальный хост под названием default. Используем его в качестве шаблона для нашей конфигурации. Сначала проработаем настройку для первого домена, которую потом просто скопируем и внесем минимальные изменения для второго домена.

Создание первого файла виртуального хоста

Как я уже сказал, скопируем файл настройки default:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

Откроем этот файл с правами администратора:

sudo nano /etc/nginx/sites-available/example.com

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

server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;
   root /usr/share/nginx/html;
   index index.html index.htm;
   server_name localhost;
   location / {
       try_files $uri $uri/ =404;
   }
}

Для начала разберемся с директивой listen. Только одному блоку server мы можем установить значение default_server. Блок с таким значением будет обслуживать запросы, если не было найдено подходящего блока (блок — это всё что находится в server). Мы отключим эту директиву в виртуальном хосте default, чтобы использовать default_server на одном из наших доменов. Я оставлю эту функцию активированной для первого домена, но при желании вы можете её перенести на второй.

Следующее что мы сделаем — настроим корневой каталог при помощи директивы root. Она должна указывать на каталог, где лежат все документы вашего сайта:

root /var/www/example.com/html;

Заметка: каждая инструкция Nginx должна заканчиваться символом “;”.

Далее настроим server_name, эта директива должна соответствовать первому доменному имени. Добавим также псевдоним:

server_name example.com www.example.com;

Окончательная настройка должна выглядеть следующим образом:

server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;
   root /var/www/example.com/html;
   index index.html index.htm;
   server_name example.com www.example.com;
   location / {
       try_files $uri $uri/ =404;
   }
}

На этом базовая настройка окончена. Сохраните и закройте файл.

Создание второго виртуального хоста

Для этого просто скопируем файл настроек для первого сайта:

sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com

Откройте этот файл с правами администратора

sudo nano /etc/nginx/sites-available/test.com

В этом файле также начнем с директивы listen. Если опцию default_server вы оставили в первом файле, то здесь её следует удалить. Также необходимо убрать опцию ipv6only=on, так как её указывают только для одной комбинации адрес/порт:

listen 80;
listen [::]:80;

Установите корневой каталог для второго сайта:

root /var/www/test.com/html;

Теперь укажем server_name для второго домена:

server_name test.com www.test.com;

Окончательная настройка должна выглядеть следующим образом:

server {
   listen 80;
   listen [::]:80;
   root /var/www/test.com/html;
   index index.html index.htm;
   server_name test.com www.test.com;
   location / {
       try_files $uri $uri/ =404;
   }
}

Сохраните и закройте файл.

Шаг 4 — активация виртуальных хостов и перезапуск Nginx

Мы настроили наши виртуальные хосты, теперь настало время активировать их. Для этого надо создать символические ссылки на эти файлы и положить их в каталог sites-enabled, которые Nginx считывает при запуске. Создать ссылки можно следующей командой:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/

Теперь Nginx обработает эти файлы. Но виртуальный хост default, также активирован, поэтому мы получим конфликт параметра default_server. Отключить эту настройку можно просто удалив ссылку на файл. Сам файл останется в каталоге sites-available, так что при необходимости мы всегда сможем вернуть его на место.

sudo rm /etc/nginx/sites-enabled/default

Осталось ещё одна настройка, которую требуется выполнить в конфигурационном файле Nginx. Откройте его:

sudo nano /etc/nginx/nginx.conf

Надо снять комментарий с одной из строк:

server_names_hash_bucket_size: 64;

Эта директива применяется когда задано большое число имён серверов, либо заданы необычно длинные имена. Например, если значение по умолчанию равно 32 и имя сервера задано как “too.long.server.name.example.org”, то nginx откажется запускаться и выдаст сообщение об ошибке:

could not build the server_names_hash,
you should increase server_names_hash_bucket_size: 32

Поэтому лучше увеличить это значение до 64. Теперь можно перезапустить веб сервер, чтобы изменения вступили в силу:

sudo service nginx restart

Ваш сервер теперь должен обрабатывать запросы к обоим доменам.

Шаг 5 — Настройка локального файла hosts (дополнительно)

Если вы использовали свои доменные имена, то необходимо настроить ваш локальный сервер, чтобы тот распознавал их и вы смогли бы проверить свои виртуальные хосты (будем прописывать свои доменные имена в локальный файл hosts). Конечно, интернет пользователи не смогут таким образом просматривать ваш сайт, но для проверки хостов этого будет достаточно. Таким образом мы перехватываем запрос, который должен быть отправлен DNS серверу. По идее мы указываем по какому ip адресу наш компьютер должен перейти при обращении к определенному доменному имени.

Обратите внимание, что эти изменения следует производить только на локальной машине, а не на VPS сервере. Вам понадобятся root права, также необходимо иметь право изменять системные файлы.

Если вы используете Mac или Linux систему, то исправления можно внести следующим образом:

sudo nano /etc/hosts

Если же вы пользуетесь Windows, то инструкции по этой ОС вы найдете на официальном сайте производителя (или в google). Вам необходимо знать открытый IP адрес вашего сервера и доменные имена, которые вы хотите привязать к нему. Допустим мой адрес 111.111.111.111, тогда мне надо добавить следующие строки в файл hosts:

127.0.0.1   localhost
127.0.0.1   guest-desktop
111.111.111.111 example.com
111.111.111.111 test.com

Таким образом мы перехватим все запросы к этим доменным именам и перенаправим их на наш сервер. Сохраните и закройте файл когда закончите.

Шаг 6 — Проверка

На данном этапе вы должны получить полностью рабочую настройку. Осталось только её проверить. Для этого перейдем в браузере по адресу: http://example.com{:target=»_blank»}. Если оба сайта отображаются корректно, то вас можно поздравить с полной настройкой сервера Nginx. На этом этапе, если вы вносили изменения в файл hosts, то их следует удалить т.к. проверка прошла успешно и они уже не нужны. Чтобы открыть доступ к сайтам для интернет пользователей, придется приобрести доменные имена.

Заключение

Вы научились полностью настраивать виртуальные хосты для каждого сайта на вашем сервере. По сути, не существует каких либо ограничений на количество сайтов на одной машине, кроме ресурсов самой системы.