Веб-сервер Apache является наиболее распространенной платформой для развертывания сервисов, работающих по протоколу HTTP. Популярность объяснима – программное обеспечение включает динамически подгружаемые модули, поддержку множества форматов файлов, взаимодействие с другим профильным софтом.
Работа с HTTP-сервером Apache требует предварительно настроенной операционной системы, в этой статье за основу возьмем CentOS 8, но инструкция подойдет и для других версий. Будет достаточно создать пользователя с привилегиями sudo и разрешить соединение во встроенном брандмауэре. Разворачивать систему можно на локальном ПК или виртуальной машине, арендованной у провайдера timeweb.cloud.
Пакет с инструментом Apache есть в официальном репозитории CentOS, поэтому он доступен для установки при помощи dnf. Выполним команду:
sudo dnf install httpd
После подтверждения диспетчер пакетов выполняет установку веб-сервера Apache в CentOS и всех необходимых для его функционирования зависимостей. Важно, чтобы фаервол уже был настроен для ответа на запросы по протоколу HTTP. Например, понадобится открытый порт 443 вместе со включенной службой http.
sudo firewall-cmd --permanent --add-service=https
После применения команды обязательна перезагрузка брандмауэра, иначе новые правила не начнут действовать:
sudo firewall-cmd –reload
Установка Apache завершена, пора запускать его и проверять работоспособность.
Поначалу веб-сервер требует ручного запуска, поэтому введем команду:
sudo systemctl start httpd
Проверить, запустилась ли служба, можно при помощи команды:
sudo systemctl status httpd
Если веб-сервер работает штатно, пользователь увидит сообщение, в котором должен отразиться статус active (running)
:
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disa>
Active: active (running) since Thu 2020-04-23 22:25:33 UTC; 11s ago
Второй способ проверки – открыть хост через браузер по IP-адресу сервера:
http://your_server_ip
Найти IP сервера можно в панели управления или в письме, которое пришло на почту после установки сервера.
Теперь можно опробовать некоторые команды systemctl, используемой при взаимодействии со службой. Например, остановка HTTP-сервера будет после ввода:
sudo systemctl stop httpd
Повторный запуск происходит по команде:
sudo systemctl start httpd
Перезапуск, например, для принятия изменений в настройках:
sudo systemctl restart httpd
Возможен рестарт без прерывания текущего соединения:
sudo systemctl reload httpd
По умолчанию процессы Apache запускаются при загрузке сервера. Если это нежелательно, то отключите автозапуск:
sudo systemctl disable httpd
Первоначальные настройки HTTP-сервера предполагают развертывание всего одного сайта. Но есть возможность создать виртуальные хосты, на каждом из которых создают отдельные ресурсы.
В системе Apache они схожи с построением в Nginx. Их также используют, чтобы обеспечить разделение конфигурации и развертывание на одной виртуальной машине или физическом сервере двух и более доменов. В этой статье везде будем указывать условный сайт под названием example.com. При работе его заменяют реальным доменом.
Теперь приступим к настройке. Создайте папку html в каталоге example.com (var/www/):
sudo mkdir -p /var/www/example.com/html
В дополнение желательно создать отдельную папку, где будут храниться файлы журнала:
sudo mkdir -p /var/www/example.com/log
Переменной среды $USER назначают права владельца:
sudo chown -R $USER:$USER /var/www/example.com/html
Перед продолжением желательно проверить, что у корневой папки установлены стандартные разрешения:
sudo chmod -R 755 /var/www
Теперь можно в любом редакторе кода сформировать index.html. Например, запустим vi:
sudo vi /var/www/example.com/html/index.html
Внесем простейшее содержимое:
<html>
<head>
<title>Welcome to Example.com!</title>
</head>
<body>
<h1>Success! The example.com virtual host is working!</h1>
</body>
</html>
После сохранения изменений в index.html у нас почти все готово для генерации файлов. Они задают настройки каждого отдельно взятого домена и транслируют их Apache, чтобы HTTP-сервер понимал, как обрабатывать запросы. Хранить их будем в каталоге sites-available, к нему создается папка sites-enabled, указывающая на готовность хоста принимать трафик из сети:
sudo mkdir /etc/httpd/sites-available /etc/httpd/sites-enabled
Остается дать команду HTTP-серверу найти виртуальные хосты в папке sites-enabled. Чтобы процесс прошел как надо, нужно предварительно изменить основной конфигурационный файл Apache командой:
sudo vi /etc/httpd/conf/httpd.conf
Затем переместить курсор в самый конец файла и внести там строчку:
...
# Supplemental configuration
#
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf
IncludeOptional sites-enabled/*.conf
Теперь настало время для формирования непосредственно файла виртуального хоста:
sudo vi /etc/httpd/sites-available/example.com.conf
В него вносится следующая информация:
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/example.com/html
ErrorLog /var/www/example.com/log/error.log
CustomLog /var/www/example.com/log/requests.log combined
</VirtualHost>
Вместо example.com нужно везде проставить реальный домен. Тогда файл укажет веб-серверу, где найти корневой каталог сайта, где сохранять журналы ошибок и обращений к сайту. После закрытия файла с сохранением изменений останется активировать виртуальные хосты – сформировать символьную ссылку для доменов в каталоге sites-enabled:
sudo ln -s /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-enabled/example.com.conf
Теперь настройка завершена, и хост готов к функционированию. Но перед перезапуском веб-сервера желательно проверить, что модуль SELinux правильно обрабатывает запросы.
Модуль безопасности Linux SELinux повышает безопасность операционной системы. В CentOS встроен пакет, уже настроенный для взаимодействия с Apache. Но в данном примере мы изменили ее, поэтому при старте служб веб-сервера пользователь получит ошибку. Чтобы решить такую проблему, нужно изменение политик SELinux в отношении Apache. Всего применяют два способа корректировки – универсальный и для конкретной папки.
Процедура позволяет модулю безопасности использовать любые процессы Apache через булеву переменную httpd_unified. Такой подход удобен, но не рассматривает раздельную политику папок и файлов. Запуск универсальной политики:
sudo setsebool -P httpd_unified 1
Команда setsebool нужна для замены булевых значений, флаг -P – для обновления времени запуска при старте, при каждой перезагрузке оно сохраняется. В данном примере булево значение httpd_unified было активировано со значением 1.
Отдельная настройка требует дополнительных действий, зато позволяет задавать разрешения для каждого каталога или файла. При выборе этой методики придется вручную задавать тип контекста для каждой новой папки. Например, проверим параметры /var/www/example.com/log командой:
sudo ls -dlZ /var/www/example.com/log/
В результате пользователь увидит сообщение:
drwxr-xr-x. 2 root root unconfined_u:object_r:httpd_sys_content_t:s0 6 Apr 23 23:51 /var/www/example.com/log/
Судя по нему, сейчас используется контекст httpd_sys_content_t
, т.е. служба Apache будет читать только те файлы, которые размещены в указанной папке. Если изменить его на httpd_log_t
, веб-сервер будет генерировать данные для файла журнала:
sudo semanage fcontext -a -t httpd_log_t "/var/www/example.com/log(/.*)?"
Применить внесенные изменения можно командой:
sudo restorecon -R -v /var/www/example.com/log
Флаг -R позволяет запускать ее рекурсивно с обновлением существующих файлов. Символ -V распечатывает вносимые изменения. Это выглядит так:
Relabeled /var/www/example.com/log from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:httpd_log_t:s0
Если хочется убедиться в изменении типа контекста, просмотрите еще раз текущее состояние:
sudo ls -dlZ /var/www/example.com/log/
Вывод на экран:
drwxr-xr-x. 2 root root unconfined_u:object_r:httpd_log_t:s0 6 Apr 23 23:51 /var/www/example.com/log/
После перенастройки разрешений в SELinux HTTP-сервер будет без проблем записывать данные в каталог /var/www/example.com/log. Перезапустим процесс Apache:
sudo systemctl restart httpd
Сформируем перечень содержимого каталога /var/www/example.com/log, это позволит убедиться в том, что система создала журнал:
ls -lZ /var/www/example.com/log
Результат выглядит так:
-rw-r--r--. 1 root root system_u:object_r:httpd_log_t:s0 0 Apr 24 00:06 error.log
-rw-r--r--. 1 root root system_u:object_r:httpd_log_t:s0 0 Apr 24 00:06 requests.log
Первая строка подтверждает наличие файла error.log, а вторая – requests.log. Это практически финал, пользователь может проверить работоспособность домена через браузер. В качестве ответа будет примерно такая надпись:
Success! The example.com virtual host is working
Она подтверждает, что виртуальный хост был настроен и начал обслуживать контент. По каждому новому сайту повторяют шаги 4-5, заменив домен на соответствующий.
Мы рассмотрели настройку Apache в CentOS под единственный или несколько доменов, расположенных на одной физической или виртуальной машине. После проверки каждого из подключенных сайтов можно разворачивать CMS и приступать к наполнению контентом.