TL:DR:Docker의 PHP/Apache는 지속적으로 '파일'을 생성하여 /proc/*/fd/
결국 사이트를 사용할 수 없게 만듭니다.
우리는 docker( )에서 PHP 앱을 실행하고 있습니다 php:5.6-apache
. 우리는 몇 주 전에 이 스택을 프로덕션에 배포했습니다. 며칠 후 고객이 사이트에 액세스하는 데 문제가 발생했습니다. 이는 자바스크립트, 이미지 등과 같은 다양한 파일에 대한 임의의 403 오류로 인해 발생했습니다.
제가 알 수 있는 한 이는 이 오류로 인해 발생한 것입니다.
[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
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