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

Nginx — простой и очень функциональный веб-сервер, способный работать с одним или несколькими сайтами, выступать в качестве реверс-прокси и даже балансировщика нагрузки при работе с несколькими серверами.

В этой инструкции мы рассмотрим создание виртуальных хостов в Nginx для одновременной работы с двумя сайтами. Мы создадим конфигурационные файлы, отдельные папки для размещения документов сайта и проверим их работу.

Для начала работы нам понадобится предварительно настроенный сервер под управлением Ubuntu.

# Установка и первичная настройка Nginx

Установить Nginx можно из стандартных репозиториев Ubuntu с помощью пакетного менеджера apt. Сначала обновим список доступных пакетов:

sudo apt update
sudo apt upgrade

После этого можно установить Nginx:

sudo apt install nginx

Теперь добавим Nginx в список исключений ufw. Для этого проверим список доступных приложений ufw:

sudo ufw app list

Результат выдачи будет примерно таким:

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

В этой инструкции мы не будем защищать наши сайты SSL-сертификатом, поэтому добавим в список исключений ufw только службу Nginx, отвечающую за HTTP-соединение:

sudo ufw allow “Nginx HTTP”

Можно проверить, что Nginx добавлен в список исключений фаервола:

sudo ufw status

Вывод будет примерно таким:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

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

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

sudo mkdir -p /var/www/example_1.com/html
sudo mkdir -p /var/www/example_2.com/html

Флаг -p в этих командах позволяет создать все необходимые директории на указанном пути.

Эти директории мы создали от имени администратора, используя команду sudo. Теперь нам нужно передать права на них нашему пользователю, чтобы можно управлять содержимым папок без указания sudo:

sudo chown -R $USER:$USER /var/www/example_1.com/html
sudo chown -R $USER:$USER /var/www/example_2.com/html

# Создание индексного файла

Индексный файл — первый файл, к которому обращается Nginx после обработки запроса от пользователя. Можно настроить так, чтобы первым был .php файл, но по умолчанию первым обрабатывается html-файл.

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

vim /var/www/example_1.com/html/index.html

В открывшийся пустой текстовый файл поместим следующий код:

<html>
    <head>
        <title>Example 1!</title>
    </head>
    <body>
        <h1>Success! 1st server block is working!</h1>
    </body>
</html>

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

cp /var/www/example_1.com/html/index.html /var/www/example_2.com/html/

Теперь откроем его:

vim /var/www/example_2.com/html/index.html

Немного исправим файл:

<html>
    <head>
        <title>Example 2!</title>
    </head>
    <body>
        <h1>Success! 2nd server block is working!</h1>
    </body>
</html>

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

Теперь у нас есть индексные файлы для наших сайтов, можно переходить непосредственно к созданию виртуальных хостов.

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

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

Откроем наш новый файл:

sudo vim /etc/nginx/sites-available/example_1.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;
        }
}

Указание default_server в строках listen означает, что данный сервер используется как сервер по умолчанию. Если пришедший на сервер запрос не относится ни к одному из обслуживаемых сайтов, он перенаправляется именно на этот сервер.

Мы удалим это указание из наших виртуальных хостов и оставим его только в созданном по умолчанию.

В качестве директории, где хранятся документы нашего файла, укажем наш новый адрес, который мы создали: /var/www/example_1.com/html.

В строку server_name впишем наше доменное имя example_1.com.

Модифицированный конфигурационный файл должен выглядеть так:

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

        root /var/www/example_1.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name example_1.com www.example_1.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

То же самое нужно сделать со вторым серверным блоком. Поскольку текст конфигурационных файлов в большинстве своём одинаковый, скопируем конфигурационный файл первого сайта в директорию второго:

sudo cp /etc/nginx/sites-available/example_1.com /etc/nginx/sites-available/example_2.com

Теперь исправим всё, что касается первого сайта, на второй:

sudo vim /etc/nginx/sites-available/example_2.com

Новый конфигурационный файл будет иметь вид:

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

        root /var/www/example_2.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name example_2.com www.example_2.com;

        location / {
                try_files $uri $uri/ =404;
        }
}

# Подключение виртуальных хостов

Наши виртуальные хосты созданы, и их нужно подключить. Создадим для этого символические ссылки для каждого из сайтов:

sudo ln -s /etc/nginx/sites-available/example_1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/example_2.com /etc/nginx/sites-enabled/

Теперь у нас три виртуальных хоста:

  • default — создан по умолчанию и отвечает за обработку запросов к сайтам, чьи доменные имена не совпадают с нашими сайтами;
  • example_1 и example_2 — новые виртуальные хосты для размещения наших сайтов.

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

sudo vim /etc/nginx/nginx.con

Найдём в этом файле строку server_names_hash_bucket_size и раскомментируем её (уберём # в начале строки).

Сохраним изменённый файл и проверим правильность конфигурации веб-сервера:

sudo nginx -t

В результате, если всё было сделано правильно, на выходе получим сообщение:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Перезагрузим наш веб-сервер, чтобы все изменения вступили в силу:

sudo systemctl restart nginx

После этого переходим к проверке работы наших серверных блоков. Для этого откроем браузер и зайдём по адресу http://example_1.com и http://example_2.com.

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

serv_block_1

serv_block_2

На примере создания двух виртуальных хостов мы показали, как можно использовать Nginx для обеспечения работы нескольких сайтов. В дальнейшем это будет полезно как для расширения функционала независимо работающего Nginx, так и для его работы в связке с Apache.