本篇介紹如何在 Nginx 與 PHP-FPM 的網頁伺服器的架構下,啟用 PHP-FPM 服務的狀態監控網頁,讓管理者查 PHP-FPM 服務內部即時的狀況。
Nginx 網頁伺服器通常都會搭配 PHP-FPM 來處理 PHP 的網頁,Nginx 內部的狀態可以透過 Nginx 內建的 stub_status 模組來即時監控,而 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 的設定檔後,尋找 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 的狀況。
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 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
在 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 服務,讓新設定生效:
sudo systemctl restart nginx
檢查是否正常啟動:
sudo systemctl status nginx
假設我們的網站網址為 https://sun.gtwang.org/
,則 PHP-FPM 狀態監控的完整網址就會是:
https://sun.gtwang.org/php_fpm_status
打開 PHP-FPM 狀態監控的網址後,就可以看到類似這樣的文字報表:
各欄位的意義如下:
欄位 | 說明 |
---|---|
pool | pool 名稱,通常是 www 。 |
process manager | static 、dynamic 或 ondemand |
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 行程資訊欄位的意義:
欄位 | 說明 |
---|---|
pid | FPM 的行程 ID。 |
state | 行程狀態,Idle 代表閒置,Running 代表工作中。 |
start time | 行程啟動的時間點。 |
start since | 行程啟動後所經過的秒數。 |
requests | 處理過的連線數。 |
request duration | 連線時間(µs)。 |
request method | 連線方式(GET 、POST 等)。 |
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 功能的網址就是基本的網址加上我們設定的路徑 /php_fpm_ping
:
https://sun.gtwang.org/php_fpm_ping
這個網頁就只是傳固定的文字訊息而已,讓管理者(或是監控程式)確認 PHP-FPM 有正常運作。
參考資料:EasyEngine、Tecmint