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

Виртуальные хосты в Nginx также называются блоками server. Эти блоки используются для обслуживания нескольких индивидуальных доменов на одном сервере.

Данное руководство покажет, как настроить виртуальные хосты Nginx на сервере Ubuntu 16.04.

Требования

  • Не-root пользователь с доступом sudo (о настройке такого пользователя – в этой статье).
  • Предварительно установленный веб-сервер Nginx. Инструкции по установке Nginx можно найти здесь. Чтобы установить более надёжную платформу для веб-сервера, читайте руководство «Установка стека LEMP в Ubuntu 16.04».

Кроме того, для выполнения предложенных в руководстве примеров нужно иметь два доменных имени; в руководстве используются условные домены example.com и test.com. Не забудьте заменить их своими доменными именами.

Если у вас нет доменных имён, которые можно использовать для тестирования настроек, укажите фиктивные домены. В руководстве есть специальный раздел, объясняющий, как протестировать сайты при помощи локальной машины.

1: Каталоги Document Root

По умолчанию в Ubuntu 16.04 включен один стандартный виртуальный хост Nginx, который обслуживает документы из каталога /var/www/html.

Для обслуживания нескольких сайтов нужно создать дополнительные каталоги. Каталог /var/www/html будет использоваться в качестве каталога по умолчанию, который будет обслуживаться, если запрос клиента не соответствует ни одному из других сайтов.

Создайте структуру каталогов в /var/www для каждого отдельного сайта. Весть текущий контент нужно поместить в каталог html. Используйте следующую команду; флаг –p создаст все необходимые родительские каталоги.

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

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

Примечание: В зависимости от требований сервера вам может потребоваться повторно настроить права доступа или права собственности на папки, чтобы разрешить доступ к пользователю www-data. В этом, как правило, часто нуждаются динамические сайты. Конечно, привилегии доступа полностью зависят от конфигурации сервера.

Используйте переменную окружения $USER, чтобы задать текущего пользователя. Это позволит создавать файлы в этих каталогах.

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>Welcome to Example.com!</title>
</head>
<body>
<h1>Success!  The example.com server block is working!</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>Welcome to Test.com!</title>
</head>
<body>
<h1>Success!  The test.com server block is working!</h1>
</body>
</html>

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

Теперь стандартные страницы сайтов готовы.

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

Итак, теперь файловая структура и страницы, обслуживающие контент, готовы к работе. Приступайте к созданию блоков server для Nginx.

По умолчанию Nginx содержит один блок server по имени default, который можно использовать в качестве шаблона.

Блок server для первого сайта

Итак, скопируйте стандартный файл, чтобы создать первый блок server.

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;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}

Сначала нужно разобраться с директивами listen. Спецификация default_server может быть действительна только для одного виртуального хоста. Она указывает, какой из виртуальных хостов должен обслуживать запрос, если запрашиваемый server_name не совпадает ни с одним из существующих виртуальных хостов.

Добавьте опцию default_server в директиву listen одного из своих сайтов. Также можно оставить эту опцию в файле стандартного виртуального хоста, который будет обслуживать каталог /var/www/html, если запрашиваемый хост не может быть найден.

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

server {
listen 80;
listen [::]:80;
. . .
}

Примечание: Чтобы убедиться, что опция default_server включена только в одном файле виртуального хоста, введите:

grep -R default_server /etc/nginx/sites-enabled/

Если такие записи в раскомментированном виде находятся в нескольких файлах (указывается в последнем столбце), веб-сервер пожалуется на ошибку.

Далее нужно указать каталог document root, отредактировав директиву root.

server {
listen 80;
listen [::]:80;
root /var/www/example.com/html;
}

Затем нужно отредактировать server_name, указав доменное имя (в данном случае – домен первого сайта). Также можно добавить несколько алиасов (например, www.example.com). В результате получится:

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

Базовая настройка виртуального хоста завершена.

Блок server для второго сайта

Итак, базовый код блока server готов. Файл блока server можно использовать в качестве шаблона для блока второго сайта. Скопируйте этот файл:

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

Откройте новый файл с привилегиями root:

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

Обратите внимание на директиву listen. Если опция default_server была включена в предыдущий файл, удалите её из этого файла. Также нужно откорректировать значение директивы root (укажите document root второго сайта) и server_name (укажите доменное имя и все алиасы).

В результате файл будет выглядеть так:

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

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

4: Включение виртуальных хостов

Теперь виртуальные хосты готовы, но их нужно активировать.

Для этого нужно создать символьные ссылки из этих файлов в каталог 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/

Теперь эти файлы в каталоге sites-enabled. На данный момент у вас есть три виртуальных блока, которые смогут отвечать на запросы согласно директивам listen и server_name.

  • example.com: файл для сайта example.com и его алиасов.
  • test.com: файл для сайта test.com и его алиасов.
  • default: стандартный файл, который будет отвечать на запросы, не соответствующие ни первому, ни второму сайту.

Чтобы избежать потенциальных проблем с памятью, которые могут возникнуть из-за дополнительных имён сервера, отредактируйте файл /etc/nginx/nginx.conf:

sudo nano /etc/nginx/nginx.conf

Найдите директиву server_names_hash_bucket_size и раскомментируйте её:

http {
. . .
server_names_hash_bucket_size 64;
. . .
}

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

Проверьте синтаксис на наличие ошибок:

sudo nginx -t

Если ошибок нет, перезапустите Nginx, чтобы обновить настройки:

sudo systemctl restart nginx

Теперь Nginx обслуживает два домена.

5: Настройка локальных хостов (опционально)

Если вместо настоящих доменных имён вы использовали фиктивные имена, вы можете испытать новые виртуальные хосты, не подключаясь при этом к доменному имени. Для этого нужно настроить на компьютере локальные хосты.

Это не позволит другим посетителям просматривать сайт, но даст вам возможность проверить работу и настройки каждого сайта. Этот метод работает путем перехвата запросов, которые, как правило, поступают в DNS для разрешения доменных имен. Вместо этого можно указать IP-адреса, которые будут использоваться локальным компьютером, при поступлении запросов к доменным именам.

Примечание: прежде чем приступить к выполнению данного раздела, убедитесь, что вы находитесь на компьютере, а не на сервере. Для выполнения данного раздела нужно иметь root-права и состоять в  административной группе, чтобы иметь возможность редактировать системные файлы.

В системах Mac или Linux войдите как root-пользователь (su) и откройте файл hosts:

sudo nano /etc/hosts

При использовании Windows обратитесь к сайту Microsoft.

На данном этапе понадобится внешний IP-адрес и домены, которые нужно направить на сервер. Допустим, внешний IP-адрес сервера 111.111.111.111; в таком случае строки будут выглядеть так:

127.0.0.1   localhost
. . .
111.111.111.111 example.com www.example.com
111.111.111.111 test.com www.test.com

Это будет перехватывать запросы к example.com и test.com и передавать их на сервер.

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

6: Тестирование

Теперь нужно протестировать работу виртуальных хостов. Для этого посетите домены в браузере:

http://example.com

На экране появится сообщение:

Success! The example.com server block is working!

Посетите второй домен:

http://test.com

На экране должно появиться сообщение:

Success! The test.com server block is working!

Если веб-сервер ответил на запросы, значит, всё работает должным образом.

Если файл hosts на локальном компьютере был отредактирован, на этом этапе нужно удалить добавленные в него строки.

Количество виртуальных хостов, которое можно разместить на одном сервере, ограничивается только ресурсами самого сервера. Чтобы виртуальный хост, просто повторите весь вышеописанный процесс.

Tags: , ,

1 комментарий

  • CrazzyCheeeel says:

    Большое спасибо за статью, очень помогла при настройке сервера VPS, так как виртуальный хостинг очень медленный. Была загрузка сайта гугл ботом 1.2 секунды!) стала 0.2 секунды)

Добавить комментарий