Come appare il messaggio
2026/10/29 14:02:11 [alert] 1234#1234: *98765 768 worker_connections are not enough while connecting to upstream, client: 203.0.113.5, server: example.com, request: "GET /api/ HTTP/2.0", upstream: "http://127.0.0.1:8080/api/"Cause frequenti
worker_connectionsnel bloccoeventsè ancora il valore basso delnginx.confdel pacchetto e il traffico lo ha superato.- Un upstream lento tiene le connessioni aperte a lungo e si accumulano (vedi anche le pagine su 504 e 502).
- Connessioni di lunga durata come WebSocket, SSE o long polling occupano uno slot per tutta la loro vita.
- Il limite in nginx è più alto di quello che permette il sistema: il limite di file aperti del processo nginx è troppo basso e il valore non è utilizzabile.
- Un'ondata di richieste da bot o da un client difettoso.
Verifica
- Impostazioni attuali dei worker
nginx -T 2>/dev/null | grep -nE 'worker_(processes|connections|rlimit_nofile)' - Quante volte compare l'alert?
grep -c 'worker_connections are not enough' /var/log/nginx/error.log - Limite di file aperti del processo master in esecuzione
grep 'open files' /proc/$(cat /run/nginx.pid)/limits - Riepilogo dei socket (stabiliti e in attesa)
ss -s
Soluzione
- Alza il limite in
/etc/nginx/nginx.conf:events { worker_connections 4096; }e mantieniworker_processes auto;. - Consenti abbastanza file descriptor:
worker_rlimit_nofile 8192;nel contesto principale, almeno il doppio diworker_connectionsquando fai da proxy. - Se è systemd a limitare il servizio, crea un drop-in con
systemctl edit nginxe impostaLimitNOFILE=a un valore coerente. - Riduci il carico in sé: correggi l'upstream lento, attiva
keepaliveverso l'upstream e frena i client abusivi conlimit_req. - Applica:
nginx -t && systemctl restart nginx(un reload non cambia il limite di processo impostato da systemd).
Domande frequenti
Quanti client può servire al massimo nginx?
Circa worker_processes × worker_connections, diviso per due se nginx fa da proxy, perché ogni richiesta inoltrata usa una connessione client e una upstream.
Un valore più alto è sempre meglio?
No. Ogni connessione costa memoria e un file descriptor. Alza con moderazione, allinea il limite dei descriptor e risolvi la causa se le connessioni si accumulano per colpa di un backend lento.