apache2-mpm-itk (сокращенно mpm-itk) - это MPM (Multi-Processing Module) для веб-сервера Apache. mpm-itk позволяет запускать каждый из ваших vhost под отдельным uid и gid - короче говоря, скрипты и конфигурационные файлы для одного vhost больше не должны быть читаемы для всех остальных vhost.
mpm-itk основан на традиционном prefork MPM, что означает, что он непотоковый; вкратце, это означает, что вы можете без проблем запускать код, не поддерживающий потоки (например, многие расширения PHP). С другой стороны, вы, конечно, теряете все преимущества производительности, которые вы могли бы получить с потоками; вам придется решить для себя, стоит ли это того или нет. Кроме того, вы получите дополнительное снижение производительности по сравнению с prefork, поскольку на каждый запрос приходится дополнительная вилка.
Подготовка
Устанавливаем дополнительные репозитории
epel
1 | sudo dnf install epel-release |
raven
1 | sudo dnf install https://pkgs.dyn.su/el8/base/x86_64/raven-release.el8.noarch.rpm |
REMI
1 | sudo dnf install http://rpms.remirepo.net/enterprise/remi-release-8.rpm |
Установка дополнительных пакетов
Данный шаг можно пропустить, мы устанавливаем дополнительные утилиты для упрощения процесса обновления
1 | sudo dnf install yum-utils |
Проверка и установка обновлений
Проверяем на наличие обновлений и устанавливаем все доступные пакеты
1 | sudo dnf update -y --refresh |
после обновления, перезапускаем все службы которым это требуется
1 | systemctl restart $(needs-restarting -s) |
Отключаем SELinux
Открываем файл конфигурации SELinux и изменяем строку SELINUX на disable
1 | sudo nano /etc/selinux/config |
1 | SELINUX=disable |
после этого, необходимо перезагрузить сервер, что бы изменения вступили в силу.
1 | sudo reboot |
Установка Apache-ITK в CentOs
После всех подготовительных процедур, мы готовы приступить к установке. Для этого выполните команду
1 | sudo dnf install httpd-itk mod_ssl |
Первоначальная настройка Apache-ITK
Нам необходимо подключить все необходимые модули, для этого открываем файл
1 | sudo nano /etc/httpd/conf.modules.d/01-mpm-itk.conf |
и добавляем следующий текст
1 2 3 4 5 | <IfModule mpm_prefork_module> LoadModule mpm_itk_module modules/mod_mpm_itk.so LimitUIDRange 0 65000 LimitGIDRange 0 65000 </IfModule> |
открываем файл
1 | sudo nano /etc/httpd/conf.modules.d/00-mpm.conf |
и заменяем
1 | LoadModule mpm_event_module modules/mod_mpm_event.so |
на следующий
1 | LoadModule mpm_prefork_module modules/mod_mpm_prefork.so |
далее, "отключаем" сайт по умолчанию
1 | sudo > /etc/httpd/conf.d/welcome.conf |
Настройки для подключения виртуальных хостов
Это не обязательно, но гораздо удобнее когда все лежит в одном месте, для этого нам необходимо создать директорию для виртуальных хостов
1 | sudo mkdir -p /etc/httpd/vhosts |
и добавить ее подключение в основную конфигурацию
1 | echo "IncludeOptional vhosts/*.conf" >> /etc/httpd/conf/httpd.conf |
Установка PHP
Для работы сайтов нам может понадобиться PHP, если он вам не нужен, можете пропустить этот шаг.
Все необходимые репозитории у нас уже установлены, по этому для установки PHP 8.3 (последней на момент написания статьи) выполним следующие команды:
1 2 3 | sudo dnf module reset php sudo dnf module install php:remi-8.3 sudo dnf install -y php php-mysqlnd php-opcache php-xml php-xmlrpc php-gd php-mbstring php-json php-common php-cli php-curl |
Создание хоста по умолчанию
Хост по умолчанию не должен отвечать нам на какие-либо сайты, по этому создадим его в виде специально заглушки.
Создаем пользователя для сайта
1 | sudo useradd --no-create-home default |
создаем дополнительн
1 2 3 | sudo mkdir -p /var/www/ sudo mkdir -p /var/www/httpd-logs/ sudo mkdir -p /var/www/httpd-cert/default/ |
и создаедим сертифкат для "сайта"
1 | sudo openssl req -new -x509 -nodes -keyout /var/www/httpd-cert/default/default.key -x509 -days 3650 -out /var/www/httpd-cert/default/default.crt -subj '/C=RU/ST=RU/L=Moscow/OU=Sec/CN={IP}' |
Где {IP} - необходимо заменить на IP адрес сервера
далее создаем файл конфигурации
1 | sudo nano /etc/httpd/vhosts/00-default.conf |
со следующим текстом
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <VirtualHost *:80> DocumentRoot /var/www/html/ AddDefaultCharset UTF-8 AssignUserID default default CustomLog /var/www/httpd-logs/default.access.log combined ErrorLog /var/www/httpd-logs/default.error.log DirectoryIndex index.html <Directory "/var/www/html/"> AllowOverride All </Directory> Protocols h2 h2c http/1.1 </VirtualHost> <VirtualHost *:443> DocumentRoot /var/www/html/ AddDefaultCharset UTF-8 SSLEngine on SSLCertificateFile "/var/www/httpd-cert/default/default.crt" SSLCertificateKeyFile "/var/www/httpd-cert/default/default.key" SSLHonorCipherOrder on SSLProtocol +TLSv1 +TLSv1.1 +TLSv1.2 +TLSv1.3 SSLCipherSuite EECDH:+AES256:-3DES:RSA+AES:!NULL:!RC4 AssignUserID default default CustomLog /var/www/httpd-logs/default.access.log combined ErrorLog /var/www/httpd-logs/default.error.log DirectoryIndex index.html <Directory "/var/www/html/"> AllowOverride All </Directory> Protocols h2 h2c http/1.1 </VirtualHost> |
и создадим дополнительно файл .htaccess для блокировки доступа к сайту
1 | sudo echo "deny from all" > /var/www/html/.htaccess |
Так же, создадим необходимые для работы журналы и выставим на них права
1 2 3 4 | sudo touch /var/www/httpd-logs/default.access.log sudo touch /var/www/httpd-logs/default.error.log sudo chmod 644 /var/www/httpd-logs/default.access.log sudo chmod 644 /var/www/httpd-logs/default.error.lo |
Открываем порты и запускаем Apache-ITK
Теперь, для првоерки коректности все настройки, нам необходимо открыть порты 80 и 443 и запустить службу
1 2 3 | sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload |
Далее, запускаем Apache и ставим ег ов автозапуск
1 | sudo systemctl enable httpd --now |
и првоеряем статус запуска, если все нормально, то вы должны получить результат аналогичный следующему
1 | systemctl status httpd.service |
Так же, можете зайти на IP адрес сервера, вы полжны получить ошибку доступа

Добавление виртуальных хостов
Для добавление виртуальных хостов, действуем по аналогии с хостом по умолчанию, с небольшими изменениями
- {USER} - Имя пользователя, под которым будет работать сайт, к примеру example
- {DOMAIN} - полное доменное имя, к примеру example.com
Создаем пользователя
1 | sudo useradd --no-create-home {USER} |
Создаем структуру каталогов
1 2 3 4 | sudo mkdir -p /var/www/{USER}/ sudo mkdir -p /var/www/{USER}/data/tmp/ sudo mkdir -p /var/www/{USER}/data/www/{DOMAIN} sudo mkdir -p /var/www/httpd-cert/{USER}/ |
Создаем журналы
1 2 3 4 | sudo touch /var/www/httpd-logs/{DOMAIN}.access.log sudo touch /var/www/httpd-logs/{DOMAIN}.error.log sudo chmod 644 /var/www/httpd-logs/{DOMAIN}.access.log sudo chmod 644 /var/www/httpd-logs/{DOMAIN}.error.log |
и сертифкат
1 | sudo openssl req -new -x509 -nodes -keyout /var/www/httpd-cert/{USER}/{DOMAIN}.key -x509 -days 3650 -out /var/www/httpd-cert/{USER}/{DOMAIN}.crt -subj '/C=RU/ST=RU/L=Moscow/OU=Sec/CN={DOMAIN}' |
далее , создаем файл конфиуграции
1 | sudo nano /etc/httpd/vhosts/{DOMAIN}.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <VirtualHost *:80> ServerName {DOMAIN} ServerAlias www.{DOMAIN} DocumentRoot /var/www/{USER}/data/www/{DOMAIN} ServerAdmin webmaster@{DOMAIN} AddDefaultCharset UTF-8 AssignUserID {USER} {USER} CustomLog /var/www/httpd-logs/{DOMAIN}.access.log combined ErrorLog /var/www/httpd-logs/{DOMAIN}.error.log DirectoryIndex index.php index.html <Directory "/var/www/{USER}/data/www/{DOMAIN}"> AllowOverride All </Directory> </VirtualHost> <VirtualHost *:443> Protocols h2 h2c http/1.1 ServerName {DOMAIN} ServerAlias www.{DOMAIN} DocumentRoot /var/www/{USER}/data/www/{DOMAIN} ServerAdmin webmaster@{DOMAIN} DirectoryIndex index.php index.html AddDefaultCharset off SSLEngine on SSLCertificateFile "/var/www/httpd-cert/{USER}/{DOMAIN}.crt" SSLCertificateKeyFile "/var/www/httpd-cert/{USER}/{DOMAIN}.key" SSLHonorCipherOrder on SSLProtocol +TLSv1 +TLSv1.1 +TLSv1.2 +TLSv1.3 SSLCipherSuite EECDH:+AES256:-3DES:RSA+AES:!NULL:!RC4 AssignUserID {USER} {USER} CustomLog /var/www/httpd-logs/{DOMAIN}.access.log combined ErrorLog /var/www/httpd-logs/{DOMAIN}.error.log <Directory "/var/www/{USER}/data/www/{DOMAIN}"> AllowOverride All </Directory> <IfModule php_module> php_admin_value session.save_path "/var/www/{USER}/data/tmp/" </IfModule> |
закидываем необходимые файлы, для работы веб сервера в директорию /var/www/{USER}/data/www/{DOMAIN} и именяем владельца файлов
1 | chown -R {USER}:{USER} /var/www/{USER}/ |
после чего, перезапускаем веб сервер
1 | sudo systemctl restart httpd |
либо, просто перечитываем файл конфигурации
1 | sudo service httpd reload |
Настройка ротации логов
Для настройки ротации логов, создаем файл конфигурации
1 | sudo nano /etc/logrotate.d/web |
со следующим содержимым
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /var/www/httpd-logs/*.access.log { olddir /var/www/httpd-logs/ rotate 10 daily copytruncate compress } /var/www/httpd-logs/*.error.log { olddir /var/www/httpd-logs rotate 10 daily copytruncate compress } |
мы будем хранить журналы веб-сервера в течении 10 дней (rotate 10), при необходимости данный параметр можно уменьшить.