Я использую 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 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
Итак, запустите эту команду, и все готово.