1. 程式人生 > >2018.3.19 13周1次課

2018.3.19 13周1次課

Linux學習

十三周一次課(3月19日)

12.21 php-fpm的pool

12.22 php-fpm慢執行日誌

12.23 open_basedir

12.24 php-fpm進程管理

12.21 php-fpm的pool

和LAMP不同的是,在LNMP架構中,php-fpm作為獨立的一個服務存在。既然是獨立服務,那麽它必然於自己的配置文件。Php-fpm的配置文件是/usr/local/php/etc/php-fpm.conf,它同樣也支持include語句。類似於nginx.conf裏面的include

Nginx可以配置多個虛擬主機,php-fpm同樣也支持配置多個pool,每一個pool可以監聽一個端口,也可以監聽一個socket。

cat /usr/local/php-fpm/etc/php-fpm.conf //可以看到只有一個www的pool

技術分享圖片

可以在配置文件php-fpm.conf裏繼續增加pool

[aming.com]

listen = /tmp/aming.sock

#listen = 127.0.0.1:9000

listen.mode = 666

user = php-fpm

group = php-fpm

pm = dynamic

pm.max_children = 50 //最大50個進程

pm.start_servers = 20

pm.min_spare_servers = 5

pm.max_spare_servers = 35

pm.max_requests = 500

rlimit_files = 1024

-t && reload

/usr/local/php-fpm/sbin/php-fpm –t

service php-fpm reload

ps aux |grep php-fpm //可以看到右邊多了aming.com的pool

技術分享圖片

怎麽使用:

cd /usr/local/nginx/conf/vhost

技術分享圖片

定義aaa.com.conf:vim aaa.com.conf //增加如下內

location ~ \.php$

{

include fastcgi_params;

fastcgi_pass unix:/tmp/aming.sock; //定義aming.sock

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;

}

技術分享圖片

這樣設置後當www的pool用完後,不會影響到aming.com的pool

設置多個子配置文件:

vim /usr/local/php-fpm/etc/php-fpm.conf //在[global]部分增加

include = etc/php-fpm.d/*.conf

技術分享圖片

刪除剩下的2個pool設置

mkdir /usr/local/php-fpm/etc/php-fpm.d/ //創建php-fpm.d目錄

cd php-fpm.d

分別創建www.conf和 aming.conf

技術分享圖片

技術分享圖片

檢查配置文件:/usr/local/php-fpm/sbin/php-fpm -t

技術分享圖片

重啟:service php-fpm restart

技術分享圖片

效果跟寫在主配置文件裏是一樣的

技術分享圖片

這樣就有兩個子配置文件,也就是說有兩個pool了,第一個pool監聽了/tmp/php-fcgi.sock,第二個pool 監聽了/tmp/aming.sock這樣,就可以在Nginx不同的虛擬主機中調用不同的pool,從而達到相互隔離的目的,兩個pool互不影響。

12.22 php-fpm慢執行日誌

Php-fpm的慢執行日誌用得非常多,它可以幫助你快速地追蹤到問題點。

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

/usr/local/php-fpm/sbin/php-fpm –t

service php-fpm restart

技術分享圖片

查看日誌文件是否生成:ls /usr/local/php-fpm/var/log/

技術分享圖片

模擬php腳本:

vim /data/wwwroot/test.com/sleep.php //寫入如下內容

<?php

echo "test slow log";

sleep(2);

echo "done";

?>

執行:curl -x 127.0.0.1:80 test.com/sleep.php

技術分享圖片

出現錯誤,排查

打開配置文件:vi /usr/local/php-fpm/etc/php.ini

display_errors = On //查找display_errors,找到後修改參數為On,這樣能在瀏覽器中看到具體的錯誤信息。默認是關閉的,不能讓別人通過瀏覽器看到你的錯誤信息,而是要把錯誤信息記錄到服務器的某個文件裏

技術分享圖片

再次執行sleep.php,顯示錯誤,修改sleep.php文件

技術分享圖片

技術分享圖片

cat /usr/local/php-fpm/var/log/www-slow.log //查看日誌文件

[17-Mar-2018 14:17:48] [pool www] pid 2608

script_filename = /data/wwwroot/test.com/sleep.php //腳本路徑和名字

[0x00007f3cce4002e0] sleep() /data/wwwroot/test.com/sleep.php:3 //腳本的第3行慢

12.23 open_basedir

在前面據講述過open_basedir的概念,它的目的就是安全。Httpd可以針對每個虛擬主機設置一個open_basedir,php-fpm同樣也可以針對不同的pool設置不同的open_basedir

vim /usr/local/php-fpm/etc/php-fpm.d/www.conf //加入如下內容

php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/

重啟:service php-fpm restart

再次執行:curl -x 127.0.0.1:80 test.com/3.php //正常了

技術分享圖片

配置錯誤日誌

修改配置文件:vi /usr/local/php-fpm/etc/php.ini

display_errors = Off //改回off

技術分享圖片

error_log = /usr/local/php-fpm/var/log/php_errors.log //定義error_log路徑和文件名

技術分享圖片

error_reporting = E_ALL //定義日誌級別:所有

技術分享圖片

修改www.conf文件一個錯誤的地址:vim www.conf

php_admin_value[open_basedir]=/data/wwwroot/wwtest.com:/tmp/

查看error_log路徑:

grep error_log /usr/local/php-fpm/etc/php.ini

技術分享圖片

ls /usr/local/php-fpm/var/log/

技術分享圖片

沒有生成,那要手動生成日誌文件,並更改權限777

touch /usr/local/php-fpm/var/log/php_errors.log

chmod 777 /usr/local/php-fpm/var/log/php_errors.log

重啟服務:

技術分享圖片

curl -x 127.0.0.1:80 test.com/3.php -I //報404錯

技術分享圖片

查看日誌:cat /usr/local/php-fpm/var/log/php_errors.log

技術分享圖片

改回來就正常了

技術分享圖片

12.24 php-fpm進程管理

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的子進程最多可以處理這麽多請求,當達到這個數值時,它會自動退出。

第一行,定義php-fpm的子進程啟動模式,dynamic為動態模式;一開始只啟動少量的子進程,根據實際需求,動態地增加或者減少子進程,最多不會超過pm.max_children定義的數值。另外一種模式為static,這種模式下子進程數量由pm.max_children決定,一次性啟動這麽多,不會減少也不會增加。pm.start_servers針對dynamic模式,它定義php_pm服務在啟動服務時產生的子進程數量。

pm.min_spare_servers針對dynamic模式,它定義在空閑時段子進程數的最少數量,如果達到這個數值時,php-fpm服務會自動派生新的子進程。pm.max_spare_servers也是針對dynamic模式的,它定義在空閑時段子進程數的最大值,如果高於這個數值就開始清理空閑的子進程。 pm.max_requests針對dynamic 模式,它定義一個子進程最多處理的請求數,也就是說在一個php-fpm的子進程中最多可以處理這麽多請求,當達到這個數值時,它會自動退出。


2018.3.19 13周1次課