问题描述:
使用docker编译的PHP-FPM无法写入慢日志,具体表现为已在config中配置了request_terminate_timeout=10;slowlog= /var/tmp/$pool.slow.log;运行PHP容器时也能生成/var/tmp/www.slow.log慢日志文件,但你会发现这个文件大小一直是0,好像从来没有慢程序。
查阅资料后发现:在docker中部署的php容器默认是不能记录慢日志的;在Linux系统中,PHP-FPM使用SYS_PTRACE跟踪worker进程,SYS_PTRACE是什么?这是Linux capabilities里的一种操作特权?Linux capabilities 是什么?linux从内核2.2开始,将传统上与超级用户root关联的特权划分为不同的单元,称为capabilites。Capabilites 作为线程(Linux 并不真正区分进程和线程)的属性存在,每个单元可以独立启用和禁用。如此一来,权限检查的过程就变成了:在执行特权操作时,如果进程的有效身份不是 root,就去检查是否具有该特权操作所对应的capabilites,并以此决定是否可以进行该特权操作。所以在docker容器中php写慢日志就得有CAP_KILL capability ,设置系统时间,就得具有 capability CAP_SYS_TIME。docker容器中默认是不启用这个功能的,因此导致了问题。
解决方案:
1、关闭seccomp
docker run --security-opt seccomp=unconfined
2、采用超级权限模式
docker run --privileged
3、仅开放ptrace限制
docker run --cap-add=sys_ptrace
当然从安全角度考虑,如只是想使用gdb进行debug的话,建议使用第三种。
END!