Налаштування Apache: оптимізація, безпека та кешування
Уявіть: інтернет-магазин на WordPress з 1000 унікальних відвідувачів на годину видає 503 помилку. Типова картина — Apache вичерпав MaxClients, а PHP-FPM не налаштований. Без кешування кожен запит до статики (CSS, JS, зображення) завантажує сервер заново — LCP вилітає за 5 секунд. У 90% випадків це вирішується переходом на PHP-FPM через Unix-сокет та увімкненням mod_expires. За 10 років ми налаштували Apache для 500+ проектів: від простих лендінгів до високонавантажених SaaS. Нижче — перевірена схема, яка зменшує TTFB на 30% і знижує споживання пам'яті на 40%.
Неочевидна проблема — .htaccess. На кожен запит Apache перевіряє директорії від кореня до DocumentRoot на наявність .htaccess. Для глибоких структур це до 10 дискових операцій. Ми використовуємо AllowOverride None і переносимо правила в конфіг VirtualHost. Це прискорює віддачу на 15–20%.
Типові проблеми, з якими ми працюємо
- Повільна віддача статики — без mod_expires і mod_deflate браузер щоразу запитує файли заново, LPC зростає на 30%.
- Небезпечні VirtualHost — відкриті директорії, застарілі протоколи, відсутність HSTS.
- Некорректний .htaccess — Laravel не працює через відсутність RewriteRule, .env доступний ззовні.
- PHP-FPM через TCP, а не Unix-сокет — зайві 20% затримки на localhost.
- Відсутність rate limiting — один клієнт може викачати весь контент за секунди.
Як ми налаштовуємо Apache під ключ
Наш стек: Apache 2.4+, PHP 8.3 (FPM через socket), Laravel, WordPress, будь-яка CMS. Для кожного проекту створюємо Production-ready конфіг з урахуванням навантаження. Ось приклад для Laravel:
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/myapp/current/public
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Protocols h2 http/1.1
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "DENY"
<Directory /var/www/myapp/current/public>
AllowOverride All
Require all granted
Options -Indexes
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
<FilesMatch "\.(css|js|jpg|png|gif|ico|svg|woff2)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/myapp-error.log
CustomLog ${APACHE_LOG_DIR}/myapp-access.log combined
</VirtualHost>
Приклад конфігурації для WordPress із додатковою оптимізацією
<VirtualHost *:443>
ServerName blog.example.com
DocumentRoot /var/www/wp/current
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/blog.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/blog.example.com/privkey.pem
Protocols h2 http/1.1
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
<Directory /var/www/wp/current>
AllowOverride None
Require all granted
Options -Indexes +FollowSymLinks
# WordPress rewrite rules
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
</IfModule>
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/json application/javascript
DeflateCompressionLevel 6
</IfModule>
ErrorLog ${APACHE_LOG_DIR}/wp-error.log
CustomLog ${APACHE_LOG_DIR}/wp-access.log combined
</VirtualHost>
Що входить у роботу
- Аудит поточної конфігурації Apache.
- Налаштування VirtualHost, SSL (Let's Encrypt), HSTS.
- Оптимізація MPM event, gzip, кешування.
- .htaccess під вашу CMS (Laravel, WordPress, Drupal).
- Впровадження rate limiting і заголовків безпеки.
- Тестування навантаження (ab, siege) і передача документації.
- Навчання команди роботі з конфігами та підтримка після деплою.
Оптимізація MPM і кешування для високонавантажених проектів
Перший крок — вибір MPM. Для динамічних сайтів з PHP використовуйте mpm_event. Приклад оптимізації:
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
Потім увімкніть стиснення та кешування:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/json application/javascript
DeflateCompressionLevel 6
</IfModule>
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
</IfModule>
Типова помилка — використання mod_php замість PHP-FPM. Перший споживає на 40% більше пам'яті при пікових навантаженнях. Перехід на PHP-FPM знижує TTFB на 15% і збільшує пропускну здатність у 2 рази.
Чому варто використовувати PHP-FPM з Apache?
PHP-FPM через Unix-сокет знижує затримку на localhost на 20% порівняно з TCP-з'єднанням. Крім того, mod_php споживає на 40% більше пам'яті при пікових навантаженнях, оскільки кожен процес Apache тягне інтерпретатор. PHP-FPM дозволяє гнучко керувати пулом воркерів і окремо налаштовувати php.ini.
Чим Apache відрізняється від Nginx і коли його обирати?
| Критерій | Apache | Nginx |
|---|---|---|
| Обробка динаміки | mod_php (вбудований) | PHP-FPM (зовнішній) |
| .htaccess | Підтримується per-directory | Не підтримує |
| Пам'ять на з'єднання | Вища (процес на запит) | Нижча (event-driven) |
| Статика | Добре з mod_cache | Відмінно з коробки |
| Гнучкість конфігурації | Модульна, багато директив | Простіше, менше опцій |
Apache краще Nginx у 2 випадках: коли критичний .htaccess (shared-хостинг) або використовуються модулі на кшталт mod_ldap, mod_authnz_ldap. В іншому Nginx дає на 30% більше RPS на статиці.
Порівняння MPM-модулів Apache
| Параметр | mpm_prefork | mpm_worker | mpm_event |
|---|---|---|---|
| Тип процесів | Один потік на запит | Кілька потоків на процес | Потоки + подієвий цикл |
| Пам'ять | Висока (1 процес = 1 запит) | Середня | Низька |
| Сумісність | mod_php, старі застосунки | PHP-FPM, Python | PHP-FPM, Python, Node |
| Під навантаженням | Швидко виснажує пам'ять | Краще prefork | Оптимальний для високих навантажень |
Процес роботи з налаштування Apache
- Аналітика: вивчаємо поточний конфіг, навантаження, CMS.
- Проектування: підбираємо MPM, модулі, параметри кешу.
- Реалізація: налаштовуємо VirtualHost, SSL, .htaccess, rate limiting.
- Тестування: перевіряємо LCP, CLS, TTFB через Lighthouse, навантажувальне тестування.
- Деплой: застосовуємо конфіг, моніторимо логи, передаємо документацію.
Типові помилки, яких ми уникаємо:
- Відсутність Header always set X-Content-Type-Options "nosniff".
- Неправильні права на DocumentRoot (має бути 755, не 777).
- Використання mod_php замість PHP-FPM — на 40% більше споживання пам'яті.
Терміни орієнтовно
Базове налаштування Apache з PHP-FPM займає від 1 дня. Повний цикл з оптимізацією, безпекою та навантажувальним тестуванням — до 3 днів. Вартість розраховується індивідуально. Замовте аудит конфігурації — оцінимо проект і запропонуємо рішення під ключ.
Отримайте конфігурацію Apache, що відповідає найкращим практикам, з гарантією стабільної роботи під піковим навантаженням. Зв'яжіться з нами для консультації щодо вашого проекту.







