Все, що вам потрібно знати про таймаути NGINX
09:41, 27.05.2024
NGINX - це популярний багатоцільовий сервер, який з'єднує частини зовнішньої/внутрішньої мережі, а також надає доступ до динамічних даних і файлів. У цій статті ми поговоримо саме про таймаути NGINX і про те, як правильно керувати ними, відключаючи і встановлюючи різні таймаути. Тайм-аути мають важливе значення, якщо говорити про конфігураційний аспект, оскільки вони визначають період, протягом якого сервер чекає на певну подію перед її завершенням. Вони є надзвичайно важливими і впливають на стабільність роботи серверів, а також на зупинку вичерпання ресурсів. Отже, якщо ця тема звучить цікаво, то ми поділимося всіма практичними рекомендаціями щодо таймаутів.
Принцип тайм-аутів NGINX
Ось декілька основних принципів роботи таймаутів NGINX:
- send_timeout - це максимальний проміжок часу, через який відповідь надсилається клієнту (за замовчуванням він дорівнює 60). Це має вирішальне значення для припинення затримок відповідей та управління повільними клієнтами.
- client_body_timeout - цей таймаут характеризує максимальний проміжок часу, необхідний для читання тіла запиту (за замовчуванням 60). Якщо цей запит не отримано, з'єднання закривається, що необхідно для роботи з великими об'ємами постів або файлів.
- keepalive_timeout - максимальний час перебування клієнтського з'єднання на сервері (перший параметр за замовчуванням дорівнює 75, другий - 60).
- client_header_timeout - максимальний проміжок часу, необхідний для зчитування заголовка запиту (за замовчуванням 60). Якщо заголовок не буде отримано протягом певного часу, з'єднання буде закрито. Цей варіант таймауту потрібен для запобігання часткових або повільних запитів.
- lingering_timeout - цей цикл (за замовчуванням 30) може повторюватися протягом максимального часу, якщо увімкнено lingering_close. Цей параметр задає максимальний проміжок часу, протягом якого можуть надійти нові дані від клієнта.
Низькорівневий таймаут TCP в NGINX
Якщо говорити про низький рівень, то директива listen має параметр keepalive і цей параметр потрібен для конфігурації TCP-сокета. Вмикаючи або вимикаючи його, ми використовуємо важливий механізм keepalive.
Ми також можемо використовувати список, розділений двокрапкою:
- keepintvl – sets TCP_KEEPINTVL
- keepidle – sets TCP_KEEPIDLE
- keepcnt – sets TCP_KEEPCNT
Ігноруючи будь-який з цих параметрів, ви залишаєте налаштування за замовчуванням.
proxy_* Тайм-аути в NGINX
Тут ми наведемо лише 3 найпоширеніші значення таймаутів для NGINX, і вони є наступними:
- proxy_send_timeout - максимальний проміжок часу, необхідний для відправки запиту (за замовчуванням 60)
- *_connect_timeout - максимальний проміжок часу, необхідний для з'єднання з сервером (як правило, менше 75, але за замовчуванням 60)
- *_read_timeout - максимальний інтервал часу для читання відповіді проксі-сервера (за замовчуванням 60)
fastcgi_* Тайм-аути в NGINX
Говорячи про налаштування FastCGI сервера, можна виділити декілька категорій, таких як:
- fastcgi_send_timeout - це характеристика максимального інтервалу часу для відправки запитів сервера FastCGI (за замовчуванням 60)
- *_connect_timeout - характеристика максимального часу з'єднання з сервером (як правило, не більше 75, за замовчуванням 60)
- *_read_timeout - максимальний час очікування відповіді від сервера (за замовчуванням 60)
Таймаути memcached_* в NGINX
З таймаутами memcached_* параметри досить схожі з тими прикладами, які ми вже розглядали в статті, тому вони наступні:
- memcached_send_timeout - характеризує максимальний часовий проміжок для відправки запиту сервера Memcached (60)
- *_connect_timeout - максимальний час очікування з'єднання з сервером (як правило, менше 75, за замовчуванням 60)
- *_read_timeout - максимальний час очікування відповіді сервера на читання (за замовчуванням 60)
Відключення загальних таймаутів NGINX
При загальному вивченні цієї теми, ви можете без особливих зусиль використовувати список налаштувань в сервері або http блоці для відключення загальних таймаутів, давайте розглянемо пару основних прикладів:
keepalive_timeout 1d
send_timeout 1d
client_body_timeout 1d
*_header_timeout 1d
proxy_send_timeout 1d
*_connect_timeout 1d
*_read_timeout 1d
fastcgi_read_timeout 1d
*_connect_timeout 1d
*_send_timeout 1d
memcached_read_timeout 1d
*_connect_timeout 1d
*_send_timeout 1d
Підсумок
Звичайно, в NGINX у вас є величезна варіативність альтернатив, за допомогою яких ви можете налаштувати різні таймаути. Однак, коли ви змінюєте критичні з них, це може суттєво вплинути на характеристики продуктивності. Сподіваємося, що ця стаття була корисною для вашого кейсу і ви отримали всю важливу інформацію про таймаути NGINX.