HostiServer
2026-01-23 13:35:00
Nginx vs Apache у 2026: порівняння, конфігурації, вибір
Nginx vs Apache у 2026: яка різниця насправді?
Якщо ви читаєте черговий "Nginx vs Apache" і чекаєте на однозначну відповідь — її не буде. Але буде дещо корисніше: реальні дані з продакшену, конкретні конфіги та чіткі критерії вибору.
Почнемо з факту: 70% клієнтів Hostiserver використовують Nginx (включаючи конфігурації з Nginx як Reverse Proxy). Чистий Apache зустрічається переважно на legacy-проєктах та специфічному Shared-хостингу. Тренд останніх років однозначний — Nginx + PHP-FPM витісняє Apache навіть там, де він колись був стандартом.
Але це не означає, що Apache мертвий. У деяких сценаріях він досі незамінний — особливо там, де потрібна динамічна конфігурація через .htaccess або специфічні модулі. Саме тому важливо розуміти сильні сторони обох серверів.
Цей гайд допоможе зрозуміти, коли що використовувати — без маркетингової води та з конкретними прикладами з реальних проєктів.
Хто що використовує на практиці
За нашою статистикою, розподіл проєктів виглядає так:
Apache обирають для:
- Legacy-проєктів з великою кількістю індивідуальних правок у .htaccess
- Bitrix, старих версій Magento та інших систем, що критично залежать від .htaccess
- Shared-хостингу, де потрібна ізоляція користувачів
Nginx обирають для:
- Високонавантажених медіа-порталів
- API для мобільних додатків
- Сучасних SPA на React/Vue/Angular
- WordPress та WooCommerce
- eCommerce платформ (PrestaShop, сучасних Magento)
Архітектура: чому Nginx швидший
Різниця між Nginx та Apache — не в "якості коду" чи "сучасності". Різниця в архітектурному підході до обробки з'єднань. І ця різниця має практичні наслідки, які ви відчуєте під навантаженням.
Apache: один процес — одне з'єднання
Apache народився в епоху, коли сервер обслуговував десятки одночасних користувачів. Його класична модель (prefork) працює просто: для кожного з'єднання — окремий процес. Це надійно, легко дебажити, але жахливо масштабується.
Уявіть: 1000 одночасних з'єднань = 1000 процесів. Кожен процес з mod_php важить 50-100 МБ. Рахуємо: 50-100 ГБ RAM тільки на веб-сервер. При напливі трафіку (або DDoS) сервер падає, бо вичерпується ліміт MaxRequestWorkers.
Це не теоретична проблема — це топ-1 у списку проблем наших клієнтів з Apache: вичерпання ліміту MaxClients/MaxRequestWorkers. Сайт просто "лежить" при напливі ботів або раптовому збільшенні трафіку.
ℹ️ MPM Event: У 2026 році Apache має модуль MPM Event, який працює ефективніше — один потік може обслуговувати кілька keep-alive з'єднань. Це суттєво покращило ситуацію, але архітектурно Apache все ще поступається Nginx. MPM Event — це "латка" на старій архітектурі, а не нова архітектура.
Nginx: один процес — тисячі з'єднань
Nginx побудований на event-driven архітектурі. Один робочий процес обробляє тисячі з'єднань одночасно через неблокуючий I/O. Немає перемикання контексту між процесами, немає накладних витрат на створення нових потоків.
Результат: Nginx з 4 worker-процесами (по кількості ядер CPU) може обслуговувати стільки ж трафіку, скільки Apache з сотнями процесів — і споживати в 10 разів менше RAM.
Це пояснює, чому під раптовим навантаженням (DDoS або вірусний трафік) Apache падає значно швидше. Nginx зазвичай тримається — може віддавати 504 Gateway Timeout, якщо бекенд (PHP) не встигає, але сам веб-сервер продовжує працювати і приймати з'єднання.
| Параметр | Apache (prefork) | Apache (event) | Nginx |
|---|---|---|---|
| Модель обробки | Процес на з'єднання | Потік на з'єднання | Event-driven |
| RAM на 1000 з'єднань | ~50-100 ГБ | ~5-10 ГБ | ~50-100 МБ |
| Поведінка під DDoS | Падає швидко | Тримається краще | Стабільний |
| Статичний контент | Повільно | Середньо | Дуже швидко |
| Динамічна конфігурація (.htaccess) | Повна підтримка | Повна підтримка | Не підтримується |
Проблема C10k
У 2000-х роках виникла так звана "проблема C10k" — як обслуговувати 10 000 одночасних з'єднань. Apache з моделлю "процес на з'єднання" не міг це зробити ефективно. Nginx був створений саме для вирішення цієї проблеми.
У 2026 році Apache став кращим завдяки MPM Event, але він все ще споживає більше пам'яті на кожне нове з'єднання порівняно з Nginx. Якщо ваш проєкт очікує значні навантаження — Nginx залишається кращим вибором.
Реальна продуктивність: що показують тести
Синтетичні бенчмарки — це одне, а реальний продакшен — інше. Ось що ми бачимо на проєктах клієнтів.
WordPress: Nginx швидший на 15-30%
При однакових умовах (той самий сервер, та сама версія PHP-FPM) Nginx + PHP-FPM показує кращий TTFB (Time to First Byte) на 15-30%. При паралельних запитах різниця ще більша — Apache починає "захлинатись" раніше.
Для WooCommerce з великими каталогами критично налаштувати fastcgi_buffer_size, щоб великі сторінки товарів не створювали тимчасові файли на диску. Це може дати додаткові 10-20% до швидкості на сторінках з багатьма товарами.
Статичний контент: Nginx поза конкуренцією
Віддача картинок, CSS, JS — це те, для чого Nginx створений. Він робить це з мінімальним навантаженням на CPU завдяки sendfile() та нульовому копіюванню даних. Apache навіть з mod_cache програє.
Рекомендовані налаштування для статики в Nginx:
- Максимальний
expiresдля статичних файлів - Вимкнення логів для статики (зменшує I/O)
sendfile on— використання системного виклику sendfiletcp_nopush on— оптимізація TCP-пакетів
Під навантаженням: різниця критична
При раптовому напливі трафіку (DDoS, вірусний контент, Reddit hug of death) Apache падає швидше. Nginx зазвичай тримається — може віддавати 504 Gateway Timeout, якщо бекенд (PHP) не встигає, але сам веб-сервер продовжує працювати.
💡 Success Story: Медіа-ресурс переїхав з Apache на Nginx + FastCGI Cache. Результат: зменшення кількості серверів з 4 до 1 при тому ж навантаженні. Економія на інфраструктурі — понад $500/місяць. Кешування анонімних користувачів дозволило витримувати піки трафіку, які раніше "клали" всю інфраструктуру.
Типові проблеми продуктивності
Топ-3 проблеми Apache:
- Вичерпання ліміту MaxClients/MaxRequestWorkers (сайт "лежить" при напливі ботів)
- Перевитрата RAM через mod_php (кожен процес 50-100 МБ)
- Складні конфлікти в .htaccess, які важко дебажити
Топ-3 проблеми Nginx:
- Помилки конфігурації fastcgi_params (502 Bad Gateway)
- Проблеми з правами доступу до сокетів PHP-FPM
- Неправильне налаштування редіректів (циклічні редіректи)
Рекомендовані конфігурації Nginx
Теорія — це добре, але вам потрібні робочі конфіги. Ось що ми використовуємо на продакшені.
WordPress + FastCGI Cache
Ця конфігурація дозволяє витримувати тисячі запитів за секунду. Кешування анонімних користувачів — must-have для будь-якого WordPress-сайту. Залогінені користувачі та POST-запити автоматично проходять повз кеш.
# Визначаємо зону кешування в http блоці
fastcgi_cache_path /var/cache/nginx/wordpress
levels=1:2
keys_zone=WP_CACHE:100m
inactive=60m;
server {
listen 443 quic reuseport; # HTTP/3
listen 443 ssl;
server_name example.com;
# SSL налаштування
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.3;
# Оголошення HTTP/3
add_header Alt-Svc 'h3=":443"; ma=86400';
root /var/www/wordpress;
index index.php;
# Логіка визначення, що кешувати
set $skip_cache 0;
# POST запити не кешуємо
if ($request_method = POST) {
set $skip_cache 1;
}
# Запити з query string не кешуємо
if ($query_string != "") {
set $skip_cache 1;
}
# Залогінених користувачів не кешуємо
if ($http_cookie ~* "comment_author|wordpress_logged_in|wp-postpass") {
set $skip_cache 1;
}
# Статика з довгим кешуванням
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# Кешування
fastcgi_cache WP_CACHE;
fastcgi_cache_valid 200 301 302 1h;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
# Заголовок для дебагу (показує HIT/MISS)
add_header X-FastCGI-Cache $upstream_cache_status;
}
}
Reverse Proxy для Node.js / Python / Go
Ідеально для сучасних застосунків на NestJS, FastAPI, Django, Gin. Включає підтримку WebSockets та передачу реальних IP-адрес.
upstream backend {
server 127.0.0.1:3000;
server 127.0.0.1:3001 backup;
keepalive 32;
}
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
# WebSockets підтримка
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Передача реальних IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Таймаути
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Буферизація
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
}
# Health check endpoint
location /health {
proxy_pass http://backend;
access_log off;
}
}
Оптимізація для статики
# Глобальні налаштування в http блоці
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Gzip стиснення
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript
text/xml application/xml application/xml+rss text/javascript
image/svg+xml;
# Статика
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
log_not_found off;
}
Рекомендовані конфігурації Apache
Якщо вам потрібен Apache — використовуйте його правильно. Головне правило: тільки MPM Event + PHP-FPM. mod_php — це анахронізм, якому місце в 2010 році.
MPM Event — золотий стандарт 2026
MPM Event найбільш наближений до моделі Nginx і ефективно працює з keep-alive з'єднаннями. Ось оптимальна конфігурація:
# /etc/apache2/mods-enabled/mpm_event.conf
<IfModule mpm_event_module>
# Кількість процесів при старті
StartServers 3
# Мінімум вільних потоків
MinSpareThreads 25
# Максимум вільних потоків
MaxSpareThreads 75
# Максимум потоків на процес
ThreadLimit 64
ThreadsPerChild 25
# Максимум одночасних запитів
# Розраховуйте: RAM / ~50MB на worker
MaxRequestWorkers 400
# 0 = процеси не перезапускаються
MaxConnectionsPerChild 0
</IfModule>
⚠️ Важливо: Значення MaxRequestWorkers потрібно розраховувати під вашу RAM. Формула: (Доступна RAM - RAM для системи та бази) / ~50MB. Якщо поставити занадто багато — сервер почне свопити і все стане ще гірше.
Підключення PHP-FPM
Забудьте про mod_php. PHP-FPM дозволяє Apache-процесам залишатися легкими, бо PHP виконується в окремих процесах.
# Увімкнути необхідні модулі
# a2enmod proxy_fcgi setenvif
# a2enconf php8.3-fpm
<VirtualHost *:443>
ServerName example.com
DocumentRoot /var/www/html
# SSL
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# PHP через FPM
<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>
<Directory /var/www/html>
AllowOverride All
Require all granted
# Заборона виконання PHP в uploads
<Directory /var/www/html/wp-content/uploads>
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
</Directory>
</Directory>
# Стиснення
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css
AddOutputFilterByType DEFLATE application/javascript application/json
</IfModule>
# Кешування статики
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
</IfModule>
</VirtualHost>
Чому не mod_php?
mod_php вбудовує інтерпретатор PHP в кожен процес Apache. Це означає:
- Кожен процес важить 50-100 МБ замість 5-10 МБ
- Навіть коли Apache віддає картинку — процес все одно тримає PHP в пам'яті
- При 100 одночасних з'єднаннях — 5-10 ГБ RAM тільки на Apache
З PHP-FPM процеси Apache легкі, а PHP виконується окремо — тільки коли потрібно.
HTTP/2, HTTP/3 та QUIC
HTTP/2: стандарт за замовчуванням
У 2026 році HTTP/2 — це baseline. Без нього сучасний веб неможливий. Що дає HTTP/2:
- Мультиплексування — кілька запитів через одне з'єднання
- Стиснення заголовків — HPACK алгоритм зменшує overhead
- Server Push — сервер може проактивно відправити ресурси
- Пріоритизація — важливіші ресурси завантажуються першими
Обидва сервери підтримують HTTP/2, але Nginx робить це ефективніше завдяки своїй архітектурі.
HTTP/3 (QUIC): майбутнє, яке вже тут
HTTP/3 базується на протоколі QUIC (UDP замість TCP). У 2026 році це вже стабільна технологія, а не експеримент.
Переваги HTTP/3:
- Швидше встановлення з'єднання — 0-RTT можливий при повторних візитах
- Краща робота при втратах пакетів — немає head-of-line blocking
- Вбудоване шифрування — TLS 1.3 інтегрований в протокол
- Міграція з'єднань — при зміні мережі (WiFi → LTE) з'єднання не розривається
У Nginx HTTP/3 підтримується через модуль ngx_http_v3_module і вже готовий для продакшену.
⚠️ Підводний камінь: HTTP/3 вимагає відкритого UDP порту 443. Деякі корпоративні фаєрволи досі блокують UDP, тому обов'язково налаштуйте fallback на HTTP/2. Це робиться автоматично через заголовок Alt-Svc — браузер спочатку підключається по HTTP/2, отримує заголовок і пробує HTTP/3.
# Nginx з HTTP/3
server {
# HTTP/3 на QUIC
listen 443 quic reuseport;
# Fallback на HTTP/2
listen 443 ssl;
http2 on;
# Тільки TLS 1.3 для HTTP/3
ssl_protocols TLSv1.2 TLSv1.3;
# Оголошення підтримки HTTP/3
add_header Alt-Svc 'h3=":443"; ma=86400';
# ECDSA сертифікат (швидший за RSA)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
SSL/TLS рекомендації 2026
- TLS 1.3 — єдина рекомендована версія (TLS 1.2 для legacy)
- ECDSA сертифікати — швидші за RSA, використовуйте P-256
- OCSP Stapling — зменшує час handshake
- Session Tickets — для швидшого відновлення сесій
Безпека: типові вразливості та hardening
Типові помилки в конфігурації
Більшість зламів — не через вразливості в коді веб-сервера, а через неправильну конфігурацію. Ось що ми бачимо регулярно:
Apache:
Options +Indexes— дозволяє бачити список файлів у директорії. Атакуючий може знайти backup-файли, конфіги, тимчасові файли- Застарілі CGI-скрипти з відомими вразливостями
- Відкриті .env, .git, backup-файли (.sql, .bak)
- Застарілі модулі з CVE
Nginx:
- Неправильний
location ~ \.php$— може виконати PHP-код у завантаженому файлі (наприклад, image.php.jpg) - Відсутня заборона доступу до прихованих файлів (.git, .env)
- Відкрита версія сервера (server_tokens on) — полегшує пошук CVE
🚨 Реальний приклад: Злами через залишені .env файли — одна з найчастіших проблем. Файл .env містить паролі до бази, API-ключі, секрети. Якщо він доступний через веб — це повна компрометація.
Security Headers
Мінімальний набір заголовків безпеки для 2026 року:
# Nginx Security Headers
# Запобігає MIME-type sniffing
add_header X-Content-Type-Options "nosniff" always;
# Захист від clickjacking
add_header X-Frame-Options "SAMEORIGIN" always;
# HTTPS тільки (включіть після тестування!)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# XSS захист (для старих браузерів)
add_header X-XSS-Protection "1; mode=block" always;
# Referrer Policy
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Content Security Policy (налаштуйте під свій сайт!)
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;
ℹ️ CSP: Content-Security-Policy — найскладніший, але найважливіший заголовок. Він запобігає XSS-атакам, але потребує ретельного налаштування під конкретний сайт. Почніть з Content-Security-Policy-Report-Only для тестування.
Nginx Hardening
# Приховати версію сервера
server_tokens off;
# Заборона доступу до прихованих файлів
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# Заборона доступу до sensitive файлів
location ~* \.(env|git|sql|bak|old|backup|log|ini|conf)$ {
deny all;
}
# Обмеження HTTP методів
location / {
limit_except GET HEAD POST {
deny all;
}
}
# Захист від Slowloris
client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 65s;
send_timeout 10s;
# Обмеження розміру запитів
client_max_body_size 10m;
client_body_buffer_size 128k;
Rate Limiting
Для захисту від Layer 7 DDoS Nginx має вбудовані інструменти — і вони працюють набагато краще, ніж Apache mod_evasive.
# Визначення зон rate limiting
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
limit_req_zone $binary_remote_addr zone=api:10m rate=100r/s;
limit_conn_zone $binary_remote_addr zone=conn:10m;
# Застосування до login
location /wp-login.php {
limit_req zone=login burst=3 nodelay;
limit_conn conn 5;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
# Застосування до API
location /api/ {
limit_req zone=api burst=50 nodelay;
proxy_pass http://backend;
}
Apache: mod_evasive працює гірше — для серйозного захисту краще використовувати Cloudflare, Fail2Ban або iptables/ipset на базі аналізу логів.
Що обрати: Decision Matrix 2026
Замість абстрактних порад — конкретна таблиця вибору. Знайдіть свій сценарій:
| Сценарій | Рекомендація | Чому |
|---|---|---|
| Landing / SPA | Nginx | Швидка статика, мінімум CPU |
| WordPress | Nginx + FastCGI Cache | Кешування, +15-30% швидкості |
| Legacy: Bitrix, Magento | Apache MPM Event | Потрібен .htaccess |
| API-сервери | Nginx Reverse Proxy | SSL, буфери, WebSockets |
| High-load / DDoS | Nginx | Тримає тисячі з'єднань |
| Shared хостинг | CloudLinux + Apache | Ізоляція, .htaccess |
| Kubernetes | Nginx Ingress | Стандарт K8s |
| Local dev | Docker + Nginx | Як на продакшені |
| Мікросервіси | Nginx / Envoy | Mesh, балансування |
Коли Nginx перед Apache має сенс?
Якщо вам потрібен .htaccess для розробників, але хочеться захистити сервер від повільних з'єднань (Slowloris атак) — ставте Nginx як Reverse Proxy перед Apache. Nginx буферизує повільних клієнтів і передає Apache тільки готові запити.
Ця конфігурація також дозволяє:
- Кешувати статику на Nginx (швидше)
- SSL-термінацію на Nginx (менше навантаження на Apache)
- Rate limiting на Nginx (ефективніше)
- Залишити .htaccess для специфічних правил
🚨 Помилка "Double Caching": Якщо ставите Nginx перед Apache — не вмикайте кешування на обох рівнях. Це призводить до проблем з оновленням контенту та дебагом. Кешуйте тільки на Nginx.
Типові помилки: що ми бачимо у клієнтів
Ці помилки зустрічаються регулярно на консалтингу — не повторюйте їх:
- ❌ Помилка #1: Apache "за звичкою"
-
Що відбувається: Клієнт ставить Apache на новий проєкт просто тому, що "завжди так робив" або "так в туторіалі".
Проблема: Для сучасного SPA, API або WordPress без складних .htaccess правил Apache тільки заважає — споживає більше ресурсів без жодних переваг.
Рішення: Перед вибором веб-сервера запитайте себе: "Чи справді мені потрібен .htaccess?" Якщо ні — Nginx. Якщо не впевнені — теж Nginx, бо конвертувати nginx.conf в .htaccess легше, ніж навпаки.
- ❌ Помилка #2: mod_php замість PHP-FPM
-
Що відбувається: Apache з mod_php — кожен процес важить 50-100 МБ, навіть коли віддає статичну картинку.
Проблема: При 100 одночасних з'єднаннях — 5-10 ГБ RAM тільки на Apache. При 200 — вже 10-20 ГБ. Сервер швидко вичерпує пам'ять.
Рішення: Тільки PHP-FPM. Завжди. mod_php — анахронізм, якому місце в 2010 році. Налаштування займає 5 хвилин, економія ресурсів — в рази.
- ❌ Помилка #3: Вичерпання MaxRequestWorkers
-
Що відбувається: Сайт "лежить" при напливі трафіку, в логах — "server reached MaxRequestWorkers setting".
Проблема: Apache не може прийняти нові з'єднання, бо всі слоти зайняті. Навіть легітимні користувачі не можуть зайти на сайт.
Рішення:
- Перевірте, чи використовуєте MPM Event (не prefork)
- Перевірте, чи використовуєте PHP-FPM (не mod_php)
- Розрахуйте MaxRequestWorkers під вашу RAM
- Або поставте Nginx перед Apache як buffer
- Або мігруйте на Nginx повністю
- ❌ Помилка #4: 502 Bad Gateway в Nginx
-
Що відбувається: Nginx віддає 502, хоча PHP-FPM начебто запущений.
Причини:
- Неправильний шлях до сокета в fastcgi_pass
- Проблеми з правами на сокет (www-data vs nginx)
- PHP-FPM перевантажений або crashed
- Невірні fastcgi_params
Діагностика:
# Перевірити сокет ls -la /run/php/php8.3-fpm.sock # Перевірити статус PHP-FPM systemctl status php8.3-fpm # Перевірити логи Nginx tail -f /var/log/nginx/error.log # Перевірити логи PHP-FPM tail -f /var/log/php8.3-fpm.log
- ❌ Помилка #5: Циклічні редіректи
-
Що відбувається: Браузер показує "ERR_TOO_MANY_REDIRECTS".
Причина: Nginx редіректить HTTP→HTTPS, а за ним балансувальник або Cloudflare теж редіректить — утворюється нескінченний цикл.
Рішення: Перевіряйте заголовок X-Forwarded-Proto перед редіректом:
# Правильний редірект за балансувальником if ($http_x_forwarded_proto = "http") { return 301 https://$server_name$request_uri; } # АБО використовуйте map map $http_x_forwarded_proto $redirect_https { default 0; http 1; } server { if ($redirect_https) { return 301 https://$server_name$request_uri; } }
- ❌ Помилка #6: Double Caching
-
Що відбувається: Nginx перед Apache, кешування увімкнене на обох рівнях.
Проблема: Контент кешується двічі, важко зрозуміти що звідки береться, проблеми з invalidation, дебаг перетворюється на жах.
Рішення: Кешуйте тільки на одному рівні — краще на Nginx (він ефективніший). На Apache вимкніть mod_cache повністю.
Моніторинг та діагностика
Налаштований веб-сервер — це половина справи. Потрібно ще бачити, що з ним відбувається.
- ➤ Ключові метрики Nginx
-
Що моніторити в першу чергу:
- Active connections — скільки з'єднань зараз активні
- Requests per second (RPS) — навантаження на сервер
- Коди відповідей — особливо 4xx та 5xx
- Request time — скільки часу обробляється запит
- Upstream response time — скільки чекаємо відповіді від бекенду
Рекомендуємо nginx-vts-exporter + Grafana — це дає детальну статистику по кожному віртуальному хосту.
- ➤ JSON-формат логів
-
Рекомендуємо JSON-формат для логів. Це дозволяє миттєво індексувати їх у ELK (Elasticsearch, Logstash, Kibana) або Grafana Loki.
# Nginx JSON log format log_format json_combined escape=json '{' '"time_local":"$time_local",' '"remote_addr":"$remote_addr",' '"request":"$request",' '"status":$status,' '"body_bytes_sent":$body_bytes_sent,' '"request_time":$request_time,' '"upstream_response_time":"$upstream_response_time",' '"http_referer":"$http_referer",' '"http_user_agent":"$http_user_agent"' '}'; access_log /var/log/nginx/access.json json_combined;
- ➤ GoAccess — швидкий аналіз логів
-
Для швидкого аналізу в консолі рекомендуємо GoAccess — він малює звіти прямо в терміналі в реальному часі:
# Встановлення apt install goaccess # Реальний час у терміналі goaccess /var/log/nginx/access.log -c # HTML звіт goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED
- ➤ Health Checks
-
Для load balancing та моніторингу потрібні health check endpoints. У Nginx Open Source — тільки через сторонні модулі або скрипти, у Nginx Plus — нативно.
Найпростіший варіант — моніторити код відповіді 200 на сторінці /health:
# Backend повинен віддавати 200 OK на /health location /health { access_log off; return 200 "healthy\n"; add_header Content-Type text/plain; }
Контейнери та Kubernetes
У 2026 році контейнеризація — це стандарт для production. Ось best practices для веб-серверів у контейнерах.
- ➤ Docker best practices
-
Основні правила для контейнеризації веб-серверів:
- Один процес на контейнер — Nginx окремо, PHP-FPM окремо
- Alpine образи — nginx:alpine важить ~20MB замість ~140MB
- Логи в stdout/stderr — не пишіть в файли, Docker сам збере
- Non-root user — запускайте Nginx від непривілейованого користувача
# Dockerfile для Nginx FROM nginx:alpine # Копіюємо конфіг COPY nginx.conf /etc/nginx/nginx.conf COPY conf.d/ /etc/nginx/conf.d/ # Non-root user RUN chown -R nginx:nginx /var/cache/nginx USER nginx EXPOSE 80 443 CMD ["nginx", "-g", "daemon off;"]
- ➤ Kubernetes Ingress Controller
-
Nginx Ingress Controller — це стандарт де-факто у світі K8s. Він забезпечує:
- SSL-термінацію
- Load balancing між pods
- Path-based та host-based routing
- Rate limiting
- Custom error pages
# Приклад Ingress resource apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app-ingress annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" nginx.ingress.kubernetes.io/limit-rps: "100" spec: ingressClassName: nginx tls: - hosts: - example.com secretName: example-tls rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: my-app port: number: 80
🚀 Потужні сервери для вашого проєкту
Hostiserver пропонує VPS та Dedicated сервери з попередньо налаштованим Nginx або Apache — залежно від ваших потреб.
🖥️ Що ви отримуєте:
- Оптимізована конфігурація веб-сервера
- PHP 8.3 + PHP-FPM з тюнінгом
- Безкоштовні SSL-сертифікати (Let's Encrypt)
- HTTP/3 підтримка
- Налаштування під ваш проєкт
- 24/7 технічна підтримка
💬 Не впевнені, що обрати?
💬 Напишіть нам — допоможемо з конфігурацією!
Часті запитання
- Чи можна використовувати Nginx і Apache разом?
-
Так, це популярна конфігурація. Nginx працює як Reverse Proxy (приймає з'єднання, віддає статику, буферизує повільних клієнтів), а Apache обробляє динамічний контент через .htaccess.
Це має сенс, якщо ваш проєкт критично залежить від .htaccess (наприклад, Bitrix), але ви хочете захиститись від Slowloris та оптимізувати віддачу статики.
Важливо: не вмикайте кешування на обох рівнях — кешуйте тільки на Nginx.
- Який веб-сервер краще для WordPress?
-
Nginx + PHP-FPM + FastCGI Cache — однозначно. Швидше на 15-30% у тестах, стабільніше під навантаженням.
Apache має сенс тільки якщо ви використовуєте плагіни, які критично залежать від .htaccess (деякі плагіни безпеки, специфічні редіректи). Але таких випадків стає все менше — більшість плагінів адаптувались до Nginx.
Для WooCommerce з великими каталогами Nginx обов'язковий — налаштуйте fastcgi_buffer_size для великих сторінок товарів.
- Як мігрувати з Apache на Nginx?
-
Основний біль — переписування правил .htaccess у формат Nginx. Автоматичні конвертери працюють погано, більшість правил доводиться переписувати вручну.
План міграції:
- Зберіть всі .htaccess файли з проєкту
- Проаналізуйте правила (RewriteRule, RedirectMatch, etc.)
- Напишіть еквівалентні правила для nginx.conf
- Розгорніть staging-сервер з Nginx
- Протестуйте всі URL, редіректи, форми
- Перевірте SEO-редіректи (301) окремо
- Переключіть DNS або балансувальник
Типовий час: від кількох годин (простий сайт) до кількох днів (складний проєкт з багатьма .htaccess правилами).
- Що таке HTTP/3 і чи потрібен він?
-
HTTP/3 — це нова версія протоколу HTTP на базі QUIC (UDP замість TCP). У 2026 році це вже стабільна технологія.
Переваги:
- Швидше встановлення з'єднання (0-RTT)
- Краща робота при втратах пакетів
- Міграція з'єднань при зміні мережі
Коли потрібен: Якщо ваша аудиторія — мобільні користувачі або люди з нестабільним інтернетом (поганий WiFi, LTE з перервами) — HTTP/3 дасть помітне покращення.
Нюанс: Потрібен відкритий UDP порт 443. Деякі корпоративні мережі блокують UDP — завжди налаштовуйте fallback на HTTP/2.
- Чому мій Apache падає під навантаженням?
-
Найімовірніша причина — вичерпання ліміту MaxRequestWorkers. Коли всі слоти зайняті, Apache не може прийняти нові з'єднання.
Що перевірити:
# Шукаємо в логах grep "MaxRequestWorkers" /var/log/apache2/error.log # Поточне навантаження apachectl status # Споживання RAM ps aux | grep apache | awk '{sum+=$6} END {print sum/1024 " MB"}' # Кількість процесів ps aux | grep apache | wc -lРішення:
- Перейдіть на MPM Event + PHP-FPM (якщо ще не)
- Розрахуйте MaxRequestWorkers під вашу RAM
- Поставте Nginx перед Apache як buffer
- Або мігруйте на Nginx повністю
- Як налаштувати моніторинг веб-сервера?
-
Мінімальний набір метрик:
- Active connections
- Requests per second (RPS)
- Коди відповідей (4xx, 5xx)
- Response time / Upstream time
- CPU та RAM використання
Рекомендовані інструменти:
- nginx-vts-exporter + Grafana — детальна статистика по хостах
- GoAccess — швидкий аналіз логів у терміналі
- ELK Stack / Grafana Loki — централізоване логування
- Prometheus + Node Exporter — системні метрики
Рекомендуємо JSON-формат для логів — це дозволяє миттєво індексувати їх без парсингу.
- Яка автоматизація потрібна для SSL-сертифікатів?
-
У 2026 році стандарт — Certbot (Let's Encrypt) з автоматичним оновленням та перезавантаженням конфігів.
# Встановлення apt install certbot python3-certbot-nginx # Отримання сертифіката для Nginx certbot --nginx -d example.com -d www.example.com # Автоматичне оновлення (cron job додається автоматично) certbot renew --dry-runCertbot автоматично оновлює сертифікати за 30 днів до закінчення та перезавантажує Nginx/Apache.