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>