Community
94
HostiServer
2026-01-23 13:35:00

Nginx vs Apache у 2026: порівняння, конфігурації, вибір

⏱️ Час читання: ~14 хвилин | 📅 Опубліковано: 23 січня 2026

Nginx vs Apache у 2026: яка різниця насправді?

Якщо ви читаєте черговий "Nginx vs Apache" і чекаєте на однозначну відповідь — її не буде. Але буде дещо корисніше: реальні дані з продакшену, конкретні конфіги та чіткі критерії вибору.

Почнемо з факту: 70% клієнтів Hostiserver використовують Nginx (включаючи конфігурації з Nginx як Reverse Proxy). Чистий Apache зустрічається переважно на legacy-проєктах та специфічному Shared-хостингу. Тренд останніх років однозначний — Nginx + PHP-FPM витісняє Apache навіть там, де він колись був стандартом.

Але це не означає, що Apache мертвий. У деяких сценаріях він досі незамінний — особливо там, де потрібна динамічна конфігурація через .htaccess або специфічні модулі. Саме тому важливо розуміти сильні сторони обох серверів.

Цей гайд допоможе зрозуміти, коли що використовувати — без маркетингової води та з конкретними прикладами з реальних проєктів.

Візуалізація архітектури: важкі процеси Apache проти швидкої event-driven моделі Nginx

Хто що використовує на практиці

За нашою статистикою, розподіл проєктів виглядає так:

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 — використання системного виклику sendfile
  • tcp_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:

  1. Вичерпання ліміту MaxClients/MaxRequestWorkers (сайт "лежить" при напливі ботів)
  2. Перевитрата RAM через mod_php (кожен процес 50-100 МБ)
  3. Складні конфлікти в .htaccess, які важко дебажити

Топ-3 проблеми Nginx:

  1. Помилки конфігурації fastcgi_params (502 Bad Gateway)
  2. Проблеми з правами доступу до сокетів PHP-FPM
  3. Неправильне налаштування редіректів (циклічні редіректи)

Рекомендовані конфігурації 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 порівняно з HTTP/2

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 не може прийняти нові з'єднання, бо всі слоти зайняті. Навіть легітимні користувачі не можуть зайти на сайт.

Рішення:

  1. Перевірте, чи використовуєте MPM Event (не prefork)
  2. Перевірте, чи використовуєте PHP-FPM (не mod_php)
  3. Розрахуйте MaxRequestWorkers під вашу RAM
  4. Або поставте Nginx перед Apache як buffer
  5. Або мігруйте на 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. Автоматичні конвертери працюють погано, більшість правил доводиться переписувати вручну.

План міграції:

  1. Зберіть всі .htaccess файли з проєкту
  2. Проаналізуйте правила (RewriteRule, RedirectMatch, etc.)
  3. Напишіть еквівалентні правила для nginx.conf
  4. Розгорніть staging-сервер з Nginx
  5. Протестуйте всі URL, редіректи, форми
  6. Перевірте SEO-редіректи (301) окремо
  7. Переключіть 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

Рішення:

  1. Перейдіть на MPM Event + PHP-FPM (якщо ще не)
  2. Розрахуйте MaxRequestWorkers під вашу RAM
  3. Поставте Nginx перед Apache як buffer
  4. Або мігруйте на 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-run

Certbot автоматично оновлює сертифікати за 30 днів до закінчення та перезавантажує Nginx/Apache.

Contents

Поділіться цією статтею

VPS з підтримкою від

$19 95 / міс

Виділені сервери від

$80 / міс

CDN починаючи від

$0 / міс

 

Користуючись цим сайтом, ви погоджуєтеся на використання файлів cookies відповідно до нашої Політики Конфіденційності.