本篇介紹如何在 Nginx 與 PHP-FPM 的網頁伺服器的架構下,啟用 PHP-FPM 服務的狀態監控網頁,讓管理者查 PHP-FPM 服務內部即時的狀況。

Nginx 網頁伺服器通常都會搭配 PHP-FPM 來處理 PHP 的網頁,Nginx 內部的狀態可以透過 Nginx 內建的 stub_status 模組來即時監控,而 PHP-FPM 也有類似的監控功能,以下是設定與使用教學。

啟用 PHP-FPM 即時監控功能

PHP-FPM 的監控功能可以透過修改 PHP-FPM 的設定檔來啟用。在 CentOS Linux 中,PHP 5 的 PHP-FPM 設定檔案放在 /etc/php5/fpm/pool.d/www.conf,而 PHP 7 的 PHP-FPM 設定檔則是放在 /etc/opt/rh/rh-php71/php-fpm.d/www.conf,設定檔的實際位置也會跟安裝的方式有關,如果您系統上的 PHP-FPM 的設定檔位置不同,就自己尋找一下類似的路徑。

PHP-FPM 狀態報表功能

打開 PHP-FPM 的設定檔後,尋找 pm.status_path 這個設定值,若用 vim 編輯器的話,可以使用以下指令打開 www.conf 並自動搜尋 pm.status_path 這個關鍵字的位置:

vim +/pm.status_path www.conf

pm.status_path 的作用是設定 FPM 狀態的網址(URI),在預設的狀況下,這個值應該是沒有被設定的(代表停用此功能)。若要啟用這個功能,就把這個值設定成一個自己取的網址即可,例如:

pm.status_path = /php_fpm_status

這樣的話就可以啟用此功能,並且透過 /php_fpm_status 這個路徑來查看 PHP-FPM 的狀況。

Ping 功能

PHP-FPM 的 ping 功能就類似一般網路診斷上常用的 ping 指令,可用來檢查 PHP-FPM 服務是否維持正常運作,所以如果要監控 PHP-FPM 服務是否正常的話,建議也可以一併開啟這個功能。

PHP-FPM 的 ping 功能可透過 ping.path 這個設定來啟用,它跟 pm.status_path 類似,也是指定一個自訂的網址即可啟用:

ping.path = /php_fpm_ping

在預設的情況下,當我們瀏覽 ping.path 所指定的網址時,它會回應 pong 這個文字,如果要改變回應文字的內容,可用 ping.response 來自訂文字:

ping.response = hello

這樣設定的話,瀏覽 /php_fpm_ping 時就會回應 hello

重新啟動 PHP-FPM 服務

修改好 PHP-FPM 設定檔之後,記得重新啟動 PHP-FPM 服務,讓新設定生效:

# PHP 5
sudo systemctl restart php-fpm
# PHP 7
sudo systemctl restart rh-php71-php-fpm

隨後檢查 PHP-FPM 是否正常啟動:

# PHP 5
sudo systemctl status php-fpm
# PHP 7
sudo systemctl status rh-php71-php-fpm

修改 Nginx 設定檔

在 PHP-FPM 設定檔中啟用了 PHP-FPM 狀態報表與 ping 功能之後,接著就要在 Nginx 這邊也進行對應的設定,讓 Nginx 遇到 /php_fpm_status/php_fpm_ping 這兩個特殊的網址時,可以直接導給 PHP-FPM 來處理。

開啟 Nginx 的網站設定檔,在 server 的設定區塊加入 PHP-FPM 監控網址的設定:

server {

  # [略]

  # 加入 PHP-FPM 監控網址設定
  location ~ ^/(php_fpm_status|php_fpm_ping)$ {
    # 設定帳號與密碼
    auth_basic "Closed Site";
    auth_basic_user_file path/to/htpasswd;
	
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

通常系統的狀態資訊不會開放給一般訪客觀看,所以這裡我們使用帳號與密碼的方式,把這兩個網址鎖起來,只讓管理者有權限查看 PHP-FPM 的狀態。

除了這個帳號與密碼的方式之外,我們也可以透過限制 IP 位址的作法,只讓自己的電腦可以查看 PHP-FPM 狀態網頁,詳細設定方式請參考 Nginx 設定密碼認證與限制可存取的 IP 位址教學

重新啟動 Nginx 服務

修改好 Nginx 設定檔之後,重新啟動 Nginx 服務,讓新設定生效:

sudo systemctl restart nginx

檢查是否正常啟動:

sudo systemctl status nginx

查看 PHP-FPM 服務即時狀態

假設我們的網站網址為 https://sun.gtwang.org/,則 PHP-FPM 狀態監控的完整網址就會是:

https://sun.gtwang.org/php_fpm_status

打開 PHP-FPM 狀態監控的網址後,就可以看到類似這樣的文字報表:

PHP-FPM 服務即時狀態

各欄位的意義如下:

欄位 說明
pool pool 名稱,通常是 www
process manager staticdynamicondemand
start time FPM 啟動的時間點。若重新載入(reload)也會改變這個時間
start since FPM 啟動後所經過的秒數。
accepted conn 已接收到的連線數量。
listen queue 目前正在等待處理的連線數量,若這個值不是 0,就代表 FPM 的行程數量可能不夠,要考慮增加行程數量。
max listen queue FPM 啟動後,等待處理連線數量的最大紀錄。
listen queue len 等待處理連線佇列的長度。
idle processes 閒置的 FPM 行程數量。
active processes 工作中的 FPM 行程數量。
total processes 所有的 FPM 行程數量。
max active processes FPM 啟動後,工作中 FPM 行程數量的最大紀錄。
max children reached FPM 啟動後,FPM 行程達到上限值的次數,若這個值不是 0,代表 PHP-FPM 的上限值設定太低,要考慮增加上限值。
slow requests 處理過慢的連線數,若這個值不是 0,代表某些 PHP 程式的處理速度太慢,最常見的因素就是 MySQL 資料庫查詢過慢。

若要查看更詳細的資訊,可以在網址後方加上 ?full 參數:

https://sun.gtwang.org/php_fpm_status?full

這樣就可以顯示各 FPM 行程資訊:

各 FPM 行程資訊

以下是各個 FPM 行程資訊欄位的意義:

欄位 說明
pid FPM 的行程 ID。
state 行程狀態,Idle 代表閒置,Running 代表工作中。
start time 行程啟動的時間點。
start since 行程啟動後所經過的秒數。
requests 處理過的連線數。
request duration 連線時間(µs)。
request method 連線方式(GETPOST 等)。
request URI 連線的網址。
content length POST 的資料長度。
user 認證的使用者名稱(PHP_AUTH_USER)。
script 主要執行的 PHP 指令稿。
last request cpu 上一個連線所耗費的 CPU 百分比(只有閒置的行程才會顯示)。
last request memory 上一個連線所耗費的最大記憶體(只有閒置的行程才會顯示)。

如果想要使用程式來讀取這些資訊,可以加上一些參數,以不同的格式取得資料:

https://sun.gtwang.org/php_fpm_status?json
https://sun.gtwang.org/php_fpm_status?html
https://sun.gtwang.org/php_fpm_status?xml

詳細的資訊也可以用不同的格式表示:

https://sun.gtwang.org/php_fpm_status?full&json
https://sun.gtwang.org/php_fpm_status?full&html
https://sun.gtwang.org/php_fpm_status?full&xml

Ping 功能網址

ping 功能的網址就是基本的網址加上我們設定的路徑 /php_fpm_ping

https://sun.gtwang.org/php_fpm_ping

這個網頁就只是傳固定的文字訊息而已,讓管理者(或是監控程式)確認 PHP-FPM 有正常運作。

PHP-FPM 的 Ping 功能網址

參考資料:EasyEngine