エージェント(PHP)のインストール及び構成

この章ではエージェント(PHP)のインストール方法について説明します。

エージェント(PHP)の対応環境

対応OS

エージェント(PHP)をインストールできるOSは次の通りです。

エージェント(PHP)はLinuxカーネル v.2.6.18以上の環境で動作します。apache2モジュール、php-fpm、CLI、CGIで動作するPHPに対応しています。(CLI、CGIはバージョン5.2.2から対応)

対応PHPバージョン

ApacheモジュールまたはPHP-fpm、CLI、CGIで動作するPHP5.2.xから5.6.xとPHP7.0から7.4、PHP8.4をサポートします。

PHP7.4は、エージェントのバージョン5.5.2からサポートします。

PHP8.0.xは、エージェントのバージョン5.6.0からサポートします。

PHP8.1.xは、エージェントのバージョン5.6.0.4からサポートします。


PHP8.2.xは、エージェントのバージョン5.6.1.2からサポートします。

PHP8.3.xは、エージェントのバージョン5.6.2.3からサポートします。

PHP8.4RCは、エージェントのバージョン5.6.2.9からサポートします。

対応ライブラリバージョン

エージェント(PHP)は「libstdc++.so.6」および「libgcc_s.so.1(GCC_4.2.0以上)」ライブラリが必要です。PHPモジュール(libphp5.soまたはphp5-fpm)がlibstdc++.so.5以下のライブラリまたはGCC_4.2.0をサポートしないlibgcc_s.so.1ライブラリを使用する場合、エージェント(PHP)が正常動作しません。

対応OSにはlibstdc++.so.6とlibgcc_s.so.1(GCC_4.2.0サポート)がデフォルトでインストールされています。

libgcc_s.so.1のGCCバージョンは次のコマンドで確認が可能です。

$ strings /lib/libgcc_s.so.1 | grep GCC
GCC_3.0
GCC_3.3
GCC_3.3.1
GCC_3.4
GCC_3.4.2
GCC_4.0.0
GCC_4.2.0

結果でGCC_4.2.0以上が存在すれば導入が可能です。

libgcc_s.so.1が存在するパスはOSおよびビット数によって異なります。

LAMPP(XAMPP)環境

LAMPPバージョンにはlibgcc_s.so.1とlibstdc++.soが含まれています。LAMPPに含まれているlibgcc_s.so.1とlibstdc++.soのバージョンが対応ライブラリバージョンに存在しない場合はエージェント(PHP)のインストールができません。

次のコマンドでLAMPPが使用するlibstdc++.soとlibgcc_so.so.1のバージョンを確認できます。

libstdc++.so

$ ls /opt/lampp/lib/libstdc++*

コマンドの実行結果にlibstdc++.so.6以上でないライブラリが存在するとエージェント(PHP)のインストールができません。もし、結果が何もない場合はOSが提供するライブラリを使用するので、対応OSならエージェント(PHP)のインストールができます。

libgcc_s.so.1

$ ls /opt/lampp/lib/libgcc_s.so.1

コマンドの実行結果がない場合はOSが提供するlibgcc_s.so.1を使用するので、対応OSならエージェント(PHP)のインストールができます。

結果がある場合は次のコマンドを実行してGCCのバージョンを確認します。

$ strings /opt/lampp/lib/libgcc_s.so.1 | grep GCC

コマンドの実行結果がGCC_4.2.0以上でない場合はエージェント(PHP)のインストールができません。

エージェント(PHP)のディレクトリとファイル説明

エージェント(PHP)パッケージを解凍すると、agent.phpディレクトリが生成されます。agent.phpディレクトリには以下のファイルが生成されます。

エージェント(PHP)のディレクトリとファイル説明

ディレクトリ/ファイル

説明

bin/

実行バイナリファイルが存在するディレクトリ

install.php

エージェント(PHP)のインストール用のPHPスクリプトファイル

jennifer.conf

エージェント(PHP)設定ファイル

selinux_enable.sh

SELINUX使用時、SELINUXコンテキストを変更するためのshファイル

centos_x.te

SELINUXコンテキストを変更する時に使用するOSバージョン別のteファイル

master_agent.pid

マスターエージェントモードで実行されるエージェント(PHP)のプロキシープロセスのPIDを確認できます。エージェント(PHP)がマスターエージェントモードで実行される場合のみこのファイルが生成されます。(5.2.2以上)

ipc_resource.{PID}

エージェント(PHP)が使用するsysvリソースを確認できるファイルです。エージェント(PHP)が実行される時に生成され、正常に終了すると、このファイルも削除されます。エージェント(PHP)が非正常終了した時はこのファイルがそのまま残るので、ファイルに記述されているsysリソースを手動で削除しなければなりません。(5.2.2以上)

binディレクトリ内のファイルの説明

ファイル

説明

libJennifer5Common.so

共通のエージェントライブラリファイル

Jennifer5Agent

エージェント(PHP)情報をデータサーバへ送るプロセスファイル

jennifer5-php-x.x.x-NTS.so

PHPバージョンごとに情報を収集するPHP拡張モジュール

(プロセスで動作するモジュールに適用)

jennifer5-php-x.x.x-ZTS.so

PHPバージョンごとに情報を収集するPHP拡張モジュール

(スレッドで動作するモジュールに適用)

エージェントインストール

エージェントのインストール (agent-installer実行方式)

PHPエージェントの5.4.1バージョンからはagent-installer バイナリーファイルがパッケージに追加されました。agent-installerは実行中のApache、PHP-fpmプロセスを確認し、PHPエージェントをインストールするプログラムです。

  1. agent.phpディレクトリへ移動して、「agent-installer -i」コマンドで実行中のPHPプロセスを確認します。

#sudo ./agent-installer -i

Inspect running PHP Application(mod-apache or fpm)
  Inspect file : "/usr/lib/apache2/modules/libphp7.so"
  Found PHP Thread Safety : NTS
  Found php.ini : /usr/local/etc/php/php.ini
  Found PHP Version : 7.2.16


Found 1 PHP Application

* cmd: apache2, version: PHP 7.2.16, thread safety: NTS
#./agent-installer --help

USAGE:
    agent-installer
    agent-installer [FLAGS]

FLAGS:
    -d, --delete     Uninstall PHP Agent 
    -h, --help       Prints help information
    -i, --inspect    Inspect running PHP Application(mod-apache or fpm)
    -V, --version    Prints version information
  1. agent-installer コマンドを実行しPHPエージェントをインストールします。

#sudo ./agent-installer 


Install Jennifer PHP Agent

  Inspect running PHP Application(mod-apache or fpm)

    Inspect file : "/usr/lib/apache2/modules/libphp7.so"
    Found PHP Thread Safety : NTS
    Found php.ini : /usr/local/etc/php/php.ini
    Found PHP Version : 7.2.16

  1. cmd: apache2, version: PHP 7.2.16, thread safety: NTS

Found 1 PHP Application. Select PHP Application [1,n] :
  1. 表示されるプロセス中、インストール対象のプロセスを選択します。(リスト中の番号を入力)

Found 1 PHP Application. Select PHP Application [1,n] :1

  Find extension for php-7.2.16-NTS
  PHP extension path : /usr/local/jennifer/agent.php/bin/jennifer5-php-7.2.x-NTS.so

  Update /usr/local/etc/php/php.ini
    * [jennifer]
    * jenniferAgent.agent_file_root=/usr/local/jennifer/agent.php
    * extension=/usr/local/jennifer/agent.php/bin/jennifer5-php-7.2.x-NTS.so

Install complete, edit /usr/local/jennifer/agent.php/jennifer.conf and restart apache or fpm.

PHPプロセスの確認内容は.inspect-info ファイルに記録されます。PHPインストール情報は .install-info ファイルに記録されます。

PHP5.2.xの場合

PHPバージョン5.2.xの場合、extensionパス認識の仕様上extension_dirがベースディレクトリになります。そのため、extenson_dirにJENNIFERモジュールのシンボリックリンクを生成する必要があります。

シンボリックリンクを生成するため、インストーラー実行時にextension_dirへの書き込み権限が必要です。

  1. agent.php/jennifer.confの必要な設定を行います。

エージェント(PHP)構成のために必要な設定

項目

初期値

説明

server_address

127.0.0.1

データサーバのIPアドレス

server_port

5000

データサーバのポート番号

domain_id

1000

ドメインIDで、有効範囲は1から32767までの整数

  1. ApacheまたはPHP-fpmを再起動します。

  1. 再起動後、agent.php/logディレクトリにログファイルjennifer_YYYY-MM-DD.logが生成されます。エージェント(PHP)がデータサーバと接続できると、次のようなメッセージが出力されます。

2016-05-18/10:17:00 INFO--PHP Agent 5256:Send Agent Info

---------------- [App Initialized] ----------------------
Jennifer Server Address = 192.168.0.120
Jennifer Server Port = 5000
sid = 1000
inst id = 10000
Agent pid = 5256
Apache pid = 5254
MachineName = Ubuntu 12.04.4 LTS
Is64BitProcess = 1
Processor Architecture = x86_64
---------------------------------------------------------

エージェントのインストール (install.php実行方式)

上記のagent-installer実行方式以外にinstall.phpを利用してインストールする方法について説明します。

  1. agent.phpディレクトリへ移動して、php.cliコマンドを使用してinstall.phpを実行します。この時、パラメータとしてphp構成ファイル(php.ini)のフルパスを指定します。

<Ubuntu Linux>
$ php install.php /etc/php5/apache2/php.ini
<RedHat, Cent OS Linux>
$ php install.php /etc/php.ini
  1. エージェント(PHP)がインストールされているディレクトリのフルパスを入力します。コマンドを実行した現在のディレクトリを指定する場合、'./'を入力します。

Start Jennifer PHP Agent Installer

Enter Jennifer PHP Agent install path :/home/jennifer/agent.php

Jennifer install path :/home/jennifer/agent.php
  1. PHPのバージョンとエージェント(PHP)のバージョンを確認し、'yes'を入力します。

--------------------------------------------------------
Current Directory :/home/jennifer/agent.php
Jennifer Agent Install Path :/home/jennifer/agent.php
PHP Version :5.3.10-1ubuntu3.10
Thread Safety : disable
Arch : x86_64
Jennifer PHP Agent extension file name : jennifer5-php-5.3.x-NTS.so
PHP Configuration file :/etc/php5/apache2/php.ini
--------------------------------------------------------

Do you want to continue?(yes or no) : yes

Write php.ini for Jennifer PHP Agent

extension=/home/jennifer/agent.php/bin/jennifer5-php-5.3.x-NTS.so
jenniferAgent.agent_file_root=/home/jennifer/agent.php

Check a Jennifer Agent executable file :/home/jennifer/agent.php/bin/Jennifer5Agent -- exists
Check a Jennifer Agent shared library file :/home/jennifer/agent.php/bin/Jennifer5Common.so -- exists
Check a Jennifer Agent PHP extension file :/home/jennifer/agent.php/bin/jennifer5-php-5.3.x-NTS.so -- exists
Check a Jennifer Agenet configuration file :/home/jennifer/agent.php/jennifer.conf -- exists

Installation successfully complete.

1.Open your jennifer.conf in jennifer install path, and specify a server address, sid, host_id and inst_id.
2.Restart Apache Server

root@NominT:/home/jennifer/agent.php#
  1. agent.php/jennifer.confに必要な設定を行います。

エージェント(PHP)構成のために必要な設定

項目

初期値

説明

server_address

127.0.0.1

データサーバのIPアドレス

server_port

5000

データサーバのポート番号

domain_id

1000

ドメインIDで、1から32767までの整数

  1. ApacheまたはPHP-fpmを再起動します。

  1. 再起動後、agent.php/logディレクトリにログファイルjennifer_YYYY-MM-DD.logが生成されます。エージェント(PHP)がデータサーバと接続できると、次のようなメッセージが出力されます。

2016-05-18/10:17:00 INFO--PHP Agent 5256:Send Agent Info

---------------- [App Initialized] ----------------------
Jennifer Server Address = 192.168.0.120
Jennifer Server Port = 5000
sid = 1000
inst id = 10000
Agent pid = 5256
Apache pid = 5254
MachineName = Ubuntu 12.04.4 LTS
Is64BitProcess = 1
Processor Architecture = x86_64
---------------------------------------------------------

エージェントの手動インストール

agent-installerやInstall.phpスクリプトでインストールができない場合は次のように手動でインストールできます。

  1. agent.phpディレクトリに移動します。

$ cd /home/jennifer/agent.php
  1. php -vコマンドでサポートするPHPのバージョンを確認します。

$ php -v
PHP 5.4.5 (cli) (built:Apr 3 2015 16:08:35)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
  1. PHPのThread Safety値を確認します。

$ php -i | grep Thread
Thread Safety => disabled
  1. 該当PHPバージョンに対するPHP extensionファイルの存在の有無を確認します。PHP extensionファイルはagent.php/binディレクトリにあり、jennifer5-php-{PHP_Major_Version}. {PHP_Minor_Version}.x-{NTS or ZTS}.soの形式のファイル名に従います。Thread Safety値がdisabledの場合はNTSをenabledの場合はZTSが必要です。

$ ls bin/jennifer5-php-5.4.x-NTS.so
bin/jennifer5-php-5.4.x-NTS.so
  1. エージェント(PHP)ホームディレクトリのフルパスとエージェントextensionファイルのフルパスをphp.iniファイルに追記します。

extension=/home/jennifer/agent.php/bin/jennifer5-php-5.4.x-NTS.so
jenniferAgent.agent_file_root=/home/jennifer/agent.php
  1. jennifer.confに必要な設定を行います。

エージェント(PHP)構成のために必要な設定

項目

初期値

説明

server_address

127.0.0.1

データサーバのIPアドレス

server_port

5000

データサーバのポート番号

domain_id

1000

ドメインIDで、1から32767までの整数

inst_id

-1

インスタントエージェントIDが'-1'の場合、IDは自動的にサーバから割り当てられます。1から32767までの整数です。

log_dir

./logs

ログファイルの出力先の設定で、エージェント設定ディレクトリ配下のlogsディレクトリがデフォルトの出力先

log_max_age

0

ログファイルの保存期間で保存する日数(例えば、30の場合30日間)を設定します。0の場合は永久保存です。

  1. ApacheまたはPHP-fpmを再起動します。

  1. 再起動後、agent.php/logディレクトリにログファイルjennifer_YYYY-MM-DD.logが生成されます。エージェント(PHP)がデータサーバと接続できると、次のようなメッセージが出力されます。

2016-05-18/10:17:00 INFO--PHP Agent 5256:Send Agent Info

---------------- [App Initialized] ----------------------
Jennifer Server Address = 192.168.0.120
Jennifer Server Port = 5000
sid = 1000
inst id = 210
Agent pid = 5256
Apache pid = 5254
MachineName = Ubuntu 12.04.4 LTS
Is64BitProcess = 1
Processor Architecture = x86_64
---------------------------------------------------------

CLI、CGIで動作するPHP環境へエージェント(PHP)インストール(5.2.2以上)

php.iniにjenniferAgent.enable_cgi_cliオプションの設定

CLIやCGIで動作するPHP環境でJENNIFERエージェントが動作するためには、php.iniに[jenniferAgent.enable_cgi_cli]オプションを”1”に設定する必要があります。デフォルト値は”0”です。

jenniferAgent.enable_cgi_cli=1

PHPマスターエージェント

CLI、CGIで動作する環境へエージェントをインストールするにはJENNIFERが提供するマスターエージェントプロセスを別途実行する必要があります。

Apacheモジュール、PHP-FPMで動作するエージェント(PHP)はマスターエージェントの実行が不要です。

Apache-PHPとPHP-CLIへ同時にJENNIFERエージェントをインストールする場合は、Apache-PHPとPHP-CLIが使用するphp.iniファイルを分離する必要があります。(同一php.iniファイルの両方使用はできない)

※php.iniファイルの分離方法については、以下のURLをご参照してください。

http://php.net/manual/ja/configuration.file.php

PHPマスターエージェントの実行

エージェント(PHP)のインストールディレクトリが/jennifer/agent.phpの場合、次のように実行します。

/jennifer/agent.php/bin/./Jennifer5Agent -k start
2017-03-24/14:12:38 INFO-- 7254: Run Jennifer5Agent

マスターエージェントが正常に実行していると、/jennifer/agent.php/logsで起動ログおよび/jennifer/agent.php/master_agent.pidファイルの確認ができます。その後CLI、CGIで動作するPHPプロセスはデータを収集してマスターエージェントへ転送します。

PHPマスターエージェントの終了

エージェント(PHP)のインストールディレクトリが/jennifer/agent.phpの場合、次のように実行します。

/jennifer/agent.php/bin/./Jennifer5Agent -k stop 
2017-03-24/14:15:11 INFO-- 7310: Try to kill existing Master Agent

マスターエージェントが正常に終了すると、/jennifer/agent.php/logsで終了ログおよび/jennifer/agent.php/master_agent.pidファイルの削除が確認できます。

PHPマスターエージェントの再起動

エージェント(PHP)のインストールディレクトリが/jennifer/agent.phpの場合、次のように実行します。

/jennifer/agent.php/bin/./Jennifer5Agent -k restart
2017-03-24/14:16:46 INFO-- 7345: Try to kill existing Master Agent
2017-03-24/14:16:48 INFO-- 7346: Run Jennifer5Agent

マスターエージェントが再起動されると、/jennifer/agent.php/logsで終了と起動ログが確認できます。

Apache-CGIで動作するPHP環境の注意点

Apacheで実行したphp-cgiプロセスがエージェント(PHP)のインストールディレクトリへアクセスできるように権限を設定する必要があります。Apacheの設定(httpd.conf)に次のような設定を追記します。

<Directory "/home/jennifer/agent.php">
    Require all granted
</Directory>

また、Apache起動ユーザのインストールディレクトリ(/home/jennifer/agent.php)へ読み取りと書き込み権限の追加が必要です。

chmod 755 /home/jennifer
chmod 755 /home/jennifer/agent.php

php-cgiプロセスがエージェント(PHP)インストールディレクトリへアクセス権限がない場合、Apacheのerror.logに次のようなログが出力されます。

PHP Warning: PHP Startup: Unable to load dynamic library '/home/jennifer/agent.php/bin/jennifer5-php-5.3.x-NTS.so' : cannot open shared object file: Permission denied in Unknown on line 0

コンテナ(Docker)にインストールする場合

インストールの流れ

1

モニタリング対象コンテナのDockerfileがある作業ディレクトリにJENNIFERエージェントのパッケージを用意します。

└── php_agent_install
    ├── Dockerfile
    └── jennifer-agent-php-x.x.x.x.zip

2

使用するエージェント設定ファイルの内容を次のように記述します。

server_address = 192.168.9.37
server_port = 5000

# default log_dir "{agent_home}/logs"
# log_dir = {agent_home}/logs
# log_file =
# log_level : 1(info), 2(debug), 3(trace)
log_level = 1
log_encoding = UTF-8
log_rotation = true
# log_max_age : Working when log_rotation is activated. Valid ragne is (1-365)
# log_max_age = 0

# domain_id : Valid range is (1-32767)
domain_id = 1000

server_address、server_port、domain_idに適切な値を設定します。

3

作成したエージェント設定ファイルを作業ディレクトリへコピーします。

└── workspace
    ├── Dockerfile
    ├── jennifer-agent-php-x.x.x.x.zip
    └── jennifer.conf

4

php.iniファイルを修正します。

[jennifer]
jenniferAgent.agent_file_root=/opt/agent.php
# configure jennifer extension
extension=/opt/agent.php/bin/jennifer5-php-8.0.x-NTS.so

5

作成したphp.iniファイルを作業ディレクトリにコピーします。

└── php_agent_install
    ├── Dockerfile
    ├── jennifer-agent-php-x.x.x.x.zip
    ├── php.ini
    └── jennifer.conf

6

次のようにDockerfileを編集して、JENNIFERエージェントをインストールします。

  1. エージェントのパッケージをコンテナ内部へコピーし、/opt/agent.phpディレクトリへ解凍します。

  2. jennifer.confファイルを/opt/agent.php/confへコピーします。

  3. php.iniファイルを設定ディレクトリへコピーします。

FROM php:8.0-apache

# Apache setting
ENV APACHE_RUN_USER  www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_RUN_DIR   /var/run/apache2
ENV APACHE_PID_FILE  /var/run/apache2/apache2.pid
ENV APACHE_LOG_DIR   /var/log/apache2
ENV APACHE_LOCK_DIR  /var/lock/apache2


# JENNIFER Agent setting
RUN apt update
RUN apt install unzip -y

ENV JENNIFER_AGENT_VERSION=5.6.0

COPY jennifer-agent-php-64bit-${JENNIFER_AGENT_VERSION}.zip /opt
RUN cd /opt && unzip jennifer-agent-php-64bit-${JENNIFER_AGENT_VERSION}.zip
COPY jennifer.conf /opt/agent.php/jennifer.conf
COPY php.ini /usr/local/etc/php/php.ini
# ...
CMD ["apache2"]

JENNIFER_AGENT_VERSIONにはダウンロードしたJENNIFERパッケージのバージョンを設定します。

7

Dockerfileの構成が終了すると、次のようにコンテナをビルドして構成した内容が反映されます。

docker build -t jennifer-php .

エージェント(PHP)のアンインストール

PHP構成ファイル(php.ini)のJENNIFER関連の下記の設定を削除し、ApacheまたはPHP-fgmを再起動します。

;extension=/home/jennifer/agent.php/jennifer5-php-5.3.x-NTS.so
;jenniferAgent.agent_file_root=/usr/local/jennifer5-debug/

RedHat系のLinuxで、SELINUX動作するときの方法

RedHat系Linux(RedHat、CentOS)でSELINUXが動作中(enabled)の場合はエージェント(PHP)が正常に動作しません。その場合、次の方法の中からどちらかを選択して適用します。

SELINUXをpermissive方式に変更

次のコマンドでSELINUXをpermissiveモードにします。

$ setenforce 0

SELINUXコンテキストを変更

この方法を使用するためにはエージェント(PHP)のインストールパスを/home配下にする必要があります。

次の手順でSELINUXのコンテキストを変更します。

$ yum install policycoreutils-python

policy utilityをインストールします。インストール済の場合はスキップします。

$ cd /home/jennifer/agent.php
$ ./selinux_enable.sh centos_#.te

OSバージョンに対応するteファイルで実行します。例えば、CentOS6やRedHat6の場合はcentos_6.teで実行します。

トラブルシューティング

JENNIFERが提供するteファイルでSELINUXコンテキストを変更しても、OSの可変的な環境設定によってエージェント(PHP)が正常に動作しないことがあります。その場合は次の手順でSELINUXのコンテキストを変更します。

$ grep httpd_t /var/log/audit/audit.log | audit2allow -m jennifer_2 > jennifer_2.te
$ ./selinux_enable.sh jennifer_2.te

PHP5.2.x環境の設定

PHP 5.2.x バージョンの場合、php.iniのextensionオプションにフルパスで指定したJennifer5Agent Extension soファイルのロードができないことがあります。この場合は次のようにphp.iniのextension_dirにシンボリックリンクファイルを生成してからphp.iniファイルを修正します。

phpのextension_dirパス確認

php -i | grep extension_dir

extension_dirへ遷移後、Symbolicファイルを生成

cd $PATH_OF_PHP_EXTENSION_DIR
ln -s $JENNIER_PATH/agent.php/bin/jennifer5-php-5.2.x-NTS.so jennifer5-php-5.2.x-NTS.so
ln -s $JENNIER_PATH/agent.php/bin/Jennifer5Agent Jennifer5Agent 
ln -s $JENNIER_PATH/agent.php/bin/libJennifer5Common.so libJennifer5Common.so

php.iniに設定されているJennifer Agent Extensionのパスを次のように修正

extension=jennifer5-php-5.2.x-NTS.so