3

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

1 ответ1

2

Оказывается, у нас установлено расширение xdebug которое, похоже, не закрывает свои сокеты правильно.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .