El contenedor PHP Apache abre continuamente los identificadores /proc/*/fd

El contenedor PHP Apache abre continuamente los identificadores /proc/*/fd

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 15producció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 -aproducció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 xdebuginstalada 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

información relacionada