TL:DR: PHP/Apache в Docker постоянно создает «файлы» в /proc/*/fd/
конечном итоге делает сайт непригодным для использования.
Мы запускаем приложение PHP в докере (php:5.6-apache
). Мы развернули этот стек в производство несколько недель назад. Через несколько дней у клиентов возникли проблемы с доступом к сайту, которые были вызваны случайными ошибками 403 для различных файлов, таких как JavaScript, изображения и т.д.
Насколько я могу сказать, это было вызвано этой ошибкой
[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
Поэтому я пошел и проверил, какие файлы были открыты процессами Apache. lsof -a -p 15
:
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)
Число fd непрерывно увеличивается при доступе к веб-сайту, пока в конечном итоге оно не достигнет предела количества открытых файлов.
РЕДАКТИРОВАТЬ: причиной (readlink: Permission denied)
была функция безопасности докера, поэтому все эти дескрипторы на самом деле являются открытыми сокетами TCP.
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
Однако в netstat нет никаких необычных открытых соединений. netstat -a
вывод:
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