keepalive_timeout în Nginx

Performanță și PHP Toate versiunile Nginx (keepalive_time: 1.19.10+; keepalive_requests implicit 1000 din 1.19.10)

Cât timp păstrează Nginx deschisă o conexiune inactivă cu clientul, ca următoarele cereri să nu mai deschidă una nouă.

Sintaxă
keepalive_timeout timp [timp_antet];
keepalive_requests număr;
keepalive_time timp;

Ce face keepalive_timeout

O pagină are zeci de fișiere (CSS, JavaScript, imagini). Cu conexiuni keep-alive, browserul le cere pe toate pe aceeași conexiune, fără să repete de fiecare dată conectarea TCP și negocierea TLS. keepalive_timeout spune cât așteaptă Nginx o cerere nouă înainte să închidă conexiunea.

Al doilea parametru, opțional, este trimis clientului în antetul Keep-Alive: timeout=.... keepalive_requests limitează câte cereri pot trece printr-o conexiune, iar keepalive_time cât poate trăi conexiunea în total. keepalive_timeout 0; oprește keep-alive.

Aceste directive privesc conexiunile cu clienții. Conexiunile păstrate deschise spre serverele din spate se configurează separat, cu keepalive în blocul upstream.

Parametri

Parametru Descriere
Context http, server, location.
Implicit keepalive_timeout 75s;, keepalive_requests 1000;, keepalive_time 1h;
timp_antet Valoarea trimisă în antetul Keep-Alive: timeout=.

Ce returnează

Nimic; afectează cât timp rămân deschise conexiunile.

Exemple

Exemplul 1: Valori uzuale pentru un site

30 de secunde ajung pentru încărcarea unei pagini și a resurselor ei, fără să țină inutil deschise mii de conexiuni.

http {
    keepalive_timeout 30s;
    keepalive_requests 1000;
}

Exemplul 2: Conexiuni păstrate deschise spre aplicația din spate

Pentru keepalive în upstream, proxy-ul trebuie să folosească HTTP/1.1 și să nu trimită Connection: close.

upstream aplicatie {
    server 127.0.0.1:8080;
    keepalive 32;
}

server {
    # ...
    location / {
        proxy_pass http://aplicatie;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

Greșeli frecvente

  • Setezi keepalive_timeout 600s;: mii de conexiuni inactive ocupă locuri din worker_connections.
  • Crezi că keepalive_timeout păstrează și conexiunile spre PHP-FPM sau spre aplicație. Pentru acelea folosește keepalive în upstream (și fastcgi_keep_conn on; pentru FastCGI).

Comenzi înrudite

  • worker_connections: Numărul maxim de conexiuni simultane pe care le poate deschide fiecare proces worker, inclusiv conexiunile spre serverele din spate.