Install PHP xhprof (профилирование, мониторинг нагрузки CPU)

Submitted by admin on Thu, 01/27/2022 - 13:33

Исходники официально хранятся на https://pecl.php.net/package/xhprof, но чтобы потом легко подгужить новую версию мы будем использоваться git репозиторий https://github.com/longxinH/xhprof.

Базовые операции по компилированию будем делать на компьютере с которго ведется разработка, на сервер закидываем только сам so файл, чтобы не нагружать его лишними библиотеками.

Компиляция модуля

Придумываем где мы будем хранить исходники, и закачиваем туда исходники нужного модуля:

cd /var/www/_php_sources
git clone https://github.com/longxinH/xhprof.git
cd xhprof/extension
phpize
./configure
make

После этого у нас будет скомпилирован файл .so который можно будет закидывать на сервер для установки.

Установка модуля

Копируем so файл на сервер, и прописываем в php.ini файле абсолютный путь у нашему so файлу:
nano /etc/php/7.2/fpm/php.ini
extension=/var/www/_php_sources/compiled/xhprof.so

Перезапускаем php сервис
service php7.2-fpm restart

Настройка админки

Вспомогательные файлы лежат в папке скачиваемого с гита модуля, поэтому на боевом сервере, хоть там и не компилируется сам модуль, мы тоже слокируем репозиторий в ту же папку и нужно сделать отдельный сайт для просмотра статистики. Для этого, так как у нас Caddy->nginx->php-fpm.

1. Прописываем Кадди обратиться к прокси nginx в CaddyFile:

#xhprof profiler address for this server
prof.toopro.org {
  root * /var/www/_php_sources/xhprof/xhprof_html
  header -Server
  encode gzip zstd
  reverse_proxy 127.0.0.1:8088
}

так как кадди будет переадресовывать на https и просить сертификат, для нашего домена придется реально прописать поддомен такой в DNS записях домена.

2. Добавляем "сайт" в конфиги nginx:

nano /etc/nginx/site-available/prof.toopro.org

                
server {

  listen 8088;
  listen [::]:8088;


  server_name prof2022.toopro.org;
  root /var/www/_php_sources/xhprof/xhprof_html;

  index index.php;

  #logs
  access_log /var/log/nginx/access.log combined;
  error_log  /var/log/nginx/error.log;

  location ~* \.(php)$ {
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}

Делаем ссылку в запущенные сайты

ln /etc/nginx/sites-available/prof.toopro.org /etc/nginx/sites-enabled/

Перезапускам nginx

service nginx reload

Запуски на боевом сервере

Для работы на продакшене, лучше запускать его иногда, а не всегда, поэтому сделаем такой режим, как один раз на 100 запросов.