Руководство по установке и настройке Apache HTTP Server

Apache HTTP Server — один из самых популярных веб-серверов в мире, разработкой которого занимается Apache Software Foundation. Он отличается надёжностью, гибкостью и модульной архитектурой, что позволяет настраивать его под любые задачи — от простого хостинга личного блога до высоконагруженных корпоративных проектов.

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

1. Установка Apache

Способ установки зависит от вашей операционной системы. Рассмотрим основные варианты.

1.1 Установка на Ubuntu / Debian

В дистрибутивах на основе Debian пакет Apache называется apache2.

Bash
# Обновление списка пакетов
sudo apt update

# Установка Apache
sudo apt install apache2

# Автоматический запуск при загрузке системы
sudo systemctl enable apache2

# Запуск сервера
sudo systemctl start apache2

После установки откройте в браузере http://localhost — в чистых сборках Apache вы увидите страницу «It works!»; в Ubuntu/Debian пакет apache2 ставит собственную страницу по умолчанию (со своим оформлением), так что вид страницы может отличаться — сам факт, что сервер отвечает на порту 80, остаётся показателем успешного запуска.

Важно: Если порт 80 уже занят другим сервером, измените порт в файле конфигурации (об этом ниже).

1.2 Установка на CentOS / RHEL / Rocky Linux

В этих дистрибутивах пакет называется httpd.

Bash
# Установка Apache (и PHP, если требуется)
sudo dnf install httpd php

# Автоматический запуск при загрузке
sudo systemctl enable httpd

# Запуск сервера
sudo systemctl start httpd

1.3 Установка на Windows

Официальный проект Apache Software Foundation не выпускает готовые установщики для Windows, а предоставляет только исходный код. Для получения скомпилированного сервера используются сторонние сборки (актуальная и поддерживаемая — Apache Lounge; ApacheHaus устарела и обновлялась только до ветки 2.4.23 в 32-битном виде).

  1. Скачайте .zip-архив с актуальной версией Apache (например, Apache 2.4) с сайта Apache Lounge.
  2. Распакуйте содержимое архива в корень системного диска (обычно в C:\Apache24).
  3. По умолчанию Apache настроен на порт 80. Чтобы запустить его, откройте командную строку от имени администратора, перейдите в папку bin (cd C:\Apache24\bin) и выполните: httpd.exe.
  4. Чтобы установить Apache как системную службу Windows (для автозапуска), выполните команду: httpd.exe -k install.

1.4 Установка из исходных кодов

Если вам нужна максимальная гибкость или специфическая конфигурация сборки. Обратите внимание, что для успешной компиляции как правило требуются apr и apr-util; актуальный список зависимостей — в документации.

Bash
# Скачивание дистрибутива (замените NN на актуальную версию, например 2.4.57)
wget https://dlcdn.apache.org/httpd/httpd-2.4.62.tar.gz

# Распаковка архива
tar xzf httpd-2.4.62.tar.gz
cd httpd-2.4.62

# Конфигурация с указанием пути установки
./configure --prefix=/usr/local/apache2

# Сборка и установка
make
make install

# Запуск сервера
/usr/local/apache2/bin/apachectl -k start

Подробные инструкции по установке из исходных кодов доступны в официальной документации 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 /path/to/httpd.conf.

Синтаксис конфигурационных файлов:

  • Одна директива на строку
  • Для переноса строки используется обратный слеш \ в конце строки
  • Директивы регистронезависимы, но аргументы часто чувствительны к регистру
  • Строки, начинающиеся с #, являются комментариями
  • Пустые строки и пробелы в начале строки игнорируются

Проверка синтаксиса

Перед перезапуском сервера всегда проверяйте конфигурацию на ошибки:

Bash
apachectl configtest
# или
httpd -t

Если синтаксис корректен, вы увидите: Syntax OK. Это спасёт вас от случайного падения сервера из-за опечаток.

3. Основные директивы httpd.conf

Разберём ключевые директивы, которые вы найдёте в главном конфигурационном файле.

3.1 Базовые настройки сервера

Apache
# Корневая директория сервера (содержит конфигурацию, модули, логи)
# CentOS / RHEL
ServerRoot "/etc/httpd"

# Ubuntu / Debian
ServerRoot "/etc/apache2"

# Таймаут ожидания ответа от клиента (в секундах)
Timeout 60

# Адрес электронной почты администратора
ServerAdmin admin@example.com

3.2 Порт и привязка

Директива Listen определяет, на каких портах и интерфейсах Apache ожидает соединения:

Apache
# Слушать все интерфейсы на порту 80
Listen 80

# Слушать только локальный интерфейс (для разработки)
Listen 127.0.0.1:80

# Слушать порт 8080 на всех интерфейсах
Listen 8080

# Несколько портов
Listen 80
Listen 443

3.3 Корневая директория документов

DocumentRoot — папка, откуда Apache будет отдавать файлы сайта:

Apache
DocumentRoot "/var/www/html"

# ВНИМАНИЕ: при изменении DocumentRoot
# необходимо также изменить соответствующую секцию <Directory>
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

Если забыть изменить секцию <Directory>, вы получите ошибку 403 (доступ запрещён).

3.4 Управление подключениями

Apache
# Включение постоянных соединений (Keep-Alive)
KeepAlive On

# Максимальное количество запросов в одном соединении
MaxKeepAliveRequests 100

# Время ожидания следующего запроса в постоянном соединении
KeepAliveTimeout 5

3.5 Настройки производительности (MPM — Multi-Processing Module)

Apache может работать в различных режимах обработки запросов. Настройки зависят от выбранного MPM-модуля (prefork, worker, event).

Пример для MPM Prefork (используется по умолчанию во многих сборках):

Apache
<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: Создайте директории для сайтов:

Bash
# Создание папок для сайтов
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 или в отдельный файл):

Apache
# Первый сайт
<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/apache2/site1.com-error.log
    CustomLog /var/log/apache2/site1.com-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/apache2/site2.com-error.log
    CustomLog /var/log/apache2/site2.com-access.log combined
</VirtualHost>

4.2 Организация sites-available / sites-enabled (рекомендуемый подход)

Этот подход, популярный в Debian/Ubuntu, упрощает управление множеством сайтов:

Bash
# Создание директорий
mkdir -p /etc/httpd/sites-available
mkdir -p /etc/httpd/sites-enabled

# Для систем с SELinux (CentOS/RHEL) обязательно восстанавливаем контекст безопасности,
# иначе Apache не сможет прочитать конфигурационные файлы из новых папок:
sudo restorecon -Rv /etc/httpd

# Добавление в httpd.conf в самом конце:
IncludeOptional /etc/httpd/sites-enabled/*.conf

Теперь каждый сайт получает отдельный файл в sites-available/, а активация происходит через символическую ссылку в sites-enabled/:

Bash
# Создание конфигурации сайта
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 Виртуальный хост по умолчанию

Apache
<VirtualHost _default_:*>
    DocumentRoot /var/www/default
    <Directory /var/www/default>
        Require all granted
    </Directory>
</VirtualHost>

5. Работа с .htaccess

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

5.1 Включение .htaccess

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

Apache
<Directory "/var/www/html">
    AllowOverride All   # Разрешить все директивы из .htaccess
    # или более точечно:
    # AllowOverride FileInfo AuthConfig Limit
</Directory>

Значения AllowOverride:

ЗначениеЧто разрешает
NoneПолностью игнорировать .htaccess (по умолчанию)
AllРазрешить все директивы
FileInfoДирективы для управления документами (например, AddType)
AuthConfigДирективы авторизации (например, AuthType, Require)
LimitДирективы ограничения доступа (например, Allow, Deny)Директивы ограничения доступа (например, актуальная Require или устаревшие Allow, Deny)

5.2 Примеры .htaccess

Редиректы:

Apache
<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 и наоборот:

Apache
<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]
    # Для HTTPS-сайта менять схему на https://.
    
    # Или наоборот: с www на без www
    # RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
    # RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
</IfModule>

Перенаправление HTTP → HTTPS:

Apache
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

CORS (Cross-Origin Resource Sharing):

Apache
<IfModule mod_headers.c>
    # Разрешить доступ с любых сайтов
    Header set Access-Control-Allow-Origin "*"
    
    # Или только с конкретного домена
    # Header set Access-Control-Allow-Origin "https://example.com"
</IfModule>

Блокировка доступа по IP:

Apache
<RequireAll>
    Require not ip 192.168.1.100
    Require not ip 10.0.0.0/8
</RequireAll>

ЧПУ (человеко-понятные URL) для PHP:

Apache
<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 Подключение модулей

Apache
# Загрузка модуля 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 для этого есть штатные команды:

Bash
# Включение модуля
sudo a2enmod rewrite
sudo a2enmod ssl

# Выключение
sudo a2dismod rewrite

# Включение / выключение сайта
sudo a2ensite site1.conf
sudo a2dissite site1.conf

# Включение / выключение конфига
sudo a2enconf security
sudo a2disconf security

6.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> для безопасного включения директив, которые зависят от наличия модуля:

Apache
<IfModule mod_rewrite.c>
    RewriteEngine On
    # ... правила перезаписи ...
</IfModule>

<IfModule mod_headers.c>
    Header set X-Frame-Options "DENY"
</IfModule>

7. Настройка HTTPS (SSL/TLS)

7.1 Создание самоподписанного сертификата

Bash
# Создание директории для сертификатов
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

Apache
<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>

ВАЖНО! На HTTPS-хосте ErrorLog /var/log/apache/... — на Ubuntu каталог называется /var/log/apache2/.

7.3 Перенаправление HTTP → HTTPS

Apache
<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

8. Управление сервисом

8.1 systemd (Ubuntu/Debian/CentOS 7+)

Bash
# Запуск
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 apache2

8.2 Apache control (apachectl)

Bash
# Запуск
sudo apachectl start

# Остановка
sudo apachectl stop

# Перезапуск
sudo apachectl restart

# Плавный перезапуск
sudo apachectl graceful

# Проверка конфигурации
sudo apachectl configtest

9. Настройка фаервола

Не забудьте открыть порты в фаерволе:

Ubuntu (UFW):

Bash
sudo ufw allow 'Apache Full'   # HTTP (80) и HTTPS (443)

CentOS/RHEL (firewalld):

Bash
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

10. Безопасность

10.1 Скрытие информации о сервере

Apache
# В httpd.conf
ServerTokens Prod          # Минимум информации в заголовках
ServerSignature Off        # Отключить подпись на страницах ошибок

10.2 Защита конфиденциальных директорий

Apache
<Directory "/var/www/html/admin">
    Require all denied
    # или ограничить по IP:
    # Require ip 192.168.1.0/24
</Directory>

10.3 Защита от кликджекинга

Apache
<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: от установки до тонкой настройки. Ключевые моменты, которые стоит запомнить:

  1. Всегда проверяйте конфигурацию командой apachectl configtest перед перезапуском.
  2. Используйте виртуальные хосты для размещения нескольких сайтов.
  3. Применяйте схему sites-available/sites-enabled для удобного управления сайтами.
  4. По возможности избегайте .htaccess в пользу основного конфига — это быстрее.
  5. Не забывайте про безопасность: скрывайте версию сервера, настраивайте заголовки, ограничивайте доступ.

Освоив базовые настройки Apache, вы сможете гибко управлять сервером. А чтобы не держать в голове частые шаблоны (редиректы, заголовки, ограничения доступа), используйте конструктор правил — он поможет быстро собрать нужный блок конфигурации под вашу задачу.

👤 Зарегистрируйтесь, чтобы добавить материал в закладки.