From eba3d1782513143025a1ebdd09876572a0804b04 Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Tue, 26 Nov 2019 18:12:58 +0300 Subject: [PATCH 01/13] [add] stale bot ignores bug labels --- .github/stale.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/stale.yml b/.github/stale.yml index 542d219..2c5772c 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -6,6 +6,7 @@ daysUntilClose: 14 exemptLabels: - pinned - security + - bug # Label to use when marking an issue as stale staleLabel: wontfix # Comment to post when marking an issue as stale. Set to `false` to disable From 573c9b31238a13e9774f2bda92574f25c1d21bfc Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Tue, 26 Nov 2019 18:15:39 +0300 Subject: [PATCH 02/13] [fix] better alias safe executables detection in addition to #6 --- zabbix/zabbix_php_fpm_status.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zabbix/zabbix_php_fpm_status.sh b/zabbix/zabbix_php_fpm_status.sh index 590f0aa..8fe72d8 100644 --- a/zabbix/zabbix_php_fpm_status.sh +++ b/zabbix/zabbix_php_fpm_status.sh @@ -2,8 +2,8 @@ #Ramil Valitov ramilvalitov@gmail.com #https://github.com/rvalitov/zabbix-php-fpm -S_FCGI=`which cgi-fcgi` -S_GREP=`which grep` +S_FCGI=`type -P cgi-fcgi` +S_GREP=`type -P grep` if [[ ! -f $S_FCGI ]]; then echo "Utility 'cgi-fcgi' not found. Please, install it first." From a35cb432b9ca7651cb973c3b3a1e89ae1ef0b82c Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Tue, 26 Nov 2019 18:26:21 +0300 Subject: [PATCH 03/13] [add] info how to use this script --- zabbix/zabbix_php_fpm_status.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/zabbix/zabbix_php_fpm_status.sh b/zabbix/zabbix_php_fpm_status.sh index 8fe72d8..44dd877 100644 --- a/zabbix/zabbix_php_fpm_status.sh +++ b/zabbix/zabbix_php_fpm_status.sh @@ -18,9 +18,10 @@ fi if [[ -z $1 ]] || [[ -z $2 ]]; then echo "No input data specified" - echo "Usage: $0 socket status" + echo "Usage: $0 php-path status" echo "where:" - echo "socket - path to socket file, for example, /var/lib/php7.3-fpm/web1.sock" + echo "php-path - path to socket file, for example, /var/lib/php7.3-fpm/web1.sock" + echo "or IP and port of the PHP-FPM, for example, 127.0.0.1:9000" echo "status - path configured in pm.status of PHP-FPM" exit 1 fi From 04243442fd15f75499c2ad29ef4de6ec8060c770 Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Tue, 26 Nov 2019 18:26:39 +0300 Subject: [PATCH 04/13] [del] remove debug file output --- zabbix/zabbix_php_fpm_status.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/zabbix/zabbix_php_fpm_status.sh b/zabbix/zabbix_php_fpm_status.sh index 44dd877..7837398 100644 --- a/zabbix/zabbix_php_fpm_status.sh +++ b/zabbix/zabbix_php_fpm_status.sh @@ -28,7 +28,6 @@ fi POOL_URL=$1 POOL_PATH=$2 -echo "$POOL_URL $POOL_PATH" > /tmp/test.txt #connecting to socket or address, https://easyengine.io/tutorials/php/directly-connect-php-fpm/ PHP_STATUS=`SCRIPT_NAME=$POOL_PATH \ SCRIPT_FILENAME=$POOL_PATH \ From 06783125639adcf8f8cfbb88a0060af32ebce646 Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Tue, 26 Nov 2019 19:07:54 +0300 Subject: [PATCH 05/13] [add, fix] detection of PHP-FPM pools spawned in TCP mode, fixes #8 --- zabbix/zabbix_php_fpm_discovery.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/zabbix/zabbix_php_fpm_discovery.sh b/zabbix/zabbix_php_fpm_discovery.sh index cbed091..d6956d8 100644 --- a/zabbix/zabbix_php_fpm_discovery.sh +++ b/zabbix/zabbix_php_fpm_discovery.sh @@ -47,7 +47,12 @@ while IFS= read -r line do POOL_PID=`printf '%s\n' "${PS_LIST[@]}" | $S_GREP "php-fpm: pool $line" | $S_HEAD -1 | $S_AWK '{print $1}'` if [[ ! -z $POOL_PID ]]; then - POOL_SOCKET=`$S_LSOF -p $POOL_PID 2>/dev/null | $S_GREP unix | $S_HEAD -1 | $S_AWK '{ print $(NF-1)}'` + #We search for socket or IP address and port + #Socket example: + #php-fpm7. 25897 root 9u unix 0x000000006509e31f 0t0 58381847 /run/php/php7.3-fpm.sock type=STREAM + #IP example: + #php-fpm7. 1110 defualt 0u IPv4 15760 0t0 TCP localhost:8002 (LISTEN) + POOL_SOCKET=`$S_LSOF -p $POOL_PID 2>/dev/null | $S_GREP -e unix -e TCP | $S_HEAD -1 | $S_AWK '{ print $(NF-1)}'` if [[ ! -z $POOL_SOCKET ]]; then if [[ $POOL_FIRST == 1 ]]; then echo -n "," From fbcbf39d2a7a00eec835279c652822269c67192c Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Tue, 26 Nov 2019 19:21:21 +0300 Subject: [PATCH 06/13] [add] import error details screenshot --- media/zabbix-import-error.jpg | Bin 0 -> 37262 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 media/zabbix-import-error.jpg diff --git a/media/zabbix-import-error.jpg b/media/zabbix-import-error.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72adf57d2b477de59b3d9ef83057e53a42744630 GIT binary patch literal 37262 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 literal 0 HcmV?d00001 From 5f17630c0f3adbeac5296aad64554d5432d57ac4 Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Tue, 26 Nov 2019 19:24:29 +0300 Subject: [PATCH 07/13] [add] example of IP and port combination in script PHP-FPM pools detection output --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0cce5e0..de866d6 100644 --- a/README.md +++ b/README.md @@ -277,7 +277,7 @@ The output should be a valid JSON with a list of pools and their sockets, someth }, { "{#POOLNAME}":"www", - "{#POOLSOCKET}":"/run/php/php7.3-fpm.sock" + "{#POOLSOCKET}":"127.0.0.1:9000" } ] } From 5623e2e38a992537bd028b3f5c263dd7fe3f8ed6 Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Tue, 26 Nov 2019 19:24:53 +0300 Subject: [PATCH 08/13] [add] how to troubleshoot template import failure --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index de866d6..adf9b4f 100644 --- a/README.md +++ b/README.md @@ -301,6 +301,13 @@ ps aux | grep "php-fpm" In the list you should see your pool. If it's not there, then it means it's not running (not functional). +## How to troubleshoot template import failure +To view the import errors, please click the "Details" section in the Zabbix GUI. It should be on the same import page near the error message: + +![Zabbix template import error details](https://github.com/rvalitov/zabbix-php-fpm/raw/master/media/zabbix-import-error.jpg) + +Then check the Zabbix server log, for Debian/Ubuntu it's located at `/var/log/zabbix/zabbix_server.log`. + # Compatibility Tested with: - PHP 7.3 From 80401be1f278e86c32de33e96badb5c5b3737301 Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Tue, 26 Nov 2019 22:36:21 +0300 Subject: [PATCH 09/13] [add] more details about cgi-fcgi package installation in Debian --- README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index adf9b4f..737bb78 100644 --- a/README.md +++ b/README.md @@ -104,14 +104,25 @@ Perform the following operations on all servers with Zabbix and PHP-FPM from whi #### 1.1. Install Prerequisites Install required packages. -For `apt-get` based environments (Debian, Ubuntu, etc.): +##### For `apt-get` based environments (Debian, Ubuntu, etc.): ```bash apt-get update apt-get -y install grep gawk lsof jq libfcgi0ldbl ``` +Additionally, for Debian Jessie 8.x and earlier (or for equivalent Ubuntu version): -For `yum` based environments (CentOS): +```bash +apt-get -y install libfcgi0ldbl +``` + +Additionally, for Debian Stretch 9.x and later (or for equivalent Ubuntu version): + +```bash +apt-get -y install libfcgi-bin +``` + +##### For `yum` based environments (CentOS): ```bash yum check-update From fc5b1d583cd8f598b7b3a0b6e13b1d0de2d85d24 Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Thu, 28 Nov 2019 12:13:04 +0300 Subject: [PATCH 10/13] [add] method how to grant previliges without root #7 --- README.md | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 737bb78..260b036 100644 --- a/README.md +++ b/README.md @@ -157,8 +157,13 @@ chmod +x /etc/zabbix/zabbix_php_fpm_discovery.sh chmod +x /etc/zabbix/zabbix_php_fpm_status.sh ``` -#### 1.3. Allow root for Zabbix Agent -Automatic detection of sockets used by pools requires root previliges. Edit Zabbix agent configuration file `/etc/zabbix/zabbix_agentd.conf`, find `AllowRoot` option and enable it: +#### 1.3. Root previliges +Automatic detection of pools requires root previliges. You can achieve it using one of the methods below. + +##### 1.3.1 Root previliges for Zabbix Agent +This method sets root previliges for Zabbix Agent, i.e. the Zabbix Agent will run under `root` user, as a result all user scripts will also have the root access rights. + +Edit Zabbix agent configuration file `/etc/zabbix/zabbix_agentd.conf`, find `AllowRoot` option and enable it: ``` ### Option: AllowRoot @@ -172,7 +177,28 @@ Automatic detection of sockets used by pools requires root previliges. Edit Zabb # Default: # AllowRoot=0 AllowRoot=1 -``` +``` + +##### 1.3.2 Grant previliges to the PHP-FPM autodiscovery script only +If you don't want to run Zabbix Agent as root, then you can configure the previliges only to our script. In this case you need to have `sudo` installed: + +```console +apt-get install sudo +``` + +Now edit the `/etc/sudoers` file by running command: + +```console +visudo +``` + +Add the following line to this file: + +``` +zabbix ALL = NOPASSWD: /etc/zabbix/zabbix_php_fpm_discovery.sh +``` + +Here we specified `zabbix` as the user under which the Zabbix Agent is run. This is the default name, but if you have a custom installation with different name, then please, change it accordingly. Save and exit the editor. Your modifications will be applied. #### 1.4. Linux Tuning (optional) Usually PHP-FPM [backlog option](https://www.php.net/manual/en/install.fpm.configuration.php#listen-backlog) is limited by Linux kernel settings and equals to `128` by default. From e6b19fc9400a8df5ebfd731a09fd38e300a2e1ea Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Thu, 28 Nov 2019 12:14:09 +0300 Subject: [PATCH 11/13] [fix] correct grep of pool name #10 --- zabbix/zabbix_php_fpm_discovery.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zabbix/zabbix_php_fpm_discovery.sh b/zabbix/zabbix_php_fpm_discovery.sh index d6956d8..9489b2f 100644 --- a/zabbix/zabbix_php_fpm_discovery.sh +++ b/zabbix/zabbix_php_fpm_discovery.sh @@ -45,7 +45,7 @@ POOL_FIRST=0 echo -n "{\"data\":[" while IFS= read -r line do - POOL_PID=`printf '%s\n' "${PS_LIST[@]}" | $S_GREP "php-fpm: pool $line" | $S_HEAD -1 | $S_AWK '{print $1}'` + POOL_PID=`printf '%s\n' "${PS_LIST[@]}" | $S_GREP "php-fpm: pool $line$" | $S_HEAD -1 | $S_AWK '{print $1}'` if [[ ! -z $POOL_PID ]]; then #We search for socket or IP address and port #Socket example: From 799f76ec1a9ec8e2cb06b98b231a60b736bc1e22 Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Thu, 28 Nov 2019 12:41:32 +0300 Subject: [PATCH 12/13] [add] info how to use zabbix_get for troubleshooting --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 260b036..717dac9 100644 --- a/README.md +++ b/README.md @@ -345,6 +345,22 @@ To view the import errors, please click the "Details" section in the Zabbix GUI. Then check the Zabbix server log, for Debian/Ubuntu it's located at `/var/log/zabbix/zabbix_server.log`. +## Test with `zabbix_get` +Please, use the [`zabbix_get`](https://www.zabbix.com/documentation/4.4/manual/concepts/get) utility from your Zabbix Server to test that you can get the data from the Zabbix Agent (host): + +```console +zabbix_get -s 127.0.0.1 -p 10050 -k php-fpm.discover +zabbix_get -s 127.0.0.1 -p 10050 -k php-fpm.discover.status[POOL_URL,POOL_PATH] +``` +In the above example we use the following values: + +- `127.0.0.1` is the IP address of the host where the Zabbix Agent is installed and where the PHP-FPM is running +- `10050` is the port of the Zabbix Agent +- `POOL_URL` is the socket of the pool or IP and port combination, example: `/var/lib/php7.3-fpm/web1.sock` or `127.0.0.1:9000` +- `POOL_PATH` is the status path of PHP-FPM that you set in [`pm.status_path`](https://github.com/rvalitov/zabbix-php-fpm#16-adjust-php-fpm-pools-configuration), the default value is `/php-fpm-status`. + +The commands above should return valid JSON data. If any error happens then it will be displayed. + # Compatibility Tested with: - PHP 7.3 From c3bec2e0005208cd36b7f42737c0543c48d301ee Mon Sep 17 00:00:00 2001 From: Ramil Valitov Date: Fri, 29 Nov 2019 14:57:53 +0300 Subject: [PATCH 13/13] [add] one more step how to grant previliges without root #7 --- README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 717dac9..b0cf219 100644 --- a/README.md +++ b/README.md @@ -198,7 +198,21 @@ Add the following line to this file: zabbix ALL = NOPASSWD: /etc/zabbix/zabbix_php_fpm_discovery.sh ``` -Here we specified `zabbix` as the user under which the Zabbix Agent is run. This is the default name, but if you have a custom installation with different name, then please, change it accordingly. Save and exit the editor. Your modifications will be applied. +Here we specified `zabbix` as the user under which the Zabbix Agent is run. This is the default name, but if you have a custom installation with different name, then please, change it accordingly. Save and exit the editor. Your modifications will be applied. + +Now edit the file `userparameter_php_fpm.conf`. Find the line: + +``` +UserParameter=php-fpm.discover,/etc/zabbix/zabbix_php_fpm_discovery.sh +``` + +Add `sudo` there, so the line should be: + +``` +UserParameter=php-fpm.discover,sudo /etc/zabbix/zabbix_php_fpm_discovery.sh +``` + +That's all. #### 1.4. Linux Tuning (optional) Usually PHP-FPM [backlog option](https://www.php.net/manual/en/install.fpm.configuration.php#listen-backlog) is limited by Linux kernel settings and equals to `128` by default.