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

Привет, %username%! Как известно Nginx – один из самых популярных веб-серверов в мире. Nginx отвечает за размещение и обслуживание объёмных и производительных сайтов с большой нагрузкой. В большинстве случаев Nginx легче Apache и лучше подаётся масштабированию. Кроме того, Nginx можно использовать как веб-сервер и обратный прокси.
⚠️ CentOS 7 — EOL с 30 июня 2024. Пост оставлен как есть для тех, кто работает с легаси-серверами. На Rocky Linux 9 / AlmaLinux 9 структура
server-блоков Nginx идентична, меняются только пути SELinux-политик и сам package manager (yum→dnf). На Debian/Ubuntu файлы конфигов лежат в/etc/nginx/sites-available/+ симлинки вsites-enabled/— на CentOS такой конвенции исторически не было, и многие админы её повторяют вручную.
Для управления индивидуальными настройками отдельных сайтов Nginx использует блоки server, которые принято называть виртуальными хостами (как в Apache). Виртуальные хосты позволяют размещать несколько сайтов с разными конфигурациями на одном сервере.
Каждый подключенный домен будет направлять пользователя в отдельный каталог, хранящий данные запрашиваемого сайта. Количество поддерживаемых виртуальных хостов ограничено исключительно ресурсами сервера.
Данное руководство поможет настроить блоки server для Nginx на виртуальном выделенном сервере CentOS 7.
Требования#
Для выполнения руководства понадобится:
- Предварительно настроенный сервер CentOS 7.
- Желательно root доступ или пользователь с доступом к
sudo.
Также нужно заранее установить веб-сервер Nginx. Чтобы установить только Nginx, используйте yum. Сначала добавьте Nginx в список исходников системы:
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpmЗатем при помощи yum загрузите и установите Nginx:
sudo yum install nginxПосле завершения установки подключитесь как не-root пользователь при помощи SSH.
Примечание: В данном руководстве будут созданы виртуальные хосты для условных доменов
example.comиexample2.com. Замените их своими доменными адресами.
Если же у вас ещё нет доменных имён, вы сможете протестировать настройку при помощи фиктивных данных.
Структура каталогов#
Для начала нужно создать структуру каталогов для хранения данных для сайтов.
Такие каталоги (каталоги верхнего уровня, в которых Nginx ищет запрашиваемый контент) называются document root. В каталоге /var/www нужно создать отдельные подкаталоги для каждого сайта. а в них – подкаталоги html для хранения файлов сайта.
Для создания каталогов используется команда mkdir, а флаг –p позволяет создать каталог с подкаталогом в нём.
sudo mkdir -p /var/www/example.com/html
sudo mkdir -p /var/www/example2.com/htmlПримечание: Напоминаем, что условные доменные имена нужно заменять своими доменами.
Права доступа#
Теперь структура каталогов для сайтов готова, но все эти каталоги принадлежат пользователю root. Нужно передать права на них текущему пользователю, иначе он не сможет изменять данные. Для этого используйте команду chown:
sudo chown -R $USER:$USER /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/example2.com/htmlПеременная $USER автоматически задаёт имя текущего пользователя. Теперь текущему пользователю принадлежат подкаталоги public_html, в которых будет храниться контент сайтов.
Также нужно немного изменить привилегии и открыть контент для чтения (иначе страницы не будут обслуживаться):
sudo chmod -R 755 /var/wwwТеперь сервер имеет необходимые права доступа и может корректно обслуживать контент в соответствующих каталогах.
Создание демо-страниц#
Теперь нужно создать пару стандартных страниц сайтов, чтобы иметь возможность просмотреть контент.
Для тестирования подойдут и самые простые страницы. Создайте для каждого домена страницу index.html:
Чтобы создать страницу index.html для первого сайта, наберите:
vim /var/www/example.com/html/index.htmlДобавьте в этот файл простой HTML-код:
Welcome to Example.com!
Success! The example.com server block is working!Сохраните и закройте файл.
Скопируйте этот файл и используйте его в качестве шаблона для страницы второго сайта:
cp /var/www/example.com/html/index.html /var/www/example2.com/html/index.htmlОткройте файл и подкорректируйте код:
vim /var/www/example2.com/html/index.html
Welcome to Example2.com!
Success! The example2.com server block is working!Сохраните и закройте файл.
Создание блоков Server#
Итак, теперь файловая структура и страницы, обслуживающие контент, готовы к работе. Приступайте к созданию блоков server для Nginx.
Блоки server, или виртуальные хосты, помогают веб-серверу Nginx обслуживать несколько сайтов с разным контентом.
Для начала создайте каталог для хранения файлов хостов (sites-available), а также каталог, предоставляющий Nginx список хостов, которые нужно обслуживать (sites-enabled).
sudo mkdir /etc/nginx/sites-available
sudo mkdir /etc/nginx/sites-enabledПримечание: Этот шаблон каталогов был представлен командой разработчиков Debian, но его можно использовать и в этой системе, так как он прощает процесс управления хостами.
После этого нужно сообщить , что доступные блоки server хранятся в каталоге sites-enabled. Для этого нужно отредактировать главный конфигурационный файл Nginx, добавив в него строку, сообщающую о других конфигурационных файлах:
sudo vim /etc/nginx/nginx.confДобавьте эти строки в конец блока http {}:
include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;Первая строка указывает, что виртуальные хосты находятся в каталоге sites-enabled, а вторая строка увеличивает объем памяти, выделенный для обработки доменов.
Создание виртуального хоста#
По умолчанию Nginx предоставляет один стандартный блок server по имени default.conf, который можно использовать в качестве шаблона для других блоков. Скопируйте его:
sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/sites-available/example.com.confОткройте новый файл и подкорректируйте настройки:
sudo vim /etc/nginx/sites-available/example.com.confПримечание: Согласно требованиям все файлы виртуальных хостов Nginx должны иметь расширение
.conf
Содержимое файла выглядит так (комментарии опущены для удобства):
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}Сначала нужно изменить директиву server_name, которая сообщает Nginx, какие запросы нужно направлять на этот виртуальный хост. В этой строке нужно указать домен (например, example.com) и псевдонимы сайта (например, www.example.com); тогда домен с префиксом www и без него будет отображать один и тот же контент.
server_name example.com www.example.com;Примечание: Каждое выражение Nginx должно заканчиваться символом точки с запятой. В противном случае возникнет ошибка.
После этого нужно указать каталог document root; для этого существует директива root.
root /var/www/example.com/html;Также нужно добавить команду try_files и указать, что в случае если искомый файл или каталог не найден, сервер должен вернуть ошибку 404.
try_files $uri $uri/ =404;После внесения всех изменений файл виртуального хоста будет иметь такой вид:
server {
listen 80;
server_name example.com www.example.com;
location / {
root /var/www/example.com/html;
index index.html index.htm;
try_files $uri $uri/ =404;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}Базовая конфигурация хоста завершена. Сохраните и закройте файл.
Создание виртуального хоста для второго сайта#
Теперь можно скопировать готовый файл виртуального хоста для первого сайта и откорректировать его, указав данные второго сайта.
sudo cp /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-available/example2.com.confОткройте новый файл:
sudo vim /etc/nginx/sites-available/example2.com.confТеперь нужно отредактировать код файла и указать информацию о втором сайте. После этого файл хоста будет выглядеть так:
server {
listen 80;
server_name example2.com www.example2.com;
location / {
root /var/www/example2.com/html;
index index.html index.htm;
try_files $uri $uri/ =404;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}Откорректировав данные, сохраните и закройте файл.
Включение блоков server#
Теперь блоки server готовы к использованию и их нужно включить. Для этого создайте символьную ссылку для каждого блока в каталог sites-enabled:
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf
sudo ln -s /etc/nginx/sites-available/example2.com.conf /etc/nginx/sites-enabled/example2.com.confПосле этого перезапустите Nginx, чтобы обновить настройки сервера:
sudo systemctl restart nginxНастройка локальных хостов (опционально)#
Если вместо настоящих доменных имён вы использовали фиктивные имена, вы можете испытать новые виртуальные хосты, не подключаясь при этом к доменному имени. Для этого нужно настроить на компьютере локальные хосты.
Это не позволит другим посетителям просматривать сайт, но даст вам возможность проверить работу и настройки каждого сайта. Этот метод работает путем перехвата запросов, которые, как правило, поступают в DNS для разрешения доменных имен. Вместо этого можно указать IP-адреса, которые будут использоваться локальным компьютером при поступлении запросов к доменным именам.
Примечание: Прежде чем приступить к выполнению данного раздела, убедитесь, что вы находитесь на локальном компьютере, а не на сервере. Для выполнения данного раздела нужно иметь root-права, чтобы редактировать системные файлы.
В системах Mac или Linux войдите как пользователь root и откройте файл hosts:
sudo vim /etc/hostsПользователи Windows могут обратиться за инструкциями к сайту Microsoft.
На данном этапе понадобится внешний IP-адрес сервера и домен, который вы хотели бы использовать на сайте:
127.0.0.1 localhost
127.0.1.1 guest-desktop
server_ip_address example.com
server_ip_address example2.comЭто направит запросы к доменам example.com и example2.com на локальный компьютер и передаст их на server_ip_address.
Тестирование настройки#
Теперь нужно проверить работу блоков server. Для этого посетите домены в браузере:
http://example.comНа экране должно появиться это сообщение:
Success! The example.com server block is working!Аналогичным образом нужно проверить и второй домен.
Success! The example2.com server block is working!Если все настроенные сайты отвечают на запросы, значит, настройка виртуальных хостов Nginx прошла успешно.
Если файл hosts на локальном компьютере был отредактирован, на этом этапе нужно удалить добавленные в него строки, чтобы не засорять файл ненужными настройками.
Количество блоков server, которое можно разместить на одном сервере, ограничивается только ресурсами самого сервера. Чтобы добавить новый блок server, просто повторите весь вышеописанный процесс.
На этом все! Profit!
Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат , а так же подписывайся на канал .
О способах отблагодарить автора можно почитать на странице “Донаты ”.