docker 输出PHP 慢日志 ERROR: failed to ptrace(ATTACH) child 24: Operation not permitted (1)


我在docker容器中安装了php-fpm
并在其中Dockerfile编辑fpm config文件(/usr/local/php/etc/php-fpm.cof)
来设置错误日志/var/log/php-fpm.log和慢日志/var/log/php-slow.log
RUN ln -sf /dev/stdout /var/log/php-slow.log && \
ln -sf /dev/stderr /var/log/php-fpm.log
启动完成以后报错
ERROR: failed to ptrace(ATTACH) child 24: Operation not permitted (1)

查阅资料后发现是因为docker 权限的问题:在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容器中默认是不启用这个功能的,因此导致了问题。
具体可以参考这个文章
https://www.jianshu.com/p/7afb69668280
http://www.04007.cn/article/761.html
I finally figured this out. You need to give the docker container the capability to use ptrace.
Simply adding --cap-add SYS_PTRACE to the docker run command fixed this problem for me.
容器启动时,加入参数:
--cap-add SYS_PTRACE
在k8s yaml文件中添加
image: PHP
securityContext:
capabilities:
add:
- SYS_PTRACE
权限问题解决了,但是又有新的问题
只能看到PHP 错误日志,慢日志一直为空
好的,方法是将错误和访问日志发送到以下地址
PHP-FPM日志将仅出现在STDERR中,所以PHP-FPM 产生的任何日志都会定义到STDERR,所以out是不会有日志
因此,您可以根据需要fpm.log对它们进行符号链接/dev/stderr
最终的符号链接是
RUN ln -sf /dev/stderr /var/log/php-slow.log && \
ln -sf /dev/stderr /var/log/php-fpm.log

参考地址

 

https://qastack.cn/server/658367/how-to-get-php-fpm-to-log-to-stdout-stderr-when-running-in-a-docker-container

最终完成了慢日志的启用

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM