Apache HTTP Server — один из самых популярных веб-серверов в мире, разработкой которого занимается Apache Software Foundation. Он отличается надёжностью, гибкостью и модульной архитектурой, что позволяет настраивать его под любые задачи — от простого хостинга личного блога до высоконагруженных корпоративных проектов.
В этой статье мы подробно разберём установку Apache на различных операционных системах, базовую настройку конфигурационных файлов, создание виртуальных хостов, работу с .htaccess и многое другое с наглядными примерами.
1. Установка Apache
Способ установки зависит от вашей операционной системы. Рассмотрим основные варианты.
1.1 Установка на Ubuntu / Debian
В дистрибутивах на основе Debian пакет Apache называется apache2.
# Обновление списка пакетов
sudo apt update
# Установка Apache
sudo apt install apache2
# Автоматический запуск при загрузке системы
sudo systemctl enable apache2
# Запуск сервера
sudo systemctl start apache2После установки откройте в браузере http://localhost — вы должны увидеть стандартную страницу приветствия Apache с надписью «It Works!».
Важно: Если порт 80 уже занят другим сервером, измените порт в файле конфигурации (об этом ниже).
1.2 Установка на CentOS / RHEL / Rocky Linux
В этих дистрибутивах пакет называется httpd.
# Установка Apache (и PHP, если требуется)
sudo dnf install httpd php
# Автоматический запуск при загрузке
sudo systemctl enable httpd
# Запуск сервера
sudo systemctl start httpd1.3 Установка на Windows
Для Windows Apache распространяется в виде бинарных установщиков (файлы .msi):
- Скачайте последнюю версию с официального сайта Apache.
- Запустите установщик и следуйте инструкциям мастера установки.
- По умолчанию Apache устанавливается на порт 80.
- Для запуска из командной строки перейдите в папку
binи выполните: httpd.exe или установите Apache как системную службу.
1.4 Установка из исходных кодов
Если вам нужна максимальная гибкость или специфическая конфигурация сборки:
# Скачивание дистрибутива (замените NN на версию, например 2.4.57)
gzip -d httpd-NN.tar.gz
tar xvf httpd-NN.tar
cd httpd-NN
# Конфигурация с указанием пути установки
./configure --prefix=/usr/local/apache2
# Сборка и установка
make
make install
# Запуск
/usr/local/apache2/bin/apachectl -k start
# Скачивание (замените NN на версию)
wget https://downloads.apache.org/httpd/httpd-NN.tar.gzПодробные инструкции по установке из исходных кодов доступны в официальной документации Apache.
2. Структура конфигурационных файлов
Apache настраивается с помощью директив, размещаемых в текстовых конфигурационных файлах. Основные файлы и директории:
| Система | Главный конфигурационный файл | Дополнительные директивы |
|---|---|---|
| Ubuntu/Debian | /etc/apache2/apache2.conf | /etc/apache2/sites-available/, /etc/apache2/conf-available/ |
| CentOS/RHEL | /etc/httpd/conf/httpd.conf | /etc/httpd/conf.d/ |
| Arch Linux | /etc/httpd/conf/httpd.conf | включаемые файлы в conf/extra/ |
Главный конфигурационный файл обычно называется httpd.conf. Его расположение задаётся при компиляции, но может быть переопределено флагом -f командной строки.
Синтаксис конфигурационных файлов:
- Одна директива на строку
- Для переноса строки используется обратный слеш
\в конце строки - Директивы регистронезависимы, но аргументы часто чувствительны к регистру
- Строки, начинающиеся с
#, являются комментариями - Пустые строки и пробелы в начале строки игнорируются
Проверка синтаксиса
Перед перезапуском сервера всегда проверяйте конфигурацию на ошибки:
apachectl configtest
# или
httpd -tЕсли синтаксис корректен, вы увидите: Syntax OK. Это спасёт вас от случайного падения сервера из-за опечаток.
3. Основные директивы httpd.conf
Разберём ключевые директивы, которые вы найдёте в главном конфигурационном файле.
3.1 Базовые настройки сервера
# Корневая директория сервера (содержит конфигурацию, модули, логи)
# CentOS / RHEL
ServerRoot "/etc/httpd"
# Ubuntu / Debian
ServerRoot "/etc/apache2"
# Таймаут ожидания ответа от клиента (в секундах)
Timeout 60
# Адрес электронной почты администратора
ServerAdmin admin@example.com3.2 Порт и привязка
Директива Listen определяет, на каких портах и интерфейсах Apache ожидает соединения:
# Слушать все интерфейсы на порту 80
Listen 80
# Слушать только локальный интерфейс (для разработки)
Listen 127.0.0.1:80
# Слушать порт 8080 на всех интерфейсах
Listen 8080
# Несколько портов
Listen 80
Listen 4433.3 Корневая директория документов
DocumentRoot — папка, откуда Apache будет отдавать файлы сайта:
DocumentRoot "/var/www/html"
# ВНИМАНИЕ: при изменении DocumentRoot
# необходимо также изменить соответствующую секцию <Directory>
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>Если забыть изменить секцию <Directory>, вы получите ошибку 403 (доступ запрещён).
3.4 Управление подключениями
# Включение постоянных соединений (Keep-Alive)
KeepAlive On
# Максимальное количество запросов в одном соединении
MaxKeepAliveRequests 100
# Время ожидания следующего запроса в постоянном соединении
KeepAliveTimeout 53.5 Настройки производительности (MPM — Multi-Processing Module)
Apache может работать в различных режимах обработки запросов. Настройки зависят от выбранного MPM-модуля (prefork, worker, event).
Пример для MPM Prefork (используется по умолчанию во многих сборках):
<IfModule mpm_prefork_module>
StartServers 5 # Количество дочерних процессов при старте
MinSpareServers 5 # Минимальное количество свободных процессов
MaxSpareServers 10 # Максимальное количество свободных процессов
MaxRequestWorkers 150 # Максимальное количество одновременно работающих процессов
MaxConnectionsPerChild 10000 # Лимит запросов на один процесс (для защиты от утечек)
</IfModule>Prefork часто используется с mod_php. На современных системах (Ubuntu 18.04+) по умолчанию ставится MPM Event — он эффективнее, но требует PHP-FPM вместо mod_php.
4. Виртуальные хосты (Virtual Hosts)
Виртуальные хосты позволяют размещать несколько сайтов на одном сервере. Различают два типа:
- Name-based — несколько доменов на одном IP-адресе
- IP-based — разные IP-адреса для разных сайтов
4.1 Настройка name-based виртуальных хостов
Шаг 1: Создайте директории для сайтов:
# Создание папок для сайтов
mkdir -p /var/www/site1.com/public_html
mkdir -p /var/www/site2.com/public_html
# Создание тестовых страниц
echo "<h1>Site 1</h1>" > /var/www/site1.com/public_html/index.html
echo "<h1>Site 2</h1>" > /var/www/site2.com/public_html/index.htmlШаг 2: Добавьте виртуальные хосты в конфигурацию (в конец httpd.conf или в отдельный файл):
# Первый сайт
<VirtualHost *:80>
ServerName site1.com
ServerAlias www.site1.com
DocumentRoot /var/www/site1.com/public_html
<Directory /var/www/site1.com/public_html>
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/apache/site1-error.log
CustomLog /var/log/apache/site1-access.log combined
</VirtualHost>
# Второй сайт
<VirtualHost *:80>
ServerName site2.com
ServerAlias www.site2.com
DocumentRoot /var/www/site2.com/public_html
<Directory /var/www/site2.com/public_html>
AllowOverride All
Require all granted
</Directory>
ErrorLog /var/log/apache/site2-error.log
CustomLog /var/log/apache/site2-access.log combined
</VirtualHost>4.2 Организация sites-available / sites-enabled (рекомендуемый подход)
Этот подход, популярный в Debian/Ubuntu, упрощает управление множеством сайтов:
# Создание директорий
mkdir -p /etc/httpd/sites-available
mkdir -p /etc/httpd/sites-enabled
# Добавление в httpd.conf в самом конце:
IncludeOptional /etc/httpd/sites-enabled/*.confТеперь каждый сайт получает отдельный файл в sites-available/, а активация происходит через символическую ссылку в sites-enabled/:
# Создание конфигурации сайта
nano /etc/httpd/sites-available/site1.conf
# Активация сайта (создание симлинка)
ln -s /etc/httpd/sites-available/site1.conf /etc/httpd/sites-enabled/
# Деактивация сайта
rm /etc/httpd/sites-enabled/site1.confПочему это удобно? Если конфигурация одного сайта содержит ошибку, при перезапуске Apache не запустится ни один сайт. Схема
sites-available/sites-enabledпозволяет временно отключать проблемные сайты, удаляя симлинк.
4.3 Виртуальный хост по умолчанию
<VirtualHost _default_:*>
DocumentRoot /var/www/default
<Directory /var/www/default>
Require all granted
</Directory>
</VirtualHost>5. Работа с .htaccess
.htaccess — это распределённый конфигурационный файл, который позволяет изменять настройки на уровне отдельных директорий без редактирования основного конфига.
5.1 Включение .htaccess
По умолчанию .htaccess отключён из соображений безопасности и производительности. Чтобы включить его, в секции <Directory> для нужной папки укажите:
<Directory "/var/www/html">
AllowOverride All # Разрешить все директивы из .htaccess
# или более точечно:
# AllowOverride FileInfo AuthConfig Limit
</Directory>Значения AllowOverride:
| Значение | Что разрешает |
|---|---|
None | Полностью игнорировать .htaccess (по умолчанию) |
All | Разрешить все директивы |
FileInfo | Директивы для управления документами (например, AddType) |
AuthConfig | Директивы авторизации (например, AuthType, Require) |
Limit | Директивы ограничения доступа (например, Allow, Deny) |
5.2 Примеры .htaccess
Редиректы:
<IfModule mod_alias.c>
# Постоянный редирект 301
Redirect permanent /old-page.html /new-page.html
# Временный редирект 302
Redirect temp /special-offer /new-offer
# Редирект на внешний сайт
Redirect "/service" "http://foo2.example.com/service"
# Редирект 301 с регулярным выражением
RedirectMatch 301 "^/oldfile\.html/?$" "http://example.com/newfile.php"
</IfModule>Перенаправление с www на без www и наоборот:
<IfModule mod_rewrite.c>
RewriteEngine On
# Перенаправление с example.com на www.example.com
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
# Или наоборот: с www на без www
# RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
# RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
</IfModule>Перенаправление HTTP → HTTPS:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>CORS (Cross-Origin Resource Sharing):
<IfModule mod_headers.c>
# Разрешить доступ с любых сайтов
Header set Access-Control-Allow-Origin "*"
# Или только с конкретного домена
# Header set Access-Control-Allow-Origin "https://example.com"
</IfModule>Блокировка доступа по IP:
<RequireAll>
Require all granted
Require not ip 192.168.1.100
Require not ip 10.0.0.0/8
</RequireAll>ЧПУ (человеко-понятные URL) для PHP:
<IfModule mod_rewrite.c>
RewriteEngine On
# Пример: /article/123 → article.php?id=123
RewriteRule ^article/([0-9]+)$ article.php?id=$1 [L]
# Пример: /product/123/phone → product.php?id=123&name=phone
RewriteRule ^product/([0-9]+)/([a-z-]+)$ product.php?id=$1&name=$2 [L]
</IfModule>5.3 Когда НЕ стоит использовать .htaccess
Использование .htaccess снижает производительность, так как Apache проверяет эти файлы при каждом запросе в каждой директории. Если у вас есть доступ к основному конфигурационному файлу сервера (httpd.conf), предпочтительнее размещать директивы в секциях <Directory> — они обрабатываются один раз при запуске сервера.
Если вы часто настраиваете редиректы и ЧПУ, вручную прописывать правила в .htaccess или конфигах бывает долго и легко допустить опечатку. В нашем конструкторе правил для Apache можно собрать типовые сценарии (редиректы, ЧПУ, CORS, блокировку IP) в пару кликов и получить готовый блок кода для вставки в конфиг или .htaccess.
6. Модули Apache
Apache — модульный сервер. Базовая функциональность встроена в ядро, а расширенные возможности подключаются через модули.
6.1 Подключение модулей
# Загрузка модуля mod_rewrite (для ЧПУ и редиректов)
LoadModule rewrite_module modules/mod_rewrite.so
# Загрузка модуля mod_headers (для управления HTTP-заголовками)
LoadModule headers_module modules/mod_headers.so
# Загрузка модуля mod_ssl (для HTTPS)
LoadModule ssl_module modules/mod_ssl.soНа Ubuntu/Debian для этого есть штатные команды:
# Включение модуля
sudo a2enmod rewrite
sudo a2enmod ssl
# Выключение
sudo a2dismod rewrite
# Включение / выключение сайта
sudo a2ensite site1.conf
sudo a2dissite site1.conf
# Включение / выключение конфига
sudo a2enconf security
sudo a2disconf security6.2 Основные модули
| Модуль | Назначение |
|---|---|
mod_rewrite | Управление URL, ЧПУ, редиректы |
mod_ssl | Поддержка HTTPS (SSL/TLS) |
mod_headers | Управление HTTP-заголовками, CORS |
mod_alias | Редиректы и псевдонимы |
mod_php | Обработка PHP (или PHP-FPM) |
mod_proxy | Прокси-сервер, балансировка нагрузки |
6.3 Условное выполнение директив
Используйте <IfModule> для безопасного включения директив, которые зависят от наличия модуля:
<IfModule mod_rewrite.c>
RewriteEngine On
# ... правила перезаписи ...
</IfModule>
<IfModule mod_headers.c>
Header set X-Frame-Options "DENY"
</IfModule>7. Настройка HTTPS (SSL/TLS)
7.1 Создание самоподписанного сертификата
# Создание директории для сертификатов
sudo mkdir -p /etc/apache2/ssl
# Генерация сертификата (замените SERVER_FQDN на ваше доменное имя)
sudo openssl req -x509 -nodes \
-addext "subjectAltName=DNS:SERVER_FQDN,DNS:www.SERVER_FQDN" \
-days 730 \
-newkey rsa:2048 \
-keyout /etc/apache2/ssl/SSL.key \
-out /etc/apache2/ssl/SSL.crtФлаг -addext доступен в OpenSSL 1.1.1+. На старых системах используйте конфиг-файл с subjectAltName.
7.2 Настройка виртуального хоста для HTTPS
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/example.com/public_html
# Включение SSL
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/SSL.crt
SSLCertificateKeyFile /etc/apache2/ssl/SSL.key
ErrorLog /var/log/apache/example-error.log
CustomLog /var/log/apache/example-access.log combined
</VirtualHost>7.3 Перенаправление HTTP → HTTPS
<VirtualHost *:80>
ServerName example.com
Redirect permanent / https://example.com/
</VirtualHost>8. Управление сервисом
8.1 systemd (Ubuntu/Debian/CentOS 7+)
# Запуск
sudo systemctl start apache2 # Ubuntu
sudo systemctl start httpd # CentOS
# Остановка
sudo systemctl stop apache2
# Перезапуск (для применения изменений конфигурации)
sudo systemctl restart apache2
# Плавный перезапуск (без разрыва соединений)
sudo systemctl reload apache2
# Проверка статуса
sudo systemctl status apache2
# Автозапуск при загрузке
sudo systemctl enable apache28.2 Apache control (apachectl)
# Запуск
sudo apachectl start
# Остановка
sudo apachectl stop
# Перезапуск
sudo apachectl restart
# Плавный перезапуск
sudo apachectl graceful
# Проверка конфигурации
sudo apachectl configtest9. Настройка фаервола
Не забудьте открыть порты в фаерволе:
Ubuntu (UFW):
sudo ufw allow 'Apache Full' # HTTP (80) и HTTPS (443)CentOS/RHEL (firewalld):
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload10. Безопасность
10.1 Скрытие информации о сервере
# В httpd.conf
ServerTokens Prod # Минимум информации в заголовках
ServerSignature Off # Отключить подпись на страницах ошибок10.2 Защита конфиденциальных директорий
<Directory "/var/www/html/admin">
Require all denied
# или ограничить по IP:
# Require ip 192.168.1.0/24
</Directory>10.3 Защита от кликджекинга
<IfModule mod_headers.c>
Header set X-Frame-Options "SAMEORIGIN"
Header set X-Content-Type-Options "nosniff"
</IfModule>Такие заголовки, как X-Frame-Options и X-Content-Type-Options, удобно добавлять через конструктор правил: там есть готовые блоки под разные сценарии, которые можно сразу вставить в конфиг.
11. Заключение
Мы рассмотрели полный цикл работы с Apache HTTP Server: от установки до тонкой настройки. Ключевые моменты, которые стоит запомнить:
- Всегда проверяйте конфигурацию командой
apachectl configtestперед перезапуском. - Используйте виртуальные хосты для размещения нескольких сайтов.
- Применяйте схему sites-available/sites-enabled для удобного управления сайтами.
- По возможности избегайте .htaccess в пользу основного конфига — это быстрее.
- Не забывайте про безопасность: скрывайте версию сервера, настраивайте заголовки, ограничивайте доступ.
Освоив базовые настройки Apache, вы сможете гибко управлять сервером. А чтобы не держать в голове частые шаблоны (редиректы, заголовки, ограничения доступа), используйте конструктор правил — он поможет быстро собрать нужный блок конфигурации под вашу задачу.
