제니퍼 에이전트(php) 설치 및 구성

이 장에서는 제니퍼 PHP 에이전트를 일반적으로 설치하는 방법을 설명한다.

PHP 에이전트 지원 환경

지원되는 OS

아래는 PHP 에이전트를 정상적으로 설치할 수 있는 OS 이다.

리눅스 kernel 2.6.18 이상에서만 동작한다

지원되는 PHP 버전

Apache 모듈, PHP-fpm, CLI, CGI로 동작하는 PHP 5.2 ~ 5.6, PHP 7.0 ~ 7.4, PHP8.0 ~ 8.2 를 지원한다.

PHP 7 이후 부터 ZTS 버전을 지원하지 않는다.

라이브러리 의존성

PHP에이전트는 libstdc++.so.6, libgcc_s.so.1(GCC_4.2.0)에 의존성이 있다. PHP 모듈(libphp5.so 또는 php5-fpm)이 libstdc++.so.6 미만 버전에 의존성이 있거나 GCC 4.2.0을 지원하지 않는 libgcc_s.so.1에 의존성이 있다면 PHP 에이전트가 실행되지 않는다.

지원되는 OS 에 포함되는 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이 있으므로 PHP 에이전트가 실행 가능하다. 
# 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.2.0이 없으므로 PHP 에이전트가 실행 불가능하다.

libgcc_s.so.1의 위치는 운영체제와 32bit, 64bit 머신에 따라 다를 수 있다.

LAMPP(XAMPP) 환경일 경우

특정 LAMPP 버전은 libgcc_s.so.1 과 libstdc++을 포함하고 있는데, 이때 LAMPP내에 포함된 libgcc_s.so.1과 libstdc++의 버전이 라이브러리 의존성 요구사항에 미치지 못한다면 PHP 에이전트를 설치 할 수 없다.

다음 과정을 통해 LAMPP 버전에서 사용하는 libstdc++ 와 libgcc_so.so.1 버전을 확인할 수 있다.

# ls /opt/lampp/lib/libstdc++*
libstdc++.so.5  libstdc++.so.5.0.7 libstdc++.so.6
//위 경우 LAMPP에 libstdc++.so.5가 있으므로 PHP 에이전트를 실행할 수 없다. 
//만약 libstdc++* 파일이 없다면 OS가 제공하는 libstdc++를 사용하는 것이므로 PHP 에이전트를 실행할 수 있다.

# ls /opt/lampp/lib/libgcc_s.so.1
libgcc_s.so.1
//만약 libgcc_s.so.1 파일이 없다면 OS가 제공하는 libgcc_s.so.1을 사용하는 것이므로 PHP 에이전트를 실행할 수 있다.
# strings /opt/lampp/lib/libgcc_s.so.1 | grep GCC
GCC_3.0
GCC_3.3
GCC_3.3.1
GCC_3.4
GCC_3.4.2
//이 경우 libgcc_s.so.1 호환 버전에 GCC_4.2.0 이 없으므로 PHP 에이전트를 실행할 수 없다.

에이전트 디렉토리, 파일 설명

PHP Agent 패키지 압축 파일을 해제하면 agent.php 디렉토리가 생성된다. agent.php 디렉토리 내의 파일들에 대한 설명은 다음과 같다.

디렉토리, 파일 설명

디렉토리 / 파일

설명

비고

bin/

에이전트 실행 바이너리 파일이 있는 디렉토리


install.php

에이전트 설치를 위한 PHP 스크립트 파일


jennifer.conf

에이전트 설정 파일


master_agent.pid

Master 에이전트 모드로 실행되는 PHP 에이전트 프록시 프로세스의 PID를 확인할 수 있다. 에이전트가 Master 에이전트 모드로 실행중이 아니라면 이 파일이 생성되지 않는다. (5.2.2 버전 이상)

5.2.2 버전 이상, CLI, CGI만 해당함.

ipc_resource.{PID}

에이전트가 사용하는 sysv 리소스를 확인할 수 있는 파일이다. 에이전트가 동작할때 생성되며, 정상 종료되었다면 삭제된다. 에이전트가 비정상 종료 되었다면 ipc_resource.{PID} 파일이 그대로 남아 있게 되며, ipc_resource.{PID}내의 sys 리소스를 수동 삭제해야 한다.(5.2.2 버전 이상)

5.2.2 버전 이상

bin 디렉토리의 파일 설명

파일

설명

libJennifer5Common.so

에이전트 공용 라이브러리 파일

Jennifer5Agent

에이전트 정보를 제니퍼 데이터서버로 전달하는 프로세스 파일

jennifer5-php-5.2.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-5.2.x-ZTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( Thread 로 동작하는 모듈에 적용)

jennifer5-php-5.3.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-5.3.x-ZTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( Thread 로 동작하는 모듈에 적용)

jennifer5-php-5.4.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-5.4.x-ZTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( Thread 로 동작하는 모듈에 적용)

jennifer5-php-5.5.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-5.5.x-ZTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( Thread로 동작하는 모듈에 적용)

jennifer5-php-5.6.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-5.6.x-ZTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( Thread로 동작하는 모듈에 적용)

jennifer5-php-7.0.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-7.1.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-7.2.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-7.3.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-7.4.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-8.0.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-8.1.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-8.1.x-ZTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( Thread로 동작하는 모듈에 적용)

jennifer5-php-8.2.x-NTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( 프로세스로 동작하는 모듈에 적용)

jennifer5-php-8.2.x-ZTS.so

PHP 정보를 수집하는 PHP extention 모듈 ( Thread로 동작하는 모듈에 적용)

agent-installer 를 이용해 PHP 에이전트 설치 (5.4.1 이상)

PHP 에이전트 5.4.1 버전 부터 agent-installer 바이너리 파일이 패키지에 추가되었다. agent-installer는 현재 실행 중인 Apache, PHP-fpm 프로세스를 검사해 PHP 버전과 Thread Safe, php.ini 파일을 확인한 후 PHP 에이전트를 설치 하는 프로그램이다.

#./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

실행 중인 PHP Apache 프로세스, PHP-fpm 프로세스 검사

sudo ./agent-installer -i 를 실행해 실행 중인 PHP Apache 프로세스, PHP-fpm 프로세스를 검사한다. 검사 결과가 화면에 출력되며, 상세 검사 로그는 .inspect-info 파일에 기록된다.

#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

PHP 에이전트 설치

sudo ./agent-installer 를 실행해 PHP Agent를 설치한다. PHP 프로세스 상세 검사 로그는 .inspect-info 파일에 기록되며, PHP 설치 정보는 .install-info 파일에 기록된다.

#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

  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 에이전트 설치

  1. agent.php 디렉토리로 이동한 후 php cli 명령으로 install.php 를 실행한다. 이때 인자로 php 설정파일(php.ini) 의 절대 경로를 지정한다.

# php install.php /etc/php5/apache2/php.ini ( 우분투 리눅스 )
# 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 

--------------------------------------------------------
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
--------------------------------------------------------
  1. PHP 버전과 설치할 에이전트의 버전등의 정보를 확인 한 후 yes 를 입력한다.

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 에서 필수 설정을 한다.

에이전트 설정 필수 항목

항목

기본값

설명

server_address

127.0.0.1

데이터서버 IP Address

server_port

5000

데이터 서버 Port

domain_id

1000

도메인 ID, 유효값은 1 ~ 32767이다.

  1. apache 또는 php-fpm을 재시작 한다.

  1. apache 재시작 후 log 디렉토리에 jennifer_YYYY-MM-DD.log 로 로그 파일이 생성되며, 에이전트가 데이터 서버와 접속이 완료되면 아래와 같은 메세지를 로그 파일에서 확인할 수 있다.

2014-03-28/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
---------------------------------------------------------

PHP 에이전트 수동 설치

install.php 스크립트가 정상 동작 하지 않을 경우 다음을 통해 설치를 수동으로 진행한다.

1. 압출 파일을 해제 했을때 생성되는 agent.php 디렉토리를 PHP 에이전트 설치 디렉토리로 복사 한 후 해당 디렉토리로 이동한다.(동일하다면 이 과정은 무시해도 좋다)

$cp agent.php /home/jennifer/
$cd /home/jennifer/agent.php

2. 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

3. PHP의 Thread Safety를 확인한다.

$php -i | grep Thread
Thread Safety => disabled

4. 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 agent.php/bin/jennifer5-php-5.4.x-NTS.so
agent.php/bin/jennifer5-php-5.4.x-NTS.so

5. php.ini 파일에 PHP 에이전트 extension 파일의 절대 경로와 PHP 에이전트 설치 절대 경로를 추가한다.

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

6. jennifer.conf 에서 필수 설정을 한다.

에이전트 설정 필수 항목

항목

기본값

설명

server_address

127.0.0.1

데이터서버 IP Address

server_port

5000

데이터 서버 Port

domain_id

1000

도메인 ID, 유효값은 1 ~ 32767이다.

inst_id

-1

에이전트 인스턴스 ID '-1'이면 서버로 부터 자동으로 ID를 할당받게 된다. 유효값은 1 ~ 32767이다.

7. apache 또는 php-fpm을 재시작 한다.

jennifer.conf 파일 위치 지정

특정한 위치에 있는 jennifer.conf 파일을 사용하기 위해서는 php.ini에 jenniferAgent.agent_config_root 옵션으로 설정할 수 있다. 설정하지 않는 경우 기본 값으로는 jenniferAgent.agent_file_root 의 위치와 같다.

php.ini 파일에 jennifer.conf 가 있는 위치 지정

;jenniferAgent.agent_config_root 옵션으로 jennifer.conf 의 위치가 에이전트 설치 위치와 다른 경우 설정할 수 있다. 설정하지 않는 경우 jenniferAgent.agent_file_root 의 위치와 같다.
jenniferAgent.agent_config_root=/some/conf/root/path

PHP 에이전트 Master 프로세스를 별도로 실행하는 경우

CLI, CGI 환경처럼 마스터 프로세스를 별도로 실행하는 경우 Jennifer5Agent 실행시 -c 옵션으로 config 위치를 지정할 수 있다. 기본값은 agent 설치 위치이다.

/jennifer/agent.php/bin/./Jennifer5Agent -k start -c /some/conf/root/path

PHP 에이전트 제거

PHP 설정 파일(php.ini)의 jennifer 관련된 설정을 주석처리하거나 삭제한 후 apache 또는 php-fpm을 재시작 한다.

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

Red Hat 계열 Linux에서 SELINUX 구동시 PHP 에이전트 구동 법

Red Hat 계열 Linux(Red Hat, CentOS) 에서 SELINUX가 동작 중이라면 아래 방법 중 하나를 사용해야 한다.

SELINUX를 permissive 방식으로 변경

다음 명령을 통해 SELINUX를 permissive 모드로 사용하면 PHP 에이전트가 정상적으로 실행된다.

# setenforce 0

SELINUX 컨텍스트를 변경

이 방법을 사용할 경우 에이전트 설치 디렉토리가 /home의 하위 디렉토리여야 한다.

설치 패키지에 포함된 te 파일을 사용해 SELINUX 컨텍스트를 변경할 수 있다.

# yum install policycoreutils-python //policy utility를 설치한다. centos5의 경우 기본 설치되어 있다. 
# chmod +x selinux_enable.sh
# selinux_enable.sh centos_#.te //OS버전에 맞는 te파일을 실행한다. 예를 들어 centos 6 이나 Red Hat 6인 경우 selinux_enable.sh centos_6.te로 실행해야 한다.

문제 해결

설치 패키지에 포함된 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

설치 문제 해결

PHP 에이전트를 설치 한 후 Apache 또는 php-fpm을 재시작 했을때 PHP 에이전트 설치 디렉토리의 log 디렉토리에 로그 파일이 생성되야 한다. 만약 로그 파일이 생성되지 않았다면 PHP 엔진이 제니퍼 PHP 모듈을 정상 로드하지 못한 것으로, Apache 또는 php-fpm 로그를 확인해야 한다.

grep jennifer error.log //error.log는 Apache의 에러 로그 파일을 지칭한다.

PHP 5.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 경로로 이동 후 심볼릭 파일 링크 생성

cd /usr/local/lib/php/extensions/no-debug-non-zts-20060613
ln -s /home/jennifer/agent.php/bin/jennifer5-php-5.2.x-NTS.so jennifer5-php-5.2.x-NTS.so
ln -s /home/jennifer/agent.php/bin/Jennifer5Agent Jennifer5Agent 
ln -s /home/jennifer/agent.php/bin/libJennifer5Common.so libJennifer5Common.so

php.ini 에 지정된 Jennifer Agent Extension 경로를 다음과 같이 수정

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

No such file or directory

PHP Warning:  PHP Startup: Unable to load dynamic library '/home/jennifer5/agent.php/bin/jennifer5-php-5.5.x-ZTS.so' - /home/jennifer5/agent.php/bin/jennifer5-php-5.5.x-ZTS.so: cannot open shared object file: No such file or directory in Unknown on line 0

php.ini에 제니퍼 설치 경로가 잘못 지정된 경우 이 문제가 발생한다. php.ini의 extension과 jenniferAgent.agent_file_root 옵션 지정 값을 확인해야 한다.

undefined symbol

PHP Warning:  PHP Startup: Unable to load dynamic library '/home/jennifer5/agent.php/bin/jennifer5-php-5.3.x-NTS.so' - /home/jennifer5/agent.php/bin/jennifer5-php-5.3.x-NTS.so: undefined symbol: output_globals in Unknown on line 0

PHP 버전, 또는 PHP Thread Safety 환경에 일치하지 않는 jennifer extension 모듈이 지정되었을때 이 로그를 확인할 수 있다. php.ini 의 extension=.../jennifer5-php-5...-NTS.so를 PHP 환경에 맞는 파일로 지정해야 한다. 예를 들어 Thread Safety 모드로 동작하는 PHP 5.5.8 버전 이라면 jennifer5-php-5.5.x-ZTS.so를 지정해야 한다.

phpinfo() 함수 실행 결과로 Thread Safety를 확인할 수 있다

Wrong ELF class

Warning: PHP Startup: Unable to load dynamic library '/home/jennifer5/agent.php/bin/jennifer5-php-5.3.x-NTS.so' - /home/jennifer5/agent.php/bin/jennifer5-php-5.3.x-NTS.so: wrong ELF class: ELFCLASS64 in Unknown on line 0

32bit 머신에 64bit PHP 에이전트를 설치 했거나, 64bit 머신에 32bit PHP 에이전트를 설치 했을 때 위와 같은 로그(wrong ELF class)를 확인할 수 있다. 64bit 머신에 32bit로 빌드된 Apache, php-fpm을 사용할 경우에도 위와 같은 로그를 확인할 수 있는데, 이 경우는 64bit 머신이라도 32bit PHP 에이전트를 설치해야 한다.

version 'GCC_4.2.0' not found

Warning: PHP Startup: Unable to load dynamic library '/home/jennifer5/agent.php/bin/jennifer5-php-5.3.x-NTS.so' - /lib/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /home/jennifer5/agent.php/bin/libJennifer5Common.so) in Unknown on line 0

Apache, php-fpm이 참조하는 libgcc_s.so.1 버전이 GCC_4.2.0을 지원하지 않는 경우에 이 로그를 확인할 수 있다. libgcc_s.so.1을 업데이트 해야 하며, 업데이트 불가시 PHP 에이전트를 구동할 수 없다.(라이브러리 의존성 참고)