# PHP-FPM by HTTP ## Overview For Zabbix version: 6.2 and higher The template to monitor PHP-FPM by Zabbix that work without any external scripts. Most of the metrics are collected in one go, thanks to Zabbix bulk data collection. Template `PHP-FPM by HTTP` collects metrics by polling PHP-FPM status-page with HTTP agent remotely. Note that this solution supports https and redirects. This template was tested on: - PHP, version 7 ## Setup > See [Zabbix template operation](https://www.zabbix.com/documentation/6.2/manual/config/templates_out_of_the_box/http) for basic instructions. 1. Open the php-fpm configuration file and enable the status page as shown. ``` pm.status_path = /status ping.path = /ping ``` 2. Validate the syntax is fine before we reload the service ``` $ php-fpm7 -t ``` 3. Reload the php-fpm service to make the change active ``` $ systemctl reload php-fpm ``` 4. Next, edit your Nginx server block (virtual host) configuration file and add the location block below in it. ``` # Enable php-fpm status page location ~ ^/(status|ping)$ { ## disable access logging for request if you prefer access_log off; ## Only allow trusted IPs for security, deny everyone else # allow 127.0.0.1; # allow 1.2.3.4; # your IP here # deny all; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_index index.php; include fastcgi_params; ## Now the port or socket of the php-fpm pool we want the status of fastcgi_pass 127.0.0.1:9000; # fastcgi_pass unix:/run/php-fpm/your_socket.sock; } ``` 5. Check the syntax ```$ nginx -t``` 6. Reload Nginx ```$ systemctl reload nginx``` 7. Verify ```curl -L 127.0.0.1/status``` If you use another location of status/ping page, don't forget to change {$PHP_FPM.STATUS.PAGE}/{$PHP_FPM.PING.PAGE} macro. If you use an atypical location for PHP-FPM status-page don't forget to change the macros {$PHP_FPM.SCHEME},{$PHP_FPM.PORT}. ## Zabbix configuration No specific Zabbix configuration is required. ### Macros used |Name|Description|Default| |----|-----------|-------| |{$PHP_FPM.HOST} |
Hostname or IP of PHP-FPM status host or container.
|`localhost` | |{$PHP_FPM.PING.PAGE} |The path of PHP-FPM ping page.
|`ping` | |{$PHP_FPM.PING.REPLY} |Expected reply to the ping.
|`pong` | |{$PHP_FPM.PORT} |The port of PHP-FPM status host or container.
|`80` | |{$PHP_FPM.QUEUE.WARN.MAX} |The maximum PHP-FPM queue usage percent for trigger expression.
|`80` | |{$PHP_FPM.SCHEME} |Request scheme which may be http or https
|`http` | |{$PHP_FPM.STATUS.PAGE} |The path of PHP-FPM status page.
|`status` | ## Template links There are no template links in this template. ## Discovery rules ## Items collected |Group|Name|Description|Type|Key and additional info| |-----|----|-----------|----|---------------------| |PHP-FPM |PHP-FPM: Ping |-
|DEPENDENT |php-fpm.ping**Preprocessing**:
- REGEX: `{$PHP_FPM.PING.REPLY}($|\n) 1`
⛔️ON_FAIL: `CUSTOM_VALUE -> 0`
| |PHP-FPM |PHP-FPM: Processes, active |The total number of active processes.
|DEPENDENT |php-fpm.processes_active**Preprocessing**:
- JSONPATH: `$.['active processes']`
| |PHP-FPM |PHP-FPM: Version |Current version PHP. Get from HTTP-Header "X-Powered-By" and may not work if you change default HTTP-headers.
|DEPENDENT |php-fpm.version**Preprocessing**:
- REGEX: `^[.\s\S]*X-Powered-By: PHP/([.\d]{1,}) \1`
⛔️ON_FAIL: `DISCARD_VALUE -> `
- DISCARD_UNCHANGED_HEARTBEAT: `3h`
| |PHP-FPM |PHP-FPM: Pool name |The name of current pool.
|DEPENDENT |php-fpm.name**Preprocessing**:
- JSONPATH: `$.pool`
- DISCARD_UNCHANGED_HEARTBEAT: `3h`
| |PHP-FPM |PHP-FPM: Uptime |How long has this pool been running.
|DEPENDENT |php-fpm.uptime**Preprocessing**:
- JSONPATH: `$.['start since']`
| |PHP-FPM |PHP-FPM: Start time |The time when this pool was started.
|DEPENDENT |php-fpm.start_time**Preprocessing**:
- JSONPATH: `$.['start time']`
| |PHP-FPM |PHP-FPM: Processes, total |The total number of server processes currently running.
|DEPENDENT |php-fpm.processes_total**Preprocessing**:
- JSONPATH: `$.['total processes']`
| |PHP-FPM |PHP-FPM: Processes, idle |The total number of idle processes.
|DEPENDENT |php-fpm.processes_idle**Preprocessing**:
- JSONPATH: `$.['idle processes']`
| |PHP-FPM |PHP-FPM: Process manager |The method used by the process manager to control the number of child processes for this pool.
|DEPENDENT |php-fpm.process_manager**Preprocessing**:
- JSONPATH: `$.['process manager']`
- DISCARD_UNCHANGED_HEARTBEAT: `3h`
| |PHP-FPM |PHP-FPM: Processes, max active |The highest value that 'active processes' has reached since the php-fpm server started.
|DEPENDENT |php-fpm.processes_max_active**Preprocessing**:
- JSONPATH: `$.['max active processes']`
| |PHP-FPM |PHP-FPM: Accepted connections per second |The number of accepted requests per second.
|DEPENDENT |php-fpm.conn_accepted.rate**Preprocessing**:
- JSONPATH: `$.['accepted conn']`
- CHANGE_PER_SECOND
| |PHP-FPM |PHP-FPM: Slow requests |The number of requests that exceeded your request_slowlog_timeout value.
|DEPENDENT |php-fpm.slow_requests**Preprocessing**:
- JSONPATH: `$.['slow requests']`
- SIMPLE_CHANGE
| |PHP-FPM |PHP-FPM: Listen queue |The current number of connections that have been initiated, but not yet accepted.
|DEPENDENT |php-fpm.listen_queue**Preprocessing**:
- JSONPATH: `$.['listen queue']`
| |PHP-FPM |PHP-FPM: Listen queue, max |The maximum number of requests in the queue of pending connections since this FPM pool has started.
|DEPENDENT |php-fpm.listen_queue_max**Preprocessing**:
- JSONPATH: `$.['max listen queue']`
| |PHP-FPM |PHP-FPM: Listen queue, len |Size of the socket queue of pending connections.
|DEPENDENT |php-fpm.listen_queue_len**Preprocessing**:
- JSONPATH: `$.['listen queue len']`
| |PHP-FPM |PHP-FPM: Queue usage |Queue utilization
|CALCULATED |php-fpm.listen_queue_usage**Expression**:
`last(//php-fpm.listen_queue)/(last(//php-fpm.listen_queue_len)+(last(//php-fpm.listen_queue_len)=0))*100` | |PHP-FPM |PHP-FPM: Max children reached |The number of times that pm.max_children has been reached since the php-fpm pool started
|DEPENDENT |php-fpm.max_children**Preprocessing**:
- JSONPATH: `$.['max children reached']`
- SIMPLE_CHANGE
| |Zabbix raw items |PHP-FPM: Get ping page |-
|HTTP_AGENT |php-fpm.get_ping | |Zabbix raw items |PHP-FPM: Get status page |-
|HTTP_AGENT |php-fpm.get_status | ## Triggers |Name|Description|Expression|Severity|Dependencies and additional info| |----|-----------|----|----|----| |PHP-FPM: Service is down |-
|`last(/PHP-FPM by HTTP/php-fpm.ping)=0 or nodata(/PHP-FPM by HTTP/php-fpm.ping,3m)=1` |HIGH |Manual close: YES
| |PHP-FPM: Version has changed |PHP-FPM version has changed. Ack to close.
|`last(/PHP-FPM by HTTP/php-fpm.version,#1)<>last(/PHP-FPM by HTTP/php-fpm.version,#2) and length(last(/PHP-FPM by HTTP/php-fpm.version))>0` |INFO |Manual close: YES
| |PHP-FPM: Failed to fetch info data |Zabbix has not received data for items for the last 30 minutes
|`nodata(/PHP-FPM by HTTP/php-fpm.uptime,30m)=1` |INFO |Manual close: YES
**Depends on**:
- PHP-FPM: Service is down
| |PHP-FPM: has been restarted |Uptime is less than 10 minutes
|`last(/PHP-FPM by HTTP/php-fpm.uptime)<10m` |INFO |Manual close: YES
| |PHP-FPM: Manager changed |PHP-FPM manager changed. Ack to close.
|`last(/PHP-FPM by HTTP/php-fpm.process_manager,#1)<>last(/PHP-FPM by HTTP/php-fpm.process_manager,#2)` |INFO |Manual close: YES
| |PHP-FPM: Detected slow requests |PHP-FPM detected slow request. A slow request means that it took more time to execute than expected (defined in the configuration of your pool).
|`min(/PHP-FPM by HTTP/php-fpm.slow_requests,#3)>0` |WARNING | | |PHP-FPM: Queue utilization is high |The queue for this pool reached {$PHP_FPM.QUEUE.WARN.MAX}% of its maximum capacity. Items in queue represent the current number of connections that have been initiated on this pool, but not yet accepted.
|`min(/PHP-FPM by HTTP/php-fpm.listen_queue_usage,15m) > {$PHP_FPM.QUEUE.WARN.MAX}` |WARNING | | ## Feedback Please report any issues with the template at https://support.zabbix.com