Блог компанії 3v-Hosting

Обов'язкові налаштування Nginx для WordPress

Адміністрування

12 хв.


WordPress довгий час сприймався як інструмент для швидкого запуску сайтів, адже достатньо було вибрати відповідну тему, встановити пару плагінів, активувати кешування і все, проект вже працює. Але в міру зростання відвідуваності стає очевидним, що справжня продуктивність визначається не PHP-кодом теми і навіть не налаштуваннями бази даних, а серверною конфігурацією. Саме веб-сервер, в нашому випадку Nginx, задає межу пропускної здатності проекту, оскільки саме він визначає маршрутизацію запитів, швидкість відповіді, ефективність кешування і стійкість до високих навантажень.

Якщо сайт отримує хоча б кілька тисяч відвідувань на добу, то будь-які непропрацьовані Nginx директиви починають проявлятися у вигляді помилок, затримок та іншої непередбачуваної поведінки. Правильно налаштований сервер, навпаки, дозволяє WordPress працювати стабільно, швидко і з великим запасом по продуктивності. У цій статті ми розглянемо повний набір конфігурацій, які перетворюють звичайний VPS сервер в готову платформу для серйозного WordPress-проекту.

 

 

 

 

Правильна конфігурація PHP-FPM

PHP-FPM - це ядро обробки динамічних запитів в WordPress. Від його налаштування залежить, наскільки швидко буде спрацьовувати бекенд сайту і яке навантаження ляже на CPU і RAM. Помилки в конфігурації PHP-FPM часто виглядають як «гальмування сайту», хоча сама PHP-логіка може працювати ідеально.

Основна проблема - це використання дефолтних параметрів пулу. Наприклад, конфігурація pm = dynamic з занадто низьким значенням pm.max_children створює ефект, коли сервер виглядає «напівпорожнім», а WordPress обслуговує чергу запитів. Правильне налаштування процесів дозволяє рівномірно розподілити навантаження і запобігти зависанню під піковими навантаженнями.

 

Рекомендовані значення PHP-FPM для VPS

Щоб вам було простіше підібрати необхідні саме вам параметри, нижче ми наводимо просту орієнтовну таблицю.

 

Таблиця - підбір параметрів PHP-FPM

RAM pm.max_children pm.start_servers pm.min_spare_servers pm.max_spare_servers
1 ГБ 3-4 1 1 2
2 ГБ 6-8 2 2 4
4 ГБ 10-15 3 3 6

 

 

Моніторинг PHP-FPM

Якщо все-таки ви поставили собі за мету визначити точні значення, тоді необхідно спостерігати за процесами. Для цього ви можете скористатися цією командою:

ps aux | grep php-fpm journalctl -u php8.2-fpm top -Hp $(pidof php-fpm)

 

 

Висновки зробити досить просто: якщо процеси досягають максимуму - збільшуємо ліміти, а якщо закінчується оперативна пам'ять - тоді зменшуємо.

 

Сокети проти TCP

Для роботи з Nginx краще використовувати Unix-сокет:

fastcgi_pass unix:/run/php/php8.2-fpm.sock;

 

 

Він працює швидше і стабільніше TCP-з'єднань, особливо на слабких VPS. Таке поліпшення дає відчутний приріст продуктивності і знижує затримки між Nginx і PHP-FPM.

 

 

 

 

Маршрутизація в WordPress за допомогою конструкції try_files

WordPress у своїй роботі використовує фронт-контролер, де майже всі запити потрапляють в index.php. Це дозволяє гнучко керувати URL-структурою вашого сайту, ЧПУ - зрозумілими для людини урлами, кастомними пост-типами і REST API. Але така схема працює тільки в тому випадку, якщо директива try_files налаштована коректно.

Одного рядка достатньо, щоб або забезпечити стабільну роботу сайту, або повністю зламати його маршрутизацію. Помилки при описі try_files є причиною величезної кількості некоректних 404, непрацюючих плагінів і неправильних редиректів. Базова правильна конфігурація виглядає так:

try_files $uri $uri/ /index.php?$args; 

 

Часто недосвідчені адміністратори роблять помилки, які можуть призвести до безлічі неприємних наслідків. У таблиці нижче ми навели найчастіші з них і описали наслідки цих помилок.

 

Таблиця - помилки в конфігурації інструкції try_files

Помилка Наслідок
Відсутній параметр $args Ламається пагінація, а також пошук і фільтри WooCommerce
Змінений порядок аргументів Деякі сторінки починають віддаватися як статичні
Дублювання в кількох блоках location Різні плагіни можуть маршрутизувати запити по-різному
Проброс лише /index.php Частина URL працює без GET-параметрів і поводиться некоректно

 

Для перевірки коректності обробки URL ви можете використовувати таку команду:

curl -I https://site.com/test/ curl -I https://site.com/page/2/?filter=color

 

Якщо сервер видає 404 там, де не повинен - значить помилка в try_files.

 

 

 

 

Кешування статичних файлів

WordPress динамічно генерує тільки HTML-частину сторінки. Все інше, в тому числі зображення, таблиці стилів, шрифти і JavaScript - може і повинен віддавати саме Nginx, без участі PHP-FPM. Це істотно знижує навантаження на ваш сервер.

Правильно підібрані заголовки кешування дозволяють браузеру і CDN майже повністю виключити повторні запити статичних ресурсів. Ось простий приклад конфігурації кешування:

location ~* \.(jpg|jpeg|png|gif|svg|css|js|ico|woff2?)$ {

expires 30d;

add_header Cache-Control «public, no-transform»;

}

 

 

Таблиця - Залежність терміну кешування від типу файлу

Тип файлу Рекомендований строк кешування
CSS, JS 30–90 днів
WOFF2 180 днів
PNG/JPG/SVG 30–180 днів
Файли теми 7–30 днів (якщо оновлюється часто)

Наведені в цій таблиці терміни все-таки є орієнтовними, і ми рекомендуємо вам самостійно підбирати їх залежно від стилю управління контентом або від переважаючого типу розміщуваного контенту на вашому сайті. Грамотне кешування дозволяє зменшити частку запитів до PHP з 70% до 5-10% від загальної кількості запитів, що надходять на сервер.

 

 

 

 

 

Компресія за допомогою Gzip і Brotli

Компресія - це, мабуть, один з найбільш недооцінених інструментів оптимізації. Вона істотно зменшує обсяг пакета відповіді сервера і тим самим прискорює завантаження сайту. Більшість конфігурацій обмежуються використанням gzip, хоча Brotli в деяких випадках забезпечує краще стиснення і вже давно підтримується майже всіма браузерами.

Для сайтів, де особливо багато CSS і JS, Brotli здатний знизити вагу відповіді на 20-25% сильніше, ніж gzip.

 

Приклад блоку для gzip

gzip on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript application/xml;

 

Приклад блоку для Brotli

brotli on;

brotli_comp_level 5;

brotli_min_length 1024;

brotli_types text/plain text/css application/javascript application/json application/xml+rss application/xml application/font-woff application/font-woff2 image/svg+xml;

 

 

ВАЖЛИВО! Brotli не є панацеєю і є як мінімум кілька випадків, коли не варто його використовувати:

  • VPS з малою кількістю RAM, але з високою відвідуваністю;
  • Проекти з великою кількістю одночасних стиснень;
  • Сервери, де CPU - обмежуючий ресурс, тобто коли сервер виконує багато розрахунків за допомогою процесора.

 

 

 

 

 

Коректна обробка завантажень

WordPress дозволяє завантажувати великі зображення, PDF, архіви та інші важкі файли. Якщо налаштування Nginx не враховують цей факт, то користувачі можуть зіткнутися з помилками і неможливістю завантажити контент.

За замовчуванням Nginx дозволяє завантажувати тільки файли розміром до 1 МБ, що робить WordPress практично непрацездатним. Тому рекомендується відразу, за замовчуванням, збільшувати цей ліміт до 64 МБ:

client_max_body_size 64M;

 

Однак, при роботі з WooCommerce, імпортом CSV або відеоконтентом цей ліміт варто збільшувати до 100-200 МБ. Також при завантаженні великих файлів рекомендується відключати буферизацію, так як це знижує навантаження на диск під час завантаження великих файлів.:

proxy_request_buffering off;

 

 

 

 

 

 

 

Забезпечення безпеки та SEO-оптимізації

Сучасний інтернет вимагає обов'язкового використання HTTPS. У зв'язку з тим, що WordPress на даний момент є безперечним лідером серед CMS, він особливо вразливий для ботів, сканерів і перехоплення даних. Тому сервер повинен забезпечувати безпечне і коректне шифрування.

Неправильна конфігурація HTTPS може викликати редирект-петлі, проблеми з mixed content і зниження швидкості.

Почнемо з обов'язкового заголовка:

add_header Strict-Transport-Security «max-age=31536000» always;

 

Цей заголовок включає механізм HTTP Strict Transport Security (HSTS) - одну з ключових технологій, що підвищують безпеку сайту, який працює по HTTPS.

Також є кілька необов'язкових, але бажаних заголовків. Наприклад:

add_header X-Frame-Options «DENY» always;

add_header X-Content-Type-Options «nosniff» always;

add_header Referrer-Policy «strict-origin» always;

add_header X-XSS-Protection «1; mode=block» always;

add_header Permissions-Policy «geolocation=(), microphone=(), camera=()» always;

 

Що робить кожен з них:

Заголовок Призначення
X-Frame-Options DENY Повністю забороняє відкривати сайт у iframe, забезпечуючи надійний захист від clickjacking
X-Content-Type-Options nosniff Запобігає MIME-sniffing та завантаженню потенційно небезпечних файлів
Referrer-Policy strict-origin Передає лише домен, а не повний URL під час переходів, що підвищує приватність
X-XSS-Protection Вмикає вбудовану фільтрацію XSS у старих браузерах
Permissions-Policy Явно забороняє непотрібні API, такі як геолокація, мікрофон, камера тощо

 

Мінімальна SSL-конфігурація для сайтів

Мінімальна SSL-конфігурація - це набір налаштувань, який не намагається «вичавити максимум балів у тестах», але дає адекватний баланс між безпекою, сумісністю та простотою підтримки. Для більшості проектів на WordPress достатньо включити сучасні протоколи, безпечні шифри і регулярно оновлювати сертифікати, щоб бути спокійним за безпеку свого проекту. Нижче ми наведемо базову конфігурацію SSL в Nginx, а також дамо розгорнутий опис того, що робить кожен з параметрів і як вписати це в робочу конфігурацію вашого веб-сервера.

Отже, базовий блок в server (для 443 порту) може виглядати приблизно так:

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

 

ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    # Решта конфігурації сайту...
}

 

Давайте розберемо ключові параметри детальніше:

ssl_protocols TLSv1.2 TLSv1.3;

Ця директива задає, які версії TLS дозволені для підключення до сайту.

  • Відключаються застарілі і небезпечні протоколи TLS 1.0 і 1.1;
  • Залишаються тільки TLS 1.2 і TLS 1.3, які на даний момент вважаються стандартом де-факто;
  • Це підвищує безпеку і зазвичай не порушує сумісність, тому що переважна більшість актуальних клієнтів і браузерів підтримують ці версії.

Якщо сайт орієнтований на дуже старі пристрої, такі як старі Android або старі вбудовані браузери, то доведеться оцінювати статистику і вже від неї танцювати, але для сучасних проектів зв'язка 1.2 + 1.3 - це цілком розумний мінімум.

 

ssl_ciphers HIGH:!aNULL:!MD5;

Ця директива відповідає за набір шифрів (cipher suites), які сервер дозволяє використовувати.

  • HIGH- включає тільки сильні шифри;
  • !aNULL- забороняє шифри без аутентифікації (anonymous key exchange), які вразливі і не дають гарантій автентичності;
  • !MD5 - виключає шифри, що використовують MD5, оскільки MD5 вважається криптографічно небезпечним.

Фактично, цей рядок фільтрує список можливих шифрів до набору, який забезпечує нормальну безпеку без екзотичних і слабких комбінацій.

 

ssl_prefer_server_ciphers on;

За замовчуванням клієнт (браузер) може намагатися нав'язати серверу шифр зі списку підтримуваних. Увімкнення цієї опції прямо говорить Nginx:

  • «Використовуй пріоритет сервера, а не клієнта»;
  • Сервер сам вибере найкращий (на його думку) шифр з перетину підтримуваних списків;
  • Це дозволяє гарантовано виключати слабкі шифри, навіть якщо клієнт їх підтримує і намагається запропонувати.

У підсумку саме сервер контролює безпеку, а не покладається на можливі дивацтва на стороні клієнта.

 

 

 

Оптимізація для REST API і XML-RPC

Сучасні WordPress-сайти все частіше покладаються на REST API. Через нього працюють інтернет-магазини на WooCommerce, інтеграції з зовнішніми сервісами, SPA-додатки на React/Vue і будь-які headless-архітектури. REST API обробляє динамічні запити, тому важливо, щоб Nginx направляв їх в WordPress коректно і не намагався інтерпретувати як звичайні файли. Якщо цього не робити, то API-маршрути можуть повертати код 404, працювати повільно або конфліктувати з іншими правилами маршрутизації.

Щоб Nginx гарантовано пропускав запити до REST API в WordPress-ядро, використовується окремий блок:

location /wp-json/ {
    try_files $uri /index.php?$args;
}

 

Ця конструкція примусово відправляє всі запити до API в index.php, забезпечуючи коректну обробку маршрутів, роботу WooCommerce і зовнішніх інтеграцій.

 

Тепер перейдемо до XML-RPC.

XML-RPC - це старий механізм віддаленого доступу до WordPress, який використовувався до появи REST API. Його сьогодні застосовують тільки окремі додатки (наприклад, мобільні додатки на WordPress), а також деякі старі інтеграції. Однак сам файл xmlrpc.php є однією з найбільш часто атакованих точок входу, коли через нього зловмисники відправляють тисячі запитів для перебору пароля.

Якщо проект не використовує XML-RPC, то безпечніше буде його відключити:

location = /xmlrpc.php { deny all; } 

 

Це знижує навантаження на сервер, зменшує ризик brute force-атак і робить систему безпечнішою, не впливаючи на функціональність більшості сучасних сайтів.

 

 

 

 

 

Захист від ботів, сканерів і піків навантаження

Навіть ідеальний WordPress може «лягти», якщо на нього за хвилину відправляють сотні запитів до wp-login.php або XML-RPC. Обмеження частоти запитів дозволяє пом'якшити такі атаки і запобігти перевантаженню PHP-FPM. За це в WordPress відповідають так звані ліміти або Rate limits. Ось приклад базового налаштування лімітів, який підійде для більшості проектів:

limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

limit_req zone=one burst=20 nodelay;

 

Таблиця - Рекомендації щодо лімітів

Тип сайту Рекомендований ліміт
Блог 10–15 r/s
Новинний сайт 20–30 r/s
E-commerce 30–50 r/s
Корпоративний сайт 10 r/s

 

Перевірити спрацьовування встановлених лімітів можна, переглянувши лог, командою:

grep «limiting requests» /var/log/nginx/error.log 

 

 

 

 

 

FastCGI-кешування

Вище ми вже торкнулися теми кешування статичних файлів. Але кешувати можна не тільки статику.

FastCGI cache - це один з найпотужніших інструментів прискорення WordPress на сьогоднішній день. Він дозволяє Nginx віддавати HTML-сторінки без звернення до PHP, що багаторазово знижує навантаження і збільшує швидкість відповіді сервера.

На відміну від плагінів кешування, FastCGI працює на рівні веб-сервера і набагато ефективніше при високій відвідуваності ресурсу.

Базовий приклад конфігурації FastCGI виглядає приблизно так:

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key «$scheme$request_method$host$request_uri»;
fastcgi_cache_use_stale error timeout invalid_header http_500 http_503;

 

ВАЖЛИВО! Використовувати FastCGI cache можна не з усіма компонентами, є винятки, обумовлені логікою роботи цих компонентів.

  • Авторизовані користувачі - Використання персоналізованих даних призводить до неможливості кешування;
  • WooCommerce Cart / Checkout - Динаміка змін Кошика також не дає можливості її закешувати;
  • Сторінки особистого кабінету - Так само як і в першому випадку, в особистому кабінеті можуть бути унікальні дані, які неможливо закешувати в рамках всього проекту.

 

 

 

 

Діагностика проблем в конфігурації Nginx

Навіть коректно налаштований сервер може зіткнутися з помилками в конфігурації, нестачею ресурсів або неправильними шляхами. Уміння швидко діагностувати проблему - це важлива частина експлуатації WordPress-проекту його адміністратором або власником. Тому нижче ми навели кілька команд, які істотно полегшують це завдання.

Перевірка конфігурації Nginx:

nginx -t

 

Перегляд помилок в лозі:

tail -f /var/log/nginx/error.log

 

Перевірка відповіді сервера:

curl -I https://site.com/

 

Просте навантажувальне тестування:

ab -n 1000 -c 50 https://site.com/

 

 

 

 

 

 

FAQ

 

Чому WordPress працює повільно, якщо завантаження CPU мінімальне?

Найчастіше PHP-FPM стикається з занадто малим значенням pm.max_children. У цьому випадку запити стають в чергу, і сайт гальмує, навіть якщо процесор «порожній». Збільште ліміт процесів і перевірте навантаження заново.

 

 

Як перевірити, чи працює FastCGI-кеш?

Подивіться заголовки відповіді:

curl -I https://site.com/

Якщо кеш налаштований правильно, з'явиться X-FastCGI-Cache: HIT або MISS.

Відсутність заголовка означає, що кеш не застосовується або не налаштований.

 

 

Чому Nginx не може підключитися до php-fpm.sock?

Зазвичай неправильно вказано шлях до сокету. Перевірте:

ls /run/php/

і порівняйте з директивою:

fastcgi_pass unix:/run/php/php8.2-fpm.sock;

 

 

Якщо шляхи збігаються, переконайтеся, що PHP-FPM запущений.

 

 

Чи потрібно вмикати gzip_static?

Так, якщо ваш проект генерує попередньо стиснуті .gz версії файлів (наприклад, збирачі фронтенду).

Якщо таких файлів немає, то параметр можна не вмикати, він нічого не змінює.

 

 

Як захистити wp-login.php без плагінів?

Найпростіший і найефективніший спосіб - це банально обмежити частоту запитів:

limit_req zone=one burst=5 nodelay; 

 

Або дозволити доступ тільки певним IP, якщо логін використовується рідко.

 

 

Чи потрібно відключати XML-RPC?

Якщо ви не використовуєте мобільний додаток WordPress або старі інтеграції, то так, краще відключити:

location = /xmlrpc.php { deny all; } 

 

Це знижує ризик brute force-атак і зменшує навантаження на сервер.

 

 

 

 

Висновки

Продуктивність WordPress - це не тільки плагіни та оптимізація теми. Основні складові швидкості, такі як обробка PHP, коректна маршрутизація, ефективне кешування, безпека і контроль навантаження - забезпечуються саме на рівні веб-сервера.

Дотримуючись описаних в цій статті налаштувань - ви можете перетворити звичайний недорогий VPS в надійну платформу, здатну витримувати серйозні проекти і високі навантаження. Такий сервер забезпечить стабільність, поліпшить SEO-метрики вашого проекту, а також знизить споживання ресурсів і підвищить загальну чуйність сайту. Для бізнесу це означає більш швидке завантаження сторінок, кращу конверсію і стійкість до сезонних і добових сплесків трафіку.

Для чого використовуються VPS-сервери?
Для чого використовуються VPS-сервери?

Повний огляд застосувань VPS: реальні приклади, інфраструктура для бізнесу, VPN, CI/CD та середовища розробки. Допомагає вибрати оптимальний сервер.

9 хв