TL: DR:PHP/Apache no docker está continuamente criando 'arquivos', /proc/*/fd/
eventualmente tornando o site inutilizável.
Estamos executando um aplicativo PHP no docker ( php:5.6-apache
). Implantamos essa pilha em produção há algumas semanas. Depois de alguns dias os clientes tiveram problemas para acessar o site, o que foi causado por erros 403 aleatórios em vários arquivos, como javascript, imagem,
etc.
[core:crit] [pid 17] (24)Too many open files: AH00529: /var/www/.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable and that '/var/www/' is executable
Então fui verificar quais arquivos foram abertos pelos processos do Apache. lsof -a -p 15
saída:
apache2 15 www-data 35 unknown /proc/15/fd/35 (readlink: Permission denied)
apache2 15 www-data 37 unknown /proc/15/fd/37 (readlink: Permission denied)
apache2 15 www-data 38 unknown /proc/15/fd/38 (readlink: Permission denied)
O número fd aumenta continuamente quando o site é acessado, até atingir o limite de arquivos abertos.
EDITAR:
O motivo (readlink: Permission denied)
foi umrecurso de segurança do docker, então todos esses identificadores são, na verdade, soquetes TCP abertos.
apache2 15 www-data 198u sock 0,8 0t0 794575 protocol: TCP
apache2 15 www-data 200u sock 0,8 0t0 795679 protocol: TCP
apache2 15 www-data 201u sock 0,8 0t0 795681 protocol: TCP
No entanto, o netstat não lista nenhuma conexão aberta incomum. netstat -a
saída:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.11:42045 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
udp 0 0 127.0.0.11:59658 0.0.0.0:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
Responder1
Acontece que instalamos a xdebug
extensão que não parece fechar seus soquetes corretamente.
socket(AF_INET, SOCK_STREAM, IPPROTO_IP) = 306
20 fcntl(306, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
20 connect(306, {sa_family=AF_INET, sin_port=htons(9000), sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EINPROGRESS (Operation now in progress)
20 select(307, [306], [306], [306], {tv_sec=0, tv_usec=200000}) = 2 (in [306], out [306], left {tv_sec=0, tv_usec=199998})
20 getpeername(306, 0x7ffe1d6453f0, [16]) = -1 ENOTCONN (Transport endpoint is not connected)20