File Descriptors | Linux | NGINX
- File Descriptors | Linux | NGINX
🔥 Erro: Too many open files while connecting to upstream no Nginx
📌 Visão geral
Esse erro ocorre quando o Nginx atinge o limite de arquivos abertos (file descriptors, ou FDs) permitidos pelo sistema operacional. Esse limite não se refere apenas a arquivos de disco, mas também a conexões de rede, sockets TCP, pipes, arquivos de log, etc.
Mensagem de erro típica nos logs do Nginx:
[crit] 852346#852346: accept4() failed (24: Too many open files)
ou:
[error] ... while connecting to upstream, client: x.x.x.x, server: ..., upstream: "http://127.0.0.1:7070", host: ...
🧠 O que está acontecendo?
🔥 Interpretação
O erro indica que:
- O Nginx está tentando aceitar uma nova conexão de entrada ou criar uma nova conexão com um servidor upstream (por exemplo,
127.0.0.1:7070); - Porém, o limite de arquivos abertos para o processo foi atingido (erro 24 =
EMFILE); - O sistema operacional não permite mais abertura de arquivos/sockets naquele processo;
- Como consequência, o Nginx não consegue se comunicar com o backend, e retorna erro ao cliente.
⚙️ Arquitetura envolvida
🎯 Linux
- Cada processo tem um limite máximo de arquivos abertos, definido por
ulimit -n,/etc/security/limits.conf, ousystemd. - File descriptors incluem:
- Conexões com clientes (TCP sockets)
- Conexões com upstreams (outros servidores ou serviços)
- Arquivos de log (
access.log,error.log) - Arquivos de configuração abertos
- Pipes internos
🧩 Nginx
- O Nginx é event-driven, com múltiplos workers, cada um podendo aceitar e lidar com milhares de conexões.
- Cada worker process precisa de FDs para:
- Cada socket aceito
- Cada proxy_pass aberto para upstream
- Cada log
- O número total de FDs que ele pode usar depende de:
ulimitworker_rlimit_nofileworker_connections
🔧 O que é worker_rlimit_nofile
worker_rlimit_nofile 65535;
📘 Definição
É uma diretiva global do Nginx que ajusta o limite de file descriptors que cada processo worker pode abrir. Funciona como um "pedido" ao sistema operacional, e precisa que o sistema permita isso (via ulimit ou systemd).
Sem essa diretiva, mesmo com o
ulimitalto, o Nginx pode continuar limitado.
📌 Local correto
# Fora de todos os blocos
worker_processes auto;
worker_rlimit_nofile 65535; # ✅ Aqui!
events {
worker_connections 8192;
}
📐 Relação com worker_connections
worker_connections: define quantas conexões por worker o Nginx pode lidar.worker_rlimit_nofile: define quantos FDs (arquivos/sockets) por worker podem ser usados.
🔢 Recomendação:
worker_rlimit_nofile ≥ worker_connections × worker_processes
🛠 Como aplicar corretamente
1. Aumentar limites no sistema
/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
Para serviços systemd
sudo systemctl edit nginx
[Service]
LimitNOFILE=65535
sudo systemctl daemon-reexec
sudo systemctl restart nginx
2. Ajustar o nginx.conf
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 8192;
}
3. Validar e reiniciar
sudo nginx -t
sudo systemctl restart nginx
🔍 Monitoramento e verificação
🔎 Ver número de FDs usados:
lsof -u nginx | wc -l
🔎 Ver limite real do processo:
cat /proc/$(pidof nginx | awk '{print $1}')/limits
✅ Conclusão
| Problema | Solução |
|---|---|
Too many open files | Aumentar ulimit, worker_rlimit_nofile e systemd |
| Nginx não consegue se conectar ao upstream | Verificar se backend está disponível e escalável |
| Processos ficam sem FDs | Monitorar com lsof, ajustar limites de forma coerente |
✅ O
worker_rlimit_nofileé essencial para liberar o real potencial de paralelismo do Nginx, evitando travamentos em cenários de carga alta.