我在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
最終完成了慢日志的啟用
