Я использую CentOS 7 с Nginx / PHP-FPM. Чтобы отладить пару медленных запросов 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.
Есть идеи?
Это вызвано SELinux, который блокирует подключение веб-сервера (и PHP, который работает в контексте веб-сервера) к процессам для отслеживания их выполнения.
Об этом было сообщено Red Некоторое время назад, но они отказались что-либо предпринять .
Вы можете проверить свой /var/log/audit/audit.log
, и вы найдете это отрицание вошел в AVC, аналогичный:
type = AVC msg = audit (21.05.2015 21: 37: 21.028: 14259): avc: denied {sys_ptrace} для pid = 1385 comm = php-fpm capacity = sys_ptrace scontext = system_u: system_r: httpd_t: s0 tcontext = system_u: system_r: httpd_t: s0 tclass = возможность
Чтобы решить проблему для вашего собственного сервера, вы можете создать локальный модуль политики 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
Итак, запустите эту команду, и все готово.