Skip to main content

Apache HTTP Server

Базовое управление Apache

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

# Статус службы
sudo systemctl status apache2

# Запуск
sudo systemctl start apache2

# Остановка
sudo systemctl stop apache2

# Перезагрузка конфигурации
sudo systemctl reload apache2

# Полный перезапуск
sudo systemctl restart apache2

Проверка конфигурации

# Проверка синтаксиса конфигов
sudo apache2ctl configtest

# Вывод версии и настроек
apache2 -v

Структура конфигурации

/etc/apache2/
├── apache2.conf # Главный конфиг
├── ports.conf # Настройка портов
├── magic # MIME-типы
├── mods-available/ # Доступные модули
├── mods-enabled/ # Активные модули (симлинки)
├── sites-available/ # Доступные виртуальные хосты
├── sites-enabled/ # Активные хосты (симлинки)
├── conf-available/ # Дополнительные конфиги
└── conf-enabled/ # Активные доп. конфиги

Основные директории

# Корневая директория веб-сервера
/var/www/html/

# Логи Apache
/var/log/apache2/
├── access.log # Логи доступа
├── error.log # Логи ошибок
└── other_vhosts_access.log

# PID-файл
/var/run/apache2/apache2.pid

Создание виртуального хоста

1. Создание конфига

sudo nano /etc/apache2/sites-available/my-site.conf

2. Базовый конфиг виртуального хоста

<VirtualHost *:80>
# Основной домен и алиасы
ServerName mysite.local
ServerAlias www.mysite.local

# Email администратора
ServerAdmin webmaster@mysite.local

# Корневая директория сайта
DocumentRoot /var/www/mysite/public

# Логи
ErrorLog ${APACHE_LOG_DIR}/mysite-error.log
CustomLog ${APACHE_LOG_DIR}/mysite-access.log combined

# Настройки директории
<Directory /var/www/mysite/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted

# Для PHP
<IfModule mod_php7.c>
php_admin_value upload_max_filesize 10M
php_admin_value post_max_size 10M
</IfModule>
</Directory>

# Редиректы и алиасы
Alias /static /var/www/mysite/static

# Кастомные заголовки
Header set X-Content-Type-Options "nosniff"
Header set X-Frame-Options "SAMEORIGIN"
</VirtualHost>

3. Активация сайта

# Создать симлинк в sites-enabled
sudo a2ensite my-site.conf

# Отключить сайт
sudo a2dissite my-site.conf

# Перезагрузить Apache
sudo systemctl reload apache2

Работа с модулями

Просмотр модулей

# Список доступных модулей
ls /etc/apache2/mods-available/

# Список активных модулей
ls /etc/apache2/mods-enabled/

# Проверить конкретный модуль
apache2ctl -M | grep rewrite

Управление модулями

# Включить модуль
sudo a2enmod rewrite
sudo a2enmod headers
sudo a2enmod ssl

# Отключить модуль
sudo a2dismod rewrite

# Перезагрузить Apache после изменений
sudo systemctl reload apache2

Ключевые модули для разработки

# Обязательные
sudo a2enmod rewrite # ЧПУ и редиректы
sudo a2enmod headers # Кастомные заголовки
sudo a2enmod expires # Кэширование

# Для PHP
sudo a2enmod php8.1 # или другая версия PHP

# Для безопасности
sudo a2enmod security2 # ModSecurity

# Для отладки
sudo a2enmod info # Серверная информация

Настройка PHP с Apache

Установка PHP

# Проверка установленной версии PHP
php -v

# Установка PHP и модулей
sudo apt install php libapache2-mod-php php-cli php-mysql php-gd php-curl

Конфигурация PHP

# В виртуальном хосте
<IfModule mod_php.c>
php_value upload_max_filesize 10M
php_value post_max_size 10M
php_value memory_limit 128M
php_value max_execution_time 300
</IfModule>

Проверка PHP

Создай файл /var/www/html/info.php:

<?php
phpinfo();
?>

Открой в браузере: http://192.168.0.103/info.php

Безопасность Apache

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

# В основном конфиге или .htaccess
ServerTokens Prod # Минимизировать информацию о сервере
ServerSignature Off # Отключить подпись сервера

# Ограничить доступ к системным файлам
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>

# Запретить листинг директорий
Options -Indexes

Настройка .htaccess

Пример .htaccess в корне сайта:

# Базовые редиректы
RewriteEngine On
RewriteBase /

# Редирект с www на без www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

# Защита от hotlinking изображений
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mysite\.local/.*$ [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [F]

# Кэширование статики
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
</IfModule>

Ограничение доступа по IP

# Разрешить только локальные IP
<Directory /var/www/admin>
Require ip 192.168.0.0/24
Require local
</Directory>

# Или запретить определенные IP
<Directory /var/www/secure>
Require all granted
Require not ip 10.0.0.5
</Directory>

Мониторинг и логи

Просмотр логов в реальном времени

# Логи доступа
sudo tail -f /var/log/apache2/access.log

# Логи ошибок
sudo tail -f /var/log/apache2/error.log

# Фильтр по IP
sudo tail -f /var/log/apache2/access.log | grep "192.168.0.100"

# Поиск ошибок
sudo grep -i error /var/log/apache2/error.log

Статистика Apache

# Включить модуль статуса
sudo a2enmod status

# Конфиг для статуса (в sites-available)
<Location /server-status>
SetHandler server-status
Require local # Только локальный доступ
</Location>

# Проверить статус сервера
curl http://localhost/server-status?auto

Мониторинг производительности

# Проверка активных соединений
sudo netstat -anp | grep :80 | wc -l

# Использование памяти Apache
ps aux | grep apache | awk '{sum+=$6} END {print sum/1024 " MB"}'

Решение проблем

Ошибка "Address already in use"

# Проверить, какой процесс использует порт
sudo lsof -i :80
sudo lsof -i :443

# Остановить конфликтующий процесс
sudo systemctl stop nginx # если мешает Nginx

Ошибка "Permission denied"

# Проверить права на директории
sudo chown -R www-data:www-data /var/www/mysite
sudo chmod -R 755 /var/www/mysite

# Права на логи
sudo chown root:adm /var/log/apache2
sudo chmod 750 /var/log/apache2

Apache не запускается

# Проверить синтаксис конфигов
sudo apache2ctl configtest

# Посмотреть подробные ошибки
sudo journalctl -xe | grep apache

# Проверить занятость портов
sudo netstat -tlnp | grep :80

Сброс конфигурации

# Отключить все сайты
sudo a2dissite *.conf

# Оставить только default
sudo a2ensite 000-default.conf

# Перезапустить Apache
sudo systemctl restart apache2

Полезные команды для разработки

Тестирование редиректов

# Проверить заголовки ответа
curl -I http://192.168.0.103

# Следить за логами во время тестирования
sudo tail -f /var/log/apache2/access.log &
curl http://192.168.0.103/test

Быстрое создание тестового сайта

# Создать директорию
sudo mkdir -p /var/www/test/{public,logs,backup}

# Создать index.html
echo "<h1>Test Site</h1>" | sudo tee /var/www/test/public/index.html

# Создать конфиг
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/test.conf
sudo sed -i 's|/var/www/html|/var/www/test/public|g' /etc/apache2/sites-available/test.conf

# Активировать
sudo a2ensite test.conf
sudo systemctl reload apache2

Конфигурация для продакшена

Оптимизация Apache

# В /etc/apache2/apache2.conf или /etc/apache2/conf-available/optimize.conf

# KeepAlive настройки
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

# Мультипроцессорный модуль (MPM)
<IfModule mpm_prefork_module>
StartServers 2
MinSpareServers 2
MaxSpareServers 5
MaxRequestWorkers 150
MaxConnectionsPerChild 1000
</IfModule>

# Сжатие gzip
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
</IfModule>

Включение HTTPS

# Активировать SSL модуль
sudo a2enmod ssl

# Создать самоподписанный сертификат
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/apache-selfsigned.key \
-out /etc/ssl/certs/apache-selfsigned.crt

# Добавить SSL конфиг в виртуальный хост
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
</VirtualHost>

Ссылки на документацию