Настройка хостов Nginx в Ubuntu

Всем привет! Данное руководство покажет, как выполняется настройка хостов Nginx на сервере Ubuntu 16.04.

настройка хостов в nginx

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

Требования

  • Не-root пользователь с доступом sudo
  • Предварительно установленный веб-сервер Nginx. Инструкции по установке стека LEMP в Ubuntu можно найти здесь.

Кроме того, для выполнения предложенных в руководстве примеров нужно иметь два доменных имени; в руководстве используются условные домены 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!

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

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

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

373