TL:DR:PHP/Apache en la ventana acoplable crea continuamente 'archivos' que /proc/*/fd/
eventualmente hacen que el sitio sea inutilizable.
Estamos ejecutando una aplicación PHP en la ventana acoplable ( php:5.6-apache
). Implementamos esta pila en producción hace unas semanas. Después de unos días, los clientes tuvieron problemas para acceder al sitio, lo cual fue causado por errores 403 aleatorios para varios archivos, como javascript, imágenes, etc.
Hasta donde puedo decir, esto fue causado por este error.
[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
Así que fui y verifiqué qué archivos estaban abiertos por los procesos de Apache. lsof -a -p 15
producción:
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)
El número fd aumenta continuamente cuando se accede al sitio web, hasta que finalmente alcanza el límite de archivos abiertos.
EDITAR:
El motivo (readlink: Permission denied)
fue uncaracterística de seguridad de la ventana acoplable, por lo que todos esos identificadores son en realidad sockets TCP abiertos.
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
Sin embargo, netstat no enumera conexiones abiertas inusuales. netstat -a
producción:
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
Respuesta1
Resulta que teníamos xdebug
instalada la extensión que no parece cerrar sus enchufes correctamente.
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