nginx+php5.6+xhprof+XH GUI+Callgraph(Graphviz)の構築

今回、作成したPHPプログラムのどこにボトルネックがあるかを調べるために

XHProf
XH GUI
CallGraph(Graphviz)

のプロファイル環境を構築しました。

以下、インストール時のメモです。

1. xhprofのインストール 
xhprofは、peclで公開されているため、peclを使ってインストールします。

 # pecl install xhprof-0.9.4

 xhprofを読み込むため、xhprof.iniの作成とシンボリックリンクの作成を行います。

 # vi /etc/php5/mods-available/xhprof.ini

ファイルの中身は以下の1行のみです。

 extension=xhprof.so

xhprof.iniを有効にするため、以下の作業を行います。

 # cd /etc/php5/fpm/conf.d
 # ln -s ../../mods-available/xhprof.ini 30-xhprof.ini
 # systemctl restart php5-fpm

2. XH GUIのダウンロードと配置
 XH GUIはgitにて公開されています。gitコマンドを使ってcloneします。
 cloneしたファイル一式を/opt/xhprof として配置します。

 # cd /usr/local/src
 # git clone https://github.com/preinheimer/xhprof.git
 # mv xhprof /opt/xhprof

3. Graphvizのインストール
 これは、debパッケージが普通に提供されているため、apt-getでインストールします。

 # apt-get install graphviz

4. XH GUIとCallGraphの設定準備 XH GUIの設定ファイルを準備します。

 # cd /opt/xhprof/xhprof_lib
 # cp config.sample.php config.php

 バックエンドにMySQLを利用。及び、Graphvizの設定を行います。
 MySQLへの接続は、mysqliを利用します。
 今回は、DBサーバーが別サーバーのため、mysqlサーバーへユーザーの追加も行います。

 # ssh db1
  *db1は、任意のサーバーを選択してください。
  ローカルのmysqlを利用するときは、この行を無視してください。
 # mysql -uroot -p****
 mysql> create database xhprof;
 mysql> grant all on xhprof.* to xhprof@'192.168.0.0/255.255.255.0' identified by 'xhprof';
 mysql> flush privileges;
 mysql> quit
 # exit

 青色の箇所は、お使いの環境によって変更してください。
 たとえば、MySQLがローカルで動いていれば、localhost ですね。

5. XH GUI用のSQLを流し込み XH GUIに、MySQL用のcreate table文が入っているため、これを利用します。

 # cd /opt/xhprof/xhprof_lib/utils/Db
 # cat Mysqli.php

 ※ファイルの先頭にcreate table文がはいっているので、コピーしておく

 # ssh db1
 # mysql -xhprof -pxhprof -A xhprof -h 192.168.0.10
 mysql> ... ここにcreate table文を貼り付け
 mysql> exit
 # exit

6. XH GUIの設定ファイル編集

 # cd /opt/xhprof/xhprof_lib/
 # vi config.php

 以下では、実際に行った設定内容を記述します。(一部伏せてます)

・5 行目付近 sec.5で行ったDB設定を反映
$_xhprof['dbtype'] = 'mysql'; // Only relevant for PDO
$_xhprof['dbhost'] = '192.168.0.10';
$_xhprof['dbuser'] = 'xhprof';
$_xhprof['dbpass'] = 'xhprof';
$_xhprof['dbname'] = 'xhprof';
$_xhprof['dbadapter'] = 'Mysqli';
$_xhprof['servername'] = 'myserver';
$_xhprof['namespace'] = 'myapp';
$_xhprof['url'] = 'http://xhprof.example.com'; // <- nginxで設定するURLを指定。 sec.7を参照
・31行目付近(コメントアウトを外す)
$_xhprof['dot_binary'] = '/usr/bin/dot';
$_xhprof['dot_tempdir'] = '/tmp';
$_xhprof['dot_errfile'] = '/tmp/xh_dot.err';

・52行目付近 アクセスコントロールを無効にする
$controlIPs = false; //Disables access controlls completely.
// $controlIPs = array();
// $controlIPs[] = "127.0.0.1"; // localhost, you'll want to add your own ip here
// $controlIPs[] = "::1"; // localhost IP v6

7. XH GUIの公開
 以下はnginxの設定例です。

 # cd /etc/nginx/conf.v/
 # vi xhprof.example.com.conf
server {
listen 80;
server_name xhprof.example.com;

root /opt/xhprof/xhprof_html/;
index index.php index.html index.htm;
charset utf-8;

location = /robots.txt { access_log off; log_not_found off; }
location = /favicon.ico { access_log off; log_not_found off; }

location ~* \.php$ {
expires off;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}

8. xhprofを有効にする
 xhprofを有効にするドメインのfcgiパラメータを編集します。

 # vi dev.example.com.conf
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
    ...
fastcgi_param PHP_VALUE
"auto_prepend_file=/opt/xhprof/external/header.php \n
auto_append_file=/opt/xhprof/external/footer.php"; // 以上3行を追加する
}

9. nginxの設定確認

 # /etc/init.d/nginx configtest

10. nginx再起動

 # systemctl restart nginx

11. sec.8で有効にしたドメインへ、特殊パラメータをつけてアクセス

 http://dev.example.com/?_profile=1

 一度profile=1をつけると、cookieにprofileのフラグが立つため、無効にする場合は

 http://dev.example.coim/?_profile=0


 とアクセスする。

12. xhprof及びXH GUI, Graphvizが動作していることを確認

http://xhprof.example.com/ へアクセスし、XH GUIが動作していることを確認

  • entry22ツイート
  • Google+

PageTop