В этой публикации будет собрана небольшая шпаргалка по Apache – наиболее распространенные операции в процессе установки и сопровождения этого веб сервера. Тем, кто только начинает знакомство с веб сервисом Apache эта шпаргалка может быть полезна.
Установка
Самый простой вариант установки – это установка пакета из репозитория соответствующего дистрибутива.
Ubuntu Server 22.04
Команда для установки сервера Apache (пакет apache2) в Ubuntu Server 22.04:
sudo apt install apache2
Rocky Linux 9.3
Команда для установки сервервера Apache (пакет httpd) в Rocky Linux 9.3:
sudo dnf install httpd
Дополнительно после установки необходимо открыть, как минимум, следующие порты – 80 и 443 TCP:
sudo firewall-cmd --add-service=http --add-service=https --permanent
sudo firewall-cmd --reload
Настройка автоматического запуска
После установки сервер Apache уже настроен на автоматический запуск. Если по каким-то причинам автоматический запуск был отключен, но вы всегда можете его включить.
Включение автоматического запуска в Ubuntu Server 22.04:
sudo systemctl enable apache2
Включение автоматического запуска в Rocky Linux 9.3:
sudo systemctl enable httpd
Управление сервисом Apache
Просмотр статуса сервиса
Команда для просмотра статуса сервиса в Ubuntu Server 22.04:
sudo systemctl status apache2

Команда для просмотра статуса сервиса в Rocky Linux 9.3:
sudo systemctl status httpd

Перезапуск сервиса
Команда для перезапуска сервиса в Ubuntu Server 22.04:
sudo systemctl restart apache2
Команда для перезапуска сервиса в Rocky Linux 9.3:
sudo systemctl restart httpd
Перечитать конфигурационный файл сервиса
Если вы вносили изменения к конфигурационный файл сервера Apache, то эти изменения не применяются автоматически. Необходимо либо перезапустить сервис, либо попросить сервис перечитать конфигурационный файл. Полный перезапуск сервиса не всегда самый оптимальный вариант – все текущие соединения от клиентов будут разорваны. Наиболее оптимальный вариант – это попросить сервис перечитать конфигурационный файл.
Команда для актуализации конфигурационного файла в Ubuntu Server 22.04:
sudo systemctl reload apache2
Команда для актуализации конфигурационного файла в Rocky Linux 9.3:
sudo systemctl reload httpd
Пример конфигурации виртуального хоста
Пример базового конфигурационного файла для HTTP узла:
<VirtualHost *:80>
ServerAdmin romanr@itproblog.ru
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error_default.log
CustomLog ${APACHE_LOG_DIR}/access_default.log combined
</VirtualHost>
Основной параметр в этом конфигурационном файле – это директира DocumentRoot – она определяет, где именно находится все файлы для веб сайта. Для Rocky Linux 9.3 замените макрос ${APACHE_LOG_DIR} на адрес директории с журналами. Например, /var/log/httpd.
Расположение файлов с определениями для сайтов в Ubuntu Server 22.04
Для Ubuntu Server 22.04 конфигурационные файлы для веб сайтов расположены по следующему пути:
/etc/apache2/sites-available/
ls -l /etc/apache2/sites-available/

После добавления конфигурационного файла с описанием определения сайта в эту директорию необходимо указать серверу о том, что сайт необходимо включить:
sudo a2ensite newsite

Хотя на самом деле создается символическая ссылка для конфигурационного файла в директории /etc/apache2/sites-available/ на файл с аналогичным названием в директории /etc/apache2/sites-enabled/:
ls -l /etc/apache2/sites-enabled/

После внесения изменений не забудьте перечитать конфигурационный файл или перезапустить службу веб сервера.
Расположение файлов с определениями для сайтов в Rocky Linux 9.3
Определения сайтов в Rocky Linux 9.3 располагаются либо непосредственно в конфигурационном файла httpd.conf:
/etc/httpd/conf/httpd.conf

Рекомендуется хранить определения для новых сайтов в отдельной директории для включения дополнительных параметров и определения сайтов:
/etc/httpd/conf.d/
Например:
ls -l /etc/httpd/conf.d/newsite.conf

После внесения изменений не забудьте перечитать конфигурационный файл или перезапустить службу веб сервера.
Настройка SSL
Пример конфигурационного файла для сайта с поддержкой HTTPS:
<VirtualHost *:443>
DocumentRoot /var/www/html
ServerName newsite.itproblog.ru
SSLEngine on
SSLCertificateFile /etc/ssl/crt/bazov_cert.crt
SSLCertificateKeyFile /etc/ssl/crt/private.key
SSLCertificateChainFile /etc/ssl/crt/promejut_cert.crt
</VirtualHost>
В таблице ниже я привел основные назначения директив из конфигурационного файла выше.
Директива | Описание |
DocumentRoot | Определяет директорию на сервере Apache, в которой расположены все файлы для сайта. |
ServerName | Имя, которое сервер будет прослушивать для клиентских подключений. |
SSLEngine | Включает поддержку HTTPS |
SSLCertificateFile | Путь до файла с открытым ключом (сертификатом) на сервере |
SSLCertificateKeyFile | Путь до файла с закрытым ключом на сервере |
SSLCertificateChainFile | Путь до файла с цепочкой сертификатов корневых центров (при наличии). Опциональная директива. |
После добавления параметров в конфигурацию не забывайте перечитать файл или перезапустить сервис Apache.
Перенаправление с HTTP на HTTPS
Пример для всего редиректа всего HTTP трафика на HTTPS:
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
Пример для всего редиректа HTTP трафика на HTTPS только для определенного имени:
<VirtualHost *:80>
ServerName site.itproblog.ru
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</VirtualHost>
Использование нестандартного порта
Иногда необходимо разместить сайт на нестандартном порту. Например, порту 81. Веб сервер Apache поддерживает такую конфигурацию. Правда, необходимо выполнить ряд дополнительных настроек. О этом я расскажу в соответствующих разделах ниже.
Ubuntu Server 22.04
Для публикации веб сайта на нестандартном порту необходимо выполнить следующие действия:
1. Создать файл с определением сайта в директории /etc/apache2/sites-available. Например:
sudo nano /etc/apache2/sites-available/newsite.conf
<VirtualHost *:81>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html2
ErrorLog ${APACHE_LOG_DIR}/error_new.log
CustomLog ${APACHE_LOG_DIR}/access_new.log combined
</VirtualHost>
2. Добавить сайт в список активных сайтов:
sudo a2ensite newsite
3. В конфигурационном файле ports.conf добавить еще один прослушиваемый порт:
sudo nano /etc/apache2/ports.conf
Listen 81

4. Перечитать конфигурационные файлы на сервере:
sudo systemctl reload apache2
Rocky Linux 9.3
Для публикации веб сайта на нестандартном порту необходимо выполнить следующие действия:
1. Создать файл с определением сайта в директории /etc/httpd/conf.d. Например:
sudo nano /etc/httpd/conf.d/newsite.conf
<VirtualHost *:81>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html2
ErrorLog ${APACHE_LOG_DIR}/error_new.log
CustomLog ${APACHE_LOG_DIR}/access_new.log combined
</VirtualHost>
2. В конфигурационном файле сервера Apache добавить еще один прослушиваемый порт.
sudo nano /etc/httpd/conf/httpd.conf
Listen 81

3. Перечитать конфигурационные файлы на сервере:
sudo systemctl reload httpd
Просмотр списка модулей
Просмотр списка модулей в Ubuntu Server 22.04:
sudo apache2ctl -M
В Rocky Linux 9.3 список модулей можно посмотреть следующей командой:
sudo httpd -M
Производительность сервера Apache
Ниже я приведу некоторый список рекомендаций по оптимизации настроек веб сервера Apache, а также советы и рекомендации по настройке.
Определение количества необходимой оперативной памяти
Сначала нужно понять – сколько памяти потребляет один процесс сервера Apache (для Rocky Linux имя процесса будет httpd):
ps -aux | grep apache2

т.е. среднее потребление процесса Apache – около 5 МБ. Скажем, ожидается порядка 200 клиентских подключений. Соответственно, серверу будет необходимо около 1 ГБ оперативной памяти только для веб сервера Apache. Однако, стоит учитывать, что, например, при изменении характера нагрузки на сервер потребление памяти процессом Apache может измениться.
Еще я находил команду для расчета среднего количества оперативной памяти, которую потребляют процессы сервера Apache.
Синтетический тест произвоительности
У Apache есть своя утилита для проведения синтетического тестирования – ab. У неё есть свои достоинства и недостатки. Да, она не подходит для сложных сценариев, но для простых статических тестов её можно использовать.
Пример использования утилиты:
ab -n 1000 -c 10 http://10.10.10.65/index.html
root@ap01:/home/roman# ab -n 1000 -c 10 http://10.10.10.65/index.html
This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 10.10.10.65 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software: Apache/2.4.57
Server Hostname: 10.10.10.65
Server Port: 80
Document Path: /index.html
Document Length: 196 bytes
Concurrency Level: 10
Time taken for tests: 0.219 seconds
Complete requests: 1000
Failed requests: 0
Non-2xx responses: 1000
Total transferred: 381000 bytes
HTML transferred: 196000 bytes
Requests per second: 4564.31 [#/sec] (mean)
Time per request: 2.191 [ms] (mean)
Time per request: 0.219 [ms] (mean, across all concurrent requests)
Transfer rate: 1698.25 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 0.2 1 2
Processing: 1 1 0.4 1 4
Waiting: 1 1 0.3 1 4
Total: 1 2 0.5 2 5
Percentage of the requests served within a certain time (ms)
50% 2
66% 2
75% 2
80% 3
90% 3
95% 3
98% 4
99% 4
100% 5 (longest request)

В примере выше отправляет 1000 запросов на сервер 10.10.10.65. Одновременно используется 10 потоков. По результатам видно, что общее время выполнения сценария заняло 0,219 секунд. Средняя производительность сервера составила 4564 запроса в секунду. 99% всех запросов обработались за 4 миллисекунды.
Включение TCP KeepAlive
Включение TCP KeepAlive (если это возможно) позволяет повысить производительность вашего веб сервера, т.к. существующая TCP сессия может быть использована для новых запросов. Для включения необходимо указать следующие параметры в конфигурации веб сервера:
KeepAlive On
MaxKeepAliveRequests 0
KeepAliveTimeout 15
Директива KeepAlive включает поддержку TCP KeepAlive. Параметр MaxKeepAliveRequests определяет сколько запросов разрешается обрабатывать через уже установленную сессию. Значение 0 указывает на то, что ограничений на количество запросов нет. Директива KeepAliveTimeout указывает количество секунд, после истечения которых неактивное соединения завершается.
Включение страницы с отображение статуса сервера
Apache поддерживает возможность включения станицы, на которой будет отображаться текущий статус активности сервера. Для этого добавьте следующие параметры в конфигурационный файл сервера Apache:
<Location /server-status>
SetHandler server-status
Require local
Require ip 10.10.10
</Location>
ExtendedStatus On
В целях безопасности руземнее всего ограничить подключение к статистике работы сервера. В примере выше доступ ограничен для локальных подключений с самого сервера и для клиентов подсети 10.10.10.0/24.
Пример страницы со статусом работы сервера:

Включение статистики необходимо, например, при настройке мониторинга сервера Apache через Zabbix.
Отключение разрешения DNS имени для клиентских подключений
Разрешение доменных имен клиентских подключений может очень сильно тормозить работу веб сервера. Лучше в явном виде отключить опцию разрешения доменных имен для клиентских подключений:
HostNameLookups Off
По умолчанию эта опция уже выключена, но стоит перепроверить конфигурационные файлы на предмет того – вдруг кто-то включил эту опция, скажем, в процессе дебага и не выключил обратно.
Оптимазация создания процессов
Этот подраздел посвящен параметрам, которое отвечают за пул процессов, которые ожидают подключения клиентов. Эти процессы находятся в состоянии ожидания (idle) и которые в любой момент принять клиентские подключения.
Параметрами, которые отвечают за пул процессов, ожидающих соединения, являются MinSpareServers и MaxSpareServers. Если процессов, ожидающих соединения, меньше чем значение параметра MinSpareServers, то сервер Apache создаст новые процессы, чтобы поддержать заданный минимум. Но в то же время таких ожидающих процессов не может быть больше, чем значение параметра MaxSpareServers. Если их больше этого значения, то лишние процессы будут завершены.
Значения для MinSpareServers и MaxSpareServers необходимо подбирать для каждого сервера индивидуально – в зависимости от текущей нагрузки на севрвер.
Также важен параметр ServerLimit (в более старых версиях – MaxClients). Он указывает максимальное количество подключений, которые сервер может принять. Если фактических подключений больше, то сервер не сможет принять лишние подключения.
Параметры выше необходимо указывать в следующем конфигурационном файле для Ubuntu Server 22.04:
/etc/apache2/apache2.conf
Для Rocky Linux 9.3 конфигурационный файл расположен по следующему пути:
/etc/httpd/conf/httpd.conf
Пример конфигурации:
ServerLimit 150
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
Назначение каждого из параметров я привел в таблице ниже.
Параметр | Назначение |
ServerLimit | Максимальное количество обслуживаемых процессов |
StartServers | Количество процессов, которые создаются при запуске сервера |
MinSpareServers | Минимальное количество готовых процессов, ожидающих клиентские подключения |
MaxSpareServers | Максимальное количество готовых процессов, ожидающих клиентские подключения |
MaxRequestWorkers | Максимальное количество процессов, которые сервер может обслуживать одновременно. При увеличении этого параметра необходимо эквивалентно увеличить значение параметра ServerLimit |
MaxConnectionsPerChild | Максимальное количество соединений, которое может обработать дочерний процесс сервера Apache |
Выявление и устранение ошибок
Как и в любой другой системе в работе сервера Apache могут возникать ошибки – по разным причинам. В разделах ниже я очень кратко расскажу, что можно попробовать сделать при возникновении ошибок в работе сервера Apache.
Просмотр журналов
Самый первый шаг – это просмотр журналов.
Как правило, в Ubuntu Server 22.04 журналы расположены по следующему пути:
/var/log/apache2/

Стандартное расположение журналов в Rocky Linux 9.3 следующее:
/var/log/httpd/

Расположение журналов может отличаться – в зависимости от настроек виртуального хоста.
Также сообщения сервера Apache можно посмотреть через journalctl. Пример для Ubuntu Server 22.04:
sudo journalctl -u apache2

Пример для Rocky Linux 9.3:
sudo journalctl -u httpd

Анализ конфигурационных файлов
Возможные причины ошибок – ошибки в конфигурационных файлах и файлах .htaccess. О чем, скорее всего, сервер Apache напишет в журналах.
Напомню расположение основных конфигурационных файлов на сервере Ubuntu Server 22.04:
/etc/apache2/apache2.conf
/etc/apache2/sites-enabled/

Расположение основных конфигурационных файлов на сервере Rocky Linux 9.3:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d
