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

После установки популярного веб-сервера nginx (Engine-X, «Энжин-кс»), необходимо настроить виртуальные хосты. С помощью них можно обслуживать нескольких сайтов на одном IP-адресе.

Виртуальный хост (virtual Host) - это конфигурационный файл, в котором описаны настройки одного веб-сайта (домена).

Предполагается, что веб-сервер уже установлен, при большом желании рекомендуется установить весь необходимый комплект Nginx, MySQL и PHP. Вместо Mysql можно использовать аналоги, например mariadb, однако в этой статье мы не будет касаться php и базы sql.

Для примера создадим два виртуальных хоста:

  1. vseprolinux.ru
  2. siteprimer.ru

Настройка корневой системы для сайтов

Сделаем удобную корневую систему сайтов таким образом, что каждый каталог соответствует названию сайта.

И все файлы будут храниться в директории "/var/www/название домена/html".

Создадим каталоги для двух доменов: vseprolinux.ru; siteprimer.ru.

mkdir -p /var/www/vseprolinux.ru/html
mkdir -p /var/www/siteprimer.ru/html

Аргумент "-p" говорит, чтобы директории создавались в любом случаи, если даже их не существует.

Права на html

Передадим права на папку html обычному пользователю, таким образом, чтобы мы могли создавать новые элементы, а пользователи сайта - нет.

Для этого будем использовать переменную окружения "$USER", чтобы не вводить имя своего логина.

chown -R $USER:$USER /var/www/vseprolinux.ru/html
chown -R $USER:$USER /var/www/siteprimer.ru/html

Права на каталог www.

chmod -R 755 /var/www

Создание простой html страницы для сайта

Создадим файл index.html для сайта vseprolinux.ru. Поместим его в рабочей каталог.

touch /var/www/vseprolinux.ru/html/index.html

Отредактируем его, с минимальным html контентом.

mcedit /var/www/vseprolinux.ru/html/index.html

Страница html


<html>
<head>
<title>Добро пожаловать на vseprolinux.ru!</title>
</head>
<body>
<h1>Это заголовок сайта vseprolinux!</h1>
</body>
</html>

Далее для второго сайта делаем тоже самое.
mcedit /var/www/siteprimer.ru/html/index.html
В файл вставляем примерный код:


<html>
<head>
<title>Добро пожаловать на siteprimer!</title>
</head>
<body>
<h1>Это заголовок сайта siteprimer!</h1>
</body>
</html>

Создание первого файла server block (виртуального хоста) конфигурации

В отличие от apache в nginx виртуальные хосты называются server block.

Из коробки на веб-сервере активирован только один виртуальный хост (server block) - "default" . Находится он "/etc/nginx/sites-available/defaul".

Будем использовать его в качестве шаблона для двух сайтов.

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

cp /etc/nginx/sites-available/default /etc/nginx/sites-available/vseprolinux.ru

Отредактируем default.

mcedit /etc/nginx/sites-available/vseprolinux.ru

Немного о параметрах конфига.

listen - указывает на IP-адрес и порт на который программа или сайт будет слушать. Здесь можно указать default_server - тогда этот server block будет использоваться по умолчанию.

ВАЖНО!  Только для одного виртуального хоста можно установить значение default_server.

Для примера, установим параметр default_server для первого веб-сайта, однако его можно перенести на любой другой веб-сайт или оставить в default.

listen 80 default_server;

server_name - доменные имена, на которые будет отзываться сайт. Добавим название веб-сайта с www и без.

server_name vseprolinux.ru www.vseprolinux.ru;

root - полный путь к файлам виртуального хоста.

Укажем корневой каталог первого веб-сайта.

Заменим:

root /var/www/html;

На:

root /var/www/vseprolinux/html;

Итоговый файл с конфигурацией выглядит так:

server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   root /var/www/vseprolinux.ru/html;
   index index.html index.htm;

   server_name vseprolinux.ru www.vseprolinux.ru;

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

Сохраните файл.
На этом первичная настройка первого веб-сайта закончена. Далее переходим ко второму сайту.

Создание второго файла server block (виртуального хоста) конфигурации

Копируем дефолтный файл настроек для второго веб-сайта.

cp /etc/nginx/sites-available/default /etc/nginx/sites-available/siteprimer.ru

Редактируем файл siteprimer.ru
nano /etc/nginx/sites-available/siteprimer.ru

Из "listen" убираем опцию "default_server", так как она стоит для первого сайта. Убираем ipv6only=on.

Укажем коневой каталог.
root /var/www/siteperimer.ru/html;

Установим server_name

server_name siteprimer.ru www.siteprimer.ru;

Итоговая конфигурация второго веб-сайта:

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

   root /var/www/siteprimer.ru/html;
   index index.html index.htm;

   server_name siteprimer.ru www.siteprimer.ru;

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

Активация

После настройки конфигурации для виртуальных хостов (server block), необходимо активировать их.

В веб-сервере есть два каталога sites-available и sites-enabled.

В sites-available хранятся конфигурации всех хостов.

В sites-enabled - символические ссылки, которые веб-сервер считывает при загрузки.

Создадим ссылки для каталога sites-enabled.

ln -s /etc/nginx/sites-available/vseprolinux.ru /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/siteprimer.com /etc/nginx/sites-enabled/

Теперь при запуске веб-сервера, nginx активирует символические ссылки. Однако, хост default еще активирован и мы на выходе получим ошибку, так как параметр default_server запущен два раза.

Первый раз в конфиге default, второй в vseprolinux.ru.default_serverУбрать это ошибку просто - удалим символическую ссылку default из каталога sites-enabled, тем самым server block не будет активироваться.

rm /etc/nginx/sites-enabled/default

Далее открываем главный конфиг nginx.conf

nano /etc/nginx/nginx.conf

Нужно раскомментировать (убрать #) строчку:

server_names_hash_bucket_size: 64;

Параметр server_names_hash_bucket_size устанавливает размер корзины в хэш-таблицах имен серверов.

Перезапускаем сервис.

service nginx restart