我正在运行带有 Nginx/PHP-FPM 的 CentOS 7。为了调试几个缓慢的 Wordpress 和 CodeIgniter 请求,我在以下位置激活了 PHP-FPM 的慢速日志功能www-pool.conf
:
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 4s
缓慢的请求被记录下来,但有意义的堆栈跟踪没有被打印到www-slow.log
。文件正在生成但为空,默认error.log
显示如下条目:
[12-Nov-2017 16:50:26] WARNING: [pool www] child 21497, script '/usr/share/nginx/www/wordpress/index.php' (request: "GET /index.php") executing too slow (4.161874 sec), logging
[12-Nov-2017 16:50:26] ERROR: failed to ptrace(ATTACH) child 21491: Operation not permitted (1)
[12-Nov-2017 16:50:26] WARNING: [pool www] child 21491, script '/usr/share/nginx/www/wordpress/index.php' (request: "GET /index.php") executing too slow (4.590854 sec), logging
[12-Nov-2017 16:50:26] ERROR: failed to ptrace(ATTACH) child 21490: Operation not permitted (1)
[12-Nov-2017 16:50:26] WARNING: [pool www] child 21490, script '/usr/share/nginx/www/wordpress/index.php' (request: "GET /index.php") executing too slow (4.620915 sec), logging
[12-Nov-2017 18:03:52] ERROR: failed to ptrace(ATTACH) child 21523: Operation not permitted (1)
[12-Nov-2017 18:03:52] WARNING: [pool www] child 21523, script '/usr/share/nginx/www/wordpress/wp-admin/index.php' (request: "GET /wp-admin/index.php") executing too slow (4.366918 sec), logging
日志文件/文件夹归运行 php-fpm 的 php-fpm 用户所有。
有任何想法吗?
答案1
这是由 SELinux 引起的,它阻止 Web 服务器(以及在 Web 服务器上下文中运行的 PHP)附加到进程以跟踪其执行情况。
这个问题之前已经报告给了 Red Hat,但是他们拒绝采取任何行动。
您可以检查您的/var/log/audit/audit.log
,您会发现此拒绝记录在 AVC 中类似于:
type=AVC msg=audit(05/21/2015 21:37:21.028:14259) : avc: denied { sys_ptrace } for pid=1385 comm=php-fpm capability=sys_ptrace scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:httpd_t:s0 tclass=capability
要解决您自己的服务器的问题,您可以使用 创建本地 SELinux 策略模块audit2allow
。通过标准输入将 AVC 提供给audit2allow
它,如下所示:
$ audit2allow -M php_ptrace
type=AVC msg=audit(05/21/2015 21:37:21.028:14259) : avc: denied { sys_ptrace } for pid=1385 comm=php-fpm capability=sys_ptrace scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:httpd_t:s0 tclass=capability
运行该命令,然后将 AVC 日志条目粘贴到终端并按Ctrl- D。您将获得生成的策略和说明:
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i php_ptrace.pp
因此,运行该命令,您就完成了。