1. 程式人生 > >Linux學習總結(四十四)lnmp之php-fpm相關配置

Linux學習總結(四十四)lnmp之php-fpm相關配置

lnmp pool open_basedir error_log 慢執行日誌

1 php-fpm的進程pool

之前我們在nginx 配置文件裏加入了一句 include vhost/*.conf; 然後實現了各個虛擬主機的隔離,php-fpm 作為一個獨立的服務,有沒有類似的操作呢? 答案是肯定的。這裏我們介紹一個php-fpm的 進程pool概念。pool 在lnmp架構,是分配出來解析php的進程資源集合。php-fpm可以設置多個pool,在其中一個pool資源耗盡,會導致其他站點無法訪問資源,報502錯誤。有必要把站點進行分離,分別使用單獨的pool。我們可以在php-fpm.conf 中定義include,進而定義單獨的pool。具體過程如下:
vim /usr/local/php-fpm/etc/php-fpm.conf 更改內容如下

[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
include = etc/php-fpm.d/*.conf

cd /usr/local/php-fpm/etc/
mkdir php-fpm.d
cd php-fpm.d/
vim www.conf //寫入內容如下,添加第一個pool

[www]
listen = /tmp/www.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

保存後 再編輯另外的配置文件,再創建一個pool
vim test.conf

[test]
listen = /tmp/test.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

這樣有了兩個子配置文件,也就是創建了兩個pool了,兩個pool監聽了不同的socket,我們就可以在虛擬主機配置文件中給不同的虛擬主機定義不同的pool,從而達到互相隔離的目的。

測試下配置
/usr/local/php-fpm/sbin/php-fpm -t
重啟下服務
/etc/init.d/php-fpm restart
查看下/tmp/下的sock文件:
ls /tmp/*.sock
技術分享圖片
再來查看下進程
ps aux |grep php-fpm
發現出現了www和test 兩個pool

2php-fpm慢執行日誌

如果一個php網站可以訪問,就是訪問速度變慢了,我們如何進一步去查找原因呢?有沒有辦法追蹤到導致php解析變慢的細節,這裏就涉及到php-fpm的慢執行日誌。通過php-fpm的慢執行日誌,我們可以清晰的了解到php的腳本哪裏執行時間長,它可以定位到具體的代碼行。如何開啟和查看該日誌,具體操作如下:
vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
在最後面加入如下內容

request_slowlog_timeout = 1
slowlog = /usr/local/php-fpm/var/log/www-slow.log

第一行定義了超時時間,單位為秒,也就是當php腳本執行時間超過1秒就會記錄日誌
第二行定義該日誌的路徑和名稱
我們編寫一個php腳本測試

 vim /data/wwwroot/test.com/slow.php
<?php
echo "just a slow running test";
sleep (3);
?>
curl -x127.0.0.1:80 test.com/slow.php

發現光標停頓了幾秒才輸出了just a slow running test
我們去查看下慢執行日誌
cat /usr/local/php-fpm/var/log/www-slow.log
技術分享圖片

3open_basedir

之前在lamp中已經接觸到該概念。配置它的目的就是為了網站安全。httpd可以針對每個虛擬主機設置一個open_basedir,php-fpm同樣也可以針對不同的pool設置不同的open_basedir

vim /usr/local/php-fpm/etc/php-fpm.d/test.conf  //在最後面加入
php_admin_value[open_basedir] = /data/wwwroot/test.com:/tmp/

4php-fpm 錯誤日誌

在lamp中我們給php單獨定義過錯誤日誌,我們在/usr/local/php-fpm/etc/php.ini中關閉錯誤信息的頁面顯示,定義錯誤日誌路徑和名稱,定義日誌級別。因為該配置文件與lamp中配置文件相同,都來源於php源碼包中的php.ini-production文件,所以各配置與之前的相同。這裏不再贅述。

5php-fpm 進程管理

下面我們介紹下php-fpm.conf中一段配置的含義

 pm = dynamic  //動態進程管理,也可以是static,靜態一次性啟動最大子進程數,不會變化。
 pm.max_children = 50 //最大子進程數,ps aux可以查看
 pm.start_servers = 20 //啟動服務時會啟動的進程數
 pm.min_spare_servers = 5 //定義在空閑時段,子進程數的最少數量,如果達到這個數值時,php-fpm服務會自動派生新的子進程。
 pm.max_spare_servers = 35 //定義在空閑時段,子進程數的最大值,如果高於這個數值就開始清理空閑的子進程。
 pm.max_requests = 500  //定義一個子進程最多處理的請求數,也就是說在一個php-fpm的子進程最多可以處理這麽多請求,當達到這個數值時,它會自動退出。

Linux學習總結(四十四)lnmp之php-fpm相關配置