Настройка nginx: повний посібник з конфігурації веб-сервера

Правильна настройка nginx перетворює звичайний сервер на надійний інструмент, здатний витримувати тисячі одночасних з’єднань без надмірного споживання ресурсів. Конфігураційні файли визначають, як обробляються запити, куди передається трафік і які механізми безпеки застосовуються.

Основна структура будується навколо блоків http, server і location, а сучасні версії (станом на 2026 рік) підтримують HTTP/2, TLS 1.3 і гнучке балансування навантаження. Грамотна настройка nginx дозволяє одночасно обслуговувати статичний контент, працювати як reverse proxy і забезпечувати високу продуктивність навіть на обмеженому обладнанні.

У цій статті розкрито механізми обробки запитів, практичні кроки конфігурації, типові помилки та способи діагностики, щоб як початківець, так і досвідчений адміністратор міг побудувати стабільну систему.

Як nginx обробляє запити всередині

Nginx працює за подієво-орієнтованою моделлю. Головний процес (master) читає конфігурацію, створює worker-процеси і передає їм сокети. Кожен worker використовує механізм epoll (на Linux) або kqueue (на FreeBSD) і може одночасно тримати тисячі відкритих з’єднань, не створюючи окремий потік на кожне.

Коли приходить запит, nginx спочатку вибирає відповідний server-блок за IP, портом і значенням server_name. Далі відбувається пошук location за пріоритетом: точне співпадіння (=), префікс з найдовшим шляхом, регулярні вирази (~ і ~*). Після вибору location виконується або віддача файлу з диска, або proxy_pass, або fastcgi_pass.

Ця схема пояснює, чому неправильний порядок location-блоків часто призводить до неочікуваної поведінки. Worker-процеси не діляться станом між собою, тому всі змінні та ліміти задаються на рівні конфігурації або shared memory zones.

Структура конфігураційних файлів і базові директиви

Головний файл зазвичай розташований у /etc/nginx/nginx.conf. Він містить глобальні параметри (user, worker_processes, error_log), блок events і блок http. Всередині http підключаються додаткові файли через include /etc/nginx/conf.d/*.conf або /etc/nginx/sites-enabled/*.

Ключові директиви:

  • worker_processes auto; — автоматично підлаштовується під кількість ядер CPU.
  • worker_connections 4096; — максимальна кількість з’єднань на один worker.
  • worker_rlimit_nofile 65535; — піднімає ліміт відкритих файлів, щоб уникнути помилок «too many open files».
  • server_tokens off; — приховує версію сервера в заголовках і сторінках помилок.

Після будь-якої зміни обов’язково виконується перевірка синтаксису командою nginx -t. Якщо тест пройшов успішно, застосовується reload: systemctl reload nginx або nginx -s reload. Це дозволяє оновити конфігурацію без розриву активних з’єднань.

Покрокова настройка для статичного сайту

Для простого сайту створюється окремий файл у /etc/nginx/sites-available/example.com і символічне посилання в sites-enabled.

Мінімальна робоча конфігурація виглядає так:

server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm;

location / {
try_files uriuri/ =404;
}

location ~ /. {
deny all;
access_log off;
log_not_found off;
}
}

Після створення каталогу з файлами сайту, встановлення правильних прав (зазвичай www-data:www-data) і перевірки конфігурації сайт стає доступним. Для початківців цього достатньо, щоб швидко вивести сторінку в інтернет. Досвідчені користувачі одразу додають окремі access_log і error_log для зручності аналізу.

Настройка reverse proxy і upstream

Коли додаток працює на внутрішньому порту (наприклад, Node.js на 3000 або PHP-FPM на 9000), nginx виступає як reverse proxy. Upstream-блок дозволяє описати кілька бекендів і правила балансування.

upstream backend {
least_conn;
server 127.0.0.1:3000 weight=3;
server 127.0.0.1:3001;
keepalive 32;
}

server {
listen 80;
server_name api.example.com;

location / {
proxy_pass http://backend;
proxy_http_version 1.1;
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_set_header Connection “”;
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
}
}

Параметр least_conn направляє новий запит на бекенд із найменшою кількістю активних з’єднань. Keepalive зменшує витрати на встановлення TCP-з’єднань між nginx і бекендом. Для PHP використовується fastcgi_pass і набір параметрів із snippets/fastcgi-php.conf.

У нашій практиці ми стикалися з випадком, коли відсутність proxy_set_header Host призводила до того, що додаток отримував неправильне ім’я хоста і генерував помилкові посилання.

HTTPS, сертифікати та базове посилення безпеки

Сучасна настройка nginx майже завжди включає TLS. Найпростіший шлях — certbot з плагіном nginx:

apt install certbot python3-certbot-nginx
certbot –nginx -d example.com -d www.example.com

Certbot автоматично додає listen 443 ssl, шляхи до сертифікатів і редирект з HTTP. Для ручної конфігурації важливо вказати:

  • ssl_protocols TLSv1.2 TLSv1.3;
  • ssl_ciphers з сучасними наборами (ECDHE + AES-GCM або CHACHA20);
  • ssl_session_cache shared:SSL:10m;
  • ssl_session_tickets off;

Додаткові заголовки безпеки розміщують у server-блоці:

add_header Strict-Transport-Security “max-age=63072000; includeSubDomains; preload” always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy “strict-origin-when-cross-origin” always;

Відключення server_tokens і правильні права на файли сертифікатів — обов’язкові кроки, які зменшують поверхню атаки вже на етапі базової настройки nginx.

Оптимізація продуктивності під сучасні навантаження

Станом на 2026 рік типові рекомендації для сервера з 4–8 ядрами виглядають так:

Параметр Рекомендоване значення Примітка
worker_processes auto Дорівнює кількості ядер
worker_connections 4096–8192 З урахуванням worker_rlimit_nofile
keepalive_timeout 65 Баланс між ресурсами і швидкістю
gzip on + gzip_types Стискає текст, CSS, JS, JSON
sendfile on Ефективна віддача статичних файлів

Дані базуються на офіційній документації nginx.org та практичних тестах спільноти.

Додатково вмикають open_file_cache, обмежують розмір тіла запиту (client_max_body_size) і використовують limit_req_zone для захисту від надмірної кількості запитів з однієї IP-адреси.

Поширені помилки при настройці nginx

  • Відсутність крапки з комою після директиви — nginx -t одразу показує «invalid parameter».
  • Неправильний порядок location — префікс без ^~ може перекриватися регулярним виразом, і запит йде не туди, куди очікували.
  • Використання uri замістьrequest_uri в rewrite або proxy — призводить до подвійного декодування і потенційних вразливостей.
  • Запуск worker-процесів від root — критична помилка безпеки; завжди user www-data; або nginx.
  • Відсутність try_files при статичній роздачі — nginx може намагатися виконати неіснуючі скрипти.
  • Ігнорування error_log — багато проблем видно лише там, а не в access_log.

Кожна з цих помилок легко перевіряється командою nginx -t і переглядом логів. Виправлення займає хвилини, але наслідки можуть бути серйозними.

Діагностика проблем: що робити, коли щось пішло не так

Перший крок завжди — nginx -t. Якщо синтаксис у порядку, дивляться systemctl status nginx і tail -f /var/log/nginx/error.log. Типові повідомлення «bind() to 0.0.0.0:80 failed» вказують на зайнятий порт, «permission denied» — на права доступу до файлів або каталогів.

Для аналізу трафіку зручно тимчасово підвищити рівень логування (error_log … debug;) і після збору даних повернути звичайний рівень. Команда ss -tlnp | grep nginx показує, які порти реально слухаються.

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

Чек-лист самоперевірки після настройки nginx

  1. nginx -t повертає «syntax is ok» і «test is successful».
  2. systemctl is-active nginx показує active.
  3. curl -I http://localhost повертає очікуваний код і заголовки.
  4. Сертифікати валідні (ssl_certificate і ssl_certificate_key вказані правильно).
  5. server_tokens off; присутній у конфігурації.
  6. Права на root-каталоги сайтів не дозволяють запис від користувача nginx.
  7. Ліміти rate і connection налаштовані для критичних location.
  8. Логи ротуються і не заповнюють диск.

Пройшовши цей список, можна бути впевненим, що базова настройка nginx виконана коректно.

Коли можна впоратися самому, а коли варто звернутися до фахівця

Базову установку, статичний сайт, reverse proxy для одного додатку і отримання Let’s Encrypt сертифіката більшість адміністраторів виконують самостійно за кілька годин. Складніші сценарії — георозподілене балансування, складні правила WAF, інтеграція з Kubernetes Ingress, налаштування mTLS між сервісами — уже вимагають досвіду і часу на тестування.

Якщо після кількох спроб error.log продовжує показувати незрозумілі повідомлення, або сайт під навантаженням починає віддавати 502/504, раціональніше залучити спеціаліста. Це економить години (а іноді й дні) і знижує ризик тривалого простою.

Питання, які найчастіше ставлять під час настройки nginx

Чому після reload сайт віддає стару сторінку?
Браузер або проміжний кеш. Додайте Cache-Control або виконайте curl з заголовком, що обходить кеш.

Як обмежити доступ лише з певних IP?
Використовуйте allow/deny всередині location або geo-модуль для складніших правил.

Чи потрібно завжди вмикати gzip?
Так для текстового контенту. Для вже стиснутих форматів (jpeg, mp4, zip) gzip_types не включають їх, щоб не витрачати CPU.

Що робити з великими файлами завантаження?
Підвищіть client_max_body_size і client_body_timeout, а також переконайтеся, що бекенд теж готовий приймати великий обсяг даних.

Як перевірити, що HTTP/2 працює?
curl -I –http2 https://example.com має показати HTTP/2 200.

Настройка nginx — це не одноразова дія, а процес, який супроводжує життєвий цикл будь-якого веб-проекту. Зрозуміла структура конфігурації, регулярна перевірка синтаксису і увага до логів дозволяють тримати сервер стабільним навіть при зростанні навантаження. Офіційна документація на nginx.org залишається найнадійнішим джерелом актуальних директив і прикладів.

Денис Романенко

Денис Романенко

Київський IT-інженер. Почав з OS/2 у кінці 90-х, сидів на os2.kiev.ua, портував софт. Пізніше перейшов на Linux. Зараз DevOps/SRE: Kubernetes, безпека, VPN, автоматизація. Блог samm.kiev.ua веде з 2026-го — без хайпу, тільки те, що сам перевірив руками. Пише рідко, але по суті. Живе в Києві. Багато кави, мало сну, термінал майже завжди відкритий.

Leave a Reply

Your email address will not be published. Required fields are marked *