1. 程式人生 > >linux的php-fpm的pool、慢執行日誌、進程管理及open_basedir介紹

linux的php-fpm的pool、慢執行日誌、進程管理及open_basedir介紹

effect 記得 errors 根據 rest time -a 分享 mit

php-fpm的pool

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

php-fpm配置說明:

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

1.編輯配置文件

[root@gary-tao ~]# cd /usr/local/php-fpm/etc/
[root@gary-tao etc]# ls
pear.conf  php-fpm.conf  php-fpm.conf.default  php.ini
[root@gary-tao etc]# cat 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
[www]
listen = /tmp/php-fcgi.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
[root@gary-tao etc]# vim php-fpm.conf  




//增加一個以下配置:


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


//include的這一行比較特殊,請註意等號後面的路徑,必須寫上etc目錄,然後需要創建配置文件目錄和子配置文件。

編輯好後把php-fpm.conf配置文件裏的www以下pool刪除,只留下[global]部分

技術分享圖片

2.創建php-fpm.d目錄及目錄下文件

[root@gary-tao etc]# mkdir php-fpm.d
[root@gary-tao etc]# cd php-fpm.d
[root@gary-tao php-fpm.d]# vim www.conf
[root@gary-tao php-fpm.d]# vim aming.conf
[root@gary-tao php-fpm.d]# ls
aming.conf  www.conf


//兩個文件分別增加內容如下:


[www]
listen = /tmp/php-fcgi.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






[aming.com]
listen = /tmp/aming.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

3.如何把兩個站點隔開

  • 原有站點test.com.conf配置如下:

技術分享圖片

  • 增加一個aaa.com.conf站點信息,操作如下:

[root@gary-tao php-fpm.d]# cd /usr/local/nginx/conf/vhost/
[root@gary-tao vhost]# ls
aaa.com.conf  ld.conf  proxy.conf  ssl.conf  test.com.conf
[root@gary-tao vhost]# vim aaa.com.conf 


增加如下配置內容:


location ~ \.php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/aming.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;
    }

技術分享圖片

3.測試語法

[root@gary-tao etc]# /usr/local/php-fpm/sbin/php-fpm -t
[09-Jan-2018 16:49:00] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

4.重啟php-fpm

[root@gary-tao etc]# /etc/init.d/php-fpm restart  //或/etc/init.d/php-fpm reload
Gracefully shutting down php-fpm . done
Starting php-fpm  done

5.查看php-fpm啟動狀態

輸入ps aux |grep php-fpm查看,顯示的就有兩個pool

技術分享圖片

php-fpm慢執行日誌

通過php-fpm的慢執行日誌,我們可以非常清晰地了解到PHP的腳本哪裏執行時間長,它可以定位到具體的行。

1.編輯配置文件

[root@gary-tao vhost]# vim /usr/local/php-fpm/etc/php-fpm.d/www.conf //針對www文件做一個測試


增加如下內容:


request_slowlog_timeout = 1  //超過一秒中就會記錄日誌
slowlog = /usr/local/php-fpm/var/log/www-slow.log  //日誌存放的路徑

1.測試語法

[root@gary-tao vhost]# /usr/local/php-fpm/sbin/php-fpm -t
[09-Jan-2018 19:15:14] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

2.重啟php-fpm

[root@gary-tao vhost]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done

3.配置nginx的虛擬主機test.com.conf,把unix:/tmp/php-fcgi.sock改為unix:/tmp/www.sock

4.編寫測試腳本

[root@gary-tao php-fpm.d]# vim /data/wwwroot/test.com/sleep.php


增加如下配置內容:


<?php
echo "test slow log";
sleep(2);
echo "done";
?>

5.使用curl做測試

[root@gary-tao php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php -I  //訪問的時候出現500,說明有語法錯誤。 
HTTP/1.1 500 Internal Server Error
Server: nginx/1.12.1
Date: Tue, 09 Jan 2018 11:23:17 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30

報錯處理:

  1. 進入vim /usr/local/php-fpm/etc/php.ini
  2. 找到display_error,改為On,然後訪問有錯誤主就會有輸出信息

技術分享圖片

  1. 記得reload重新加載配置文件
  2. 測試出報錯信息,因符號問題導致。

[root@gary-tao php-fpm.d]# /etc/init.d/php-fpm reload
Reload service php-fpm  done
[root@gary-tao php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php
<br />
<b>Parse error</b>:  syntax error, unexpected ‘slow‘ (T_STRING), expecting ‘,‘ or ‘;‘ in <b>/data/wwwroot/test.com/sleep.php</b> on line <b>2</b><br />
  1. 重新去更改配置文件vim /data/wwwroot/test.com/sleep.php的符號問題

6.查看慢執行日誌

[root@gary-tao php-fpm.d]# cat /usr/local/php-fpm/var/log/www-slow.log  //慢執行日誌裏指出了哪個腳本運行慢,也指出了是哪一行執行慢 

 
[09-Jan-2018 19:39:54]  [pool www] pid 81864
script_filename = /data/wwwroot/test.com/sleep.php
[0x00007f5987a07290] sleep() /data/wwwroot/test.com/sleep.php:3
[root@gary-tao php-fpm.d]# cat /data/wwwroot/test.com/sleep.php 
<?php 
echo "test slow log";
sleep(2);       //這個腳本超過1秒
echo "done";
?>

定義open_basedir

open_basedir的目的就是安全,只要在對應的Nginx虛擬主機配置文件中調用對應的pool,就可以使用open_basedir來物理隔離多個站點,從而達到安全目的。

1.配置虛擬主機文件

[root@gary-tao php-fpm.d]# vim /usr/local/php-fpm/etc/php-fpm.d/www.conf 


增加如下配置內容:


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

2.使用curl測試

[root@gary-tao php-fpm.d]# curl -x127.0.0.1:80 test.com/3.php -I  //正常訪問
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Tue, 09 Jan 2018 12:32:50 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30

3.配置錯誤日誌路徑測試

  • 增加錯誤路徑

[root@gary-tao php-fpm.d]# vim /usr/local/php-fpm/etc/php.ini //增加錯誤日誌路徑及定義日誌級別,如下圖

技術分享圖片
技術分享圖片

  • 進入到www.conf配置文件裏面把test.com改為aming.com,再次測試,查看錯誤日誌
  • 查看錯誤日誌

[root@gary-tao php-fpm.d]# grep error_log /usr/local/php-fpm/etc/php.ini  //查看日誌路徑
; server-specific log, STDERR, or a location specified by the error_log
; Set maximum length of log_errors. In error_log information about the source is
;error_log = php_errors.log
;error_log = syslog
error_log = /usr/local/php-fpm/var/log/php_errors.log
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
[root@gary-tao php-fpm.d]# ls /usr/local/php-fpm/var/log/
php-errors.log  php-fpm.log  www-slow.log


[root@gary-tao php-fpm.d]# ls /usr/local/php-fpm/var/log/ //查看日誌路徑是否存在
php-fpm.log  www-slow.log
[root@gary-tao php-fpm.d]# touch /usr/local/php-fpm/var/log/php_errors.log  //手動建立一個日誌文件
[root@gary-tao php-fpm.d]# chmod 777 /usr/local/php-fpm/var/log/php_errors.log  //更改成所有權限,防止不能寫入日誌
[root@gary-tao php-fpm.d]# !curl
curl -x127.0.0.1:80 test.com/3.php -I
HTTP/1.1 404 Not Found
Server: nginx/1.12.1
Date: Tue, 09 Jan 2018 13:05:05 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30


[root@gary-tao php-fpm.d]# cat /usr/local/php-fpm/var/log/php_errors.log  //因為open_basedir限制的地址寫錯了,所有就會報錯,訪問出現404
[09-Jan-2018 13:05:05 UTC] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/test.com/3.php) is not within the allowed path(s): (/data/wwwroot/aming.com:/tmp/) in Unknown on line 0
[09-Jan-2018 13:05:05 UTC] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on lin

php-fpm進程管理

技術分享圖片

  1. pm = dynamic //定義php-fpm的子進程啟動模式,dynamic為動態進程管理,一開始只啟動少量的子進程,根據實際需求,動態地增加或者減少子進程,最多不會超過pm.max_children定義的數值。另外一種模式是static,這種模式下子進程數量由pm.max_children決定,一次性啟動這麽多,不會減少也不會增加。
  2. pm.max_children = 50 //最大子進程數,ps aux可以查看
  3. pm.start_servers = 20 //針對dynamic模式,它定義php-fpm服務在啟動服務時產生的子進程服務時產生的子進程數量。
  4. pm.min_spare_servers = 5 //針對dynamic模式,定義在空閑時段,子進程數的最少數量,如果達到這個數值時,php-fpm服務會自動派生新的子進程。
  5. pm.max_spare_servers = 35 //針對dynamic模式,定義在空閑時段,子進程數的最大值,如果高於這個數值就開始清理空閑的子進程。
  6. pm.max_requests = 500 //針對dynamic模式,定義一個子進程最多處理的請求數,也就是說在一個php-fpm的子進程最多可以處理這麽多請求,當達到這個數值時,它會自動退出。

linux的php-fpm的pool、慢執行日誌、進程管理及open_basedir介紹