# Создание виртуальных хостов на 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
.
Если всё было сделано правильно, мы должны увидеть сообщения:
На примере создания двух виртуальных хостов мы показали, как можно использовать Nginx для обеспечения работы нескольких сайтов. В дальнейшем это будет полезно как для расширения функционала независимо работающего Nginx, так и для его работы в связке с Apache.