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

Гибкий и производительный Apache на сегодняшний день является самым популярным веб-сервером, он  обслуживает более половины активных сайтов.

Функции Apache распределены между его отдельными компонентами, которые можно настраивать индивидуально. Основным таким компонентом, который содержит настройки для отдельного сайта, является виртуальный хост. Виртуальные хосты (англ. virtual host) позволяет размещать несколько доменов или интерфейсов на одном виртуальном выделенном сервере.

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

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

Требования

Прежде чем приступить к выполнению руководства, нужно создать учётную запись пользователя с правами sudo. Чтобы узнать, как создать такого пользователя, читайте данное руководство.

Также нужно предварительно установить Apache. Для этого используйте менеджер пакетов yum, который установит сервер из стандартных репозиториев CentOS.

sudo yum -y install httpd

Затем запустите Apache как сервис, чтобы он автоматически запускался после перезагрузки.

sudo systemctl enable httpd.service

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

Примечание: В руководстве используются условные домены example.com и example2.com; не забудьте заменить их своим доменным именем.

Если у вас нет доменного имени, в конце руководства показано, как протестировать настройку с фиктивными значениями.

1: Создание структуры каталогов

Для начала нужно создать структуру каталогов, в которой будут храниться данные сайта.

Каталог document root (каталог, в котором Apache ищет контент) по умолчанию находится в /var/www; в нём нужно создать отдельный каталог для каждого виртуального хоста. В каждом таком каталоге будет размещен каталог public_html, в котором и будут находиться нужные файлы. Такой подход делает хостинг более гибким.

Необходимые каталоги можно создать при помощи команды mkdir (флаг -p позволяет создавать каталог с вложенным в него каталогом):

sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/www/example2.com/public_html

Примечание: Не забудьте заменить условные домены своими данными.

2: Права

Итак, структура каталогов готова, но все они принадлежат пользователю root. Чтобы не-рутовый пользователь мог вносить изменения в файлы веб-каталога, нужно изменить права на эти файлы при помощи chown:

sudo chown -R $USER:$USER /var/www/example.com/public_html
sudo chown -R $USER:$USER /var/www/example2.com/public_html

Переменная $USER примет имя текущего пользователя. После этого каталоги public_html, содержащие контент сайтов, будут принадлежать текущему пользователю.

Также нужно немного изменить привилегии, чтобы открыть веб-каталог и всё его содержимое для чтения, в противном случае страницы не будут отображаться корректно.

sudo chmod -R 755 /var/www

Теперь все права установлены верно; можно приступать к созданию контента в специально отведённых каталогах.

3: Создание демо-страниц для виртуальных хостов

Создайте тестовый контент; поскольку это пробная настройка хостов, страницы будут очень простыми. Просто создайте страницы index.html для каждого сайта.

Начнём с example.com; откройте файл index.html в текстовом редакторе:

nano /var/www/example.com/public_html/index.html

В этом файле создайте простой HTML-документ, который указывает, к какому сайту подключена страница. В данном случае этот файл выглядит так:

<html>
<head>
<title>Welcome to Example.com!</title>
</head>
<body>
<h1>Success! The example.com virtual host is working!</h1>
</body>
</html>

Сохраните и закройте файл.

Затем можно скопировать этот файл и использовать его как шаблон для второго домена:

cp /var/www/example.com/public_html/index.html /var/www/example2.com/public_html/index.html

Откройте скопированный файл и отредактируйте соответствующие данные:

nano /var/www/example2.com/public_html/index.html
<html>
<head>
<title>Welcome to Example2.com!</title>
</head>
<body>
<h1>Success! The example2.com virtual host is working!</h1>
</body>
</html>

Сохраните и закройте файл. Теперь тестовые страницы готовы.

4: Создание файлов виртуальных хостов

Файлы виртуальных хостов задают настройки отдельных сайтов и помогают Apache корректно отвечать на запросы.

Сначала нужно создать отдельные каталоги для хранения виртуальных хостов и включения сайтов. Каталог sites-available должен содержать файлы виртуальных хостов, а каталог sites-enabled – символические ссылки на виртуальные хосты, которые нужно включить. Для создания этих каталогов введите:

sudo mkdir /etc/httpd/sites-available
sudo mkdir /etc/httpd/sites-enabled

Примечание: Эта схема размещения каталогов командой Debian, но она используется и в других системах, поскольку это очень гибкий и простой способ включать и отключать виртуальные хосты.

Веб-сервер Apache должен искать виртуальные хосты в каталоге sites-enabled. Для этого нужно отредактировать главный конфигурационный файл Apache и объявить дополнительный каталог конфигурационных файлов.

sudo nano /etc/httpd/conf/httpd.conf

В конец каталога добавьте строку:

IncludeOptional sites-enabled/*.conf

Сохраните и закройте файл.

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

sudo nano /etc/httpd/sites-available/example.com.conf

Примечание: Согласно заданным конфигурациям, все конфигурационные файлы должны оканчиваться на .conf.

Сначала создайте пару тегов, объявляющих данный контент виртуальным хостом, который слушает порт 80 (стандартный HTTP-порт).

<VirtualHost *:80>
</VirtualHost>

Затем задайте имя сервера (в данном случае это www.example.com). Директива ServerAlias позволяет указывать дополнительные имена сервера; используйте её, чтобы запросы  www.example.com и example.com возвращали одинаковый контент.

<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
</VirtualHost>

Примечание: Чтобы версия доменного имени с www работала должным образом, настройки DNS должны содержать запись А или CNAME, перенаправляющую запросы к www на IP-адрес сервера. Символ звёздочки (*) также подойдёт.

В завершение нужно задать root-каталог для общедоступных веб-документов, а также местонахождение логов ошибок и запросов для этого конкретного сайта:

<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog /var/www/example.com/error.log
CustomLog /var/www/example.com/requests.log combined
</VirtualHost>

Сохраните файл и закройте его.

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

sudo cp /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-available/example2.com.conf

Откройте новый файл с привилегиями sudo в текстовом редакторе:

sudo nano /etc/httpd/sites-available/example2.com.conf

Теперь осталось отредактировать данные, чтобы файл мог обслуживать второй домен. В результате второй файл виртуального хоста имеет такой вид:

<VirtualHost *:80>
ServerName www.example2.com
DocumentRoot /var/www/example2.com/public_html
ServerAlias example2.com
ErrorLog /var/www/example2.com/error.log
CustomLog /var/www/example2.com/requests.log combined
</VirtualHost>

Сохраните и закройте файл.

5: Включение виртуальных хостов

Создав файлы виртуальных хостов, нужно включить их. Для этого создайте символическую ссылку для каждого хоста в каталоге sites-enabled:

sudo ln -s /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-enabled/example.com.conf
sudo ln -s /etc/httpd/sites-available/example2.com.conf /etc/httpd/sites-enabled/example2.com.conf

После этого перезапустите Apache, чтобы эти изменения вступили в силу.

sudo apachectl restart

6: Настройка локальных хостов (опционально)

Если у вас нет доменного имени, и вместо настоящего вы использовали условный домен, вы можете протестировать настройки, временно отредактировав файл hosts на локальном компьютере. он будет перехватывать запросы на настроенные ранее домены и направлять их на VPS (то есть, выполнять работу DNS). Но этот метод работает только на локальной машине и подходит только для тестирования.

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

В системах Mac или Linux отредактируйте файл hosts с привилегиями администратора.

sudo nano /etc/hosts

Примечание: Пользователи Windows могут найти необходимые инструкции по этой ссылке.

В этом файле нужно указать 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 будут направлены на локальный компьютер, а оттуда – на IP-адрес сервера.

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

Чтобы протестировать настройку, просто откройте домены в веб-браузере:

http://example.com

В данном случае на экране появится сообщение:

Success! The example.com virtual host is working!

Примечание: Конечно, то, что появится на экране, зависит от содержания файла, созданного в разделе 3.

Проверьте работу всех виртуальных хостов.

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

Заключение

Теперь сервер CentOS 7 может поддерживать несколько сайтов на отдельных доменах. В целом, количество хостов, которое можно разместить на одном сервере, зависит только от ресурсов сервера; в случае необходимости просто повторите весь вышеописанный процесс, чтобы добавить на сервер новый виртуальный хост.

Tags: , , ,

2 комментария

  • Николай says:

    Здравствуйте.
    Делаю все по Вашей инструкции, но на последнем шаге при перезагрузке получаю:


    apachectl: Configuration syntax error, will not run “restart”:
    Syntax error on line 258 of /etc/httpd/conf/httpd.conf:
    Invalid command ‘IncludeOptional’, perhaps misspelled or defined by a module not included in the server configuration

  • Eliya Ivanov says:

    Ерунда какая-то… нет таких sites-enabled и sites-available В Ubuntu 18.04 вижу, а в CentOS ну нет их, и всё тут…Никак не могу хост запустить..

Добавить комментарий для Николай Отменить ответ