php-fpm的pool、慢執行日誌、程式管理、open_basedir

科技小能手發表於2017-11-12

php-fpm的pool

為了避免因多站點使用同一個pool時因一個站點故障導致pool出問題,進而影響使用同一個pool的其他站點的正常執行,要對每個站點配置一個單獨的pool。

  • 為php-fpm增加pool

    編輯php-fpm配置檔案:

    ……

    [huang.com]

    listen = /tmp/huang.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

    ……

    //仿照之前的[www] pool修改的[huang.com]。

    檢測並過載配置檔案:

    [root@localhost ~]# /usr/local/php-fpm/sbin/php-fpm -t

    [09-Jan-2018 22:36:02] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

    [root@localhost ~]# /etc/init.d/php-fpm reload

    Reload service php-fpm done

  • 檢視程式

    [root@localhost ~]# ps aux | grep php-fpm

    ……

    php-fpm 2569 0.0 0.3 227800 5936 ? S 22:36 0:00 php-fpm: pool www

    php-fpm 2570 0.0 0.3 227800 5932 ? S 22:36 0:00 php-fpm: pool huang.com

    ……

  • 為站點配置pool

    [root@localhost ~]# vim /usr/local/nginx/conf/vhost/aaa.com.conf 

    ……

    location ~ .php$

    {

    include fastcgi_params;

    fastcgi_pass unix:/tmp/huang.sock;

    fastcgi_index index.php;

    fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;

    }

    //加入上面這段解析php的配置。把fastcgi_pass地址改為php-fpm。conf中一樣的地址就可以。

    ……

    檢測並過載配置:

    [root@localhost ~]# /usr/local/nginx/sbin/nginx -t

    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

    [root@localhost ~]# /usr/local/nginx/sbin/nginx -s reload

新增php-fpm.conf子配置檔案

為了便於管理,可以將php-fpm中的每個pool單獨進行管理。進行如下操作,新增php-fpm子配置檔案。

  • 編輯php-fpm.conf

    [root@localhost ~]# 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

    //在全域性變數版塊新增引數“include = etc/php-fpm.d/
    .conf”。然後可以清除php-fpm配置檔案中其他引數,再到php-fpm.d目錄下進行單獨設定。

    建立php-fpm子配置檔案目錄:

    [root@localhost ~]# mkdir /usr/local/php-fpm/etc/php-fpm.d

    建立子配置檔案

    [root@localhost ~]# vim /usr/local/php-fpm/etc/php-fpm.d/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

    //新增上面內容

    [root@localhost ~]# vim /usr/local/php-fpm/etc/php-fpm.d/huang.conf

    [huang.com]

    listen = /tmp/huang.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

    //新增上面內容

    檢測配置檔案,並過載php-fpm服務:

    [root@localhost ~]# /usr/local/php-fpm/sbin/php-fpm -t

    [09-Jan-2018 23:18:55] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

    [root@localhost ~]# /etc/init.d/php-fpm reload

    Reload service php-fpm done

  • 測試

    [root@localhost ~]# ps aux | grep php-fpm

    ……

    php-fpm 2816 0.0 0.3 227836 5948 ? S 23:19 0:00 php-fpm: pool huang.com

    php-fpm 2817 0.0 0.3 227836 5944 ? S 23:19 0:00 php-fpm: pool www

    ……

php-fpm 的慢執行日誌

通過php-fpm慢日誌,我們可以非常清晰的瞭解到php的指令碼哪裡執行時間長,它可以定位到具體的行。

  • 開啟慢執行日誌

    針對[www]pool開啟慢執行日誌:

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

    ……

    request_slowlog_timeout = 1

    #當請求超過1秒開始記錄日誌,一般寫2秒

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

    #日誌存放地址

    //新增上面兩行內容

    檢測配置檔案,重啟php-fpm服務:

    [root@localhost ~]# /usr/local/php-fpm/sbin/php-fpm -t

    [09-Jan-2018 23:38:14] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

    [root@localhost ~]# /etc/init.d/php-fpm reload

    Reload service php-fpm done

    檢視慢執行日誌檔案是否生成:

    [root@localhost ~]# ls /usr/local/php-fpm/var/log/www-slow.log 

    /usr/local/php-fpm/var/log/www-slow.log

  • 測試

    使用[www]pool的站點新增檔案

    建立測試指令碼檔案:

    [root@localhost ~]# vim /data/wwwroot/test.com/sleep.php

    <?php

    echo “test slow log”;

    sleep(2);

    echo “done”;

    ?>

    檢測:

    [root@localhost ~]# curl -x127.0.0.1:80 test.com/sleep.php

    test slow logdone

    檢視慢執行日誌:

    [09-Jan-2018 23:55:46] [pool www] pid 2992

    script_filename = /data/wwwroot/test.com/sleep.php //提示哪個指令碼慢

    [0x00007f86ce814090] sleep() /data/wwwroot/test.com/sleep.php:3//指令碼的第幾行慢

    //php網站訪問慢,可以檢視慢執行日誌,排查慢的原因。

  • 開啟php.ini檔案diplay_errors後,可以在瀏覽器上檢視具體報錯,該操作不宜在正式上線系統中使用!

    vim /usr/local/php-fpm/etc/php.ini

    將display_errors = Off 改為display_errors = On

    /etc/init.d/php-fpm reload

    執行命令時錯誤會直接輸出在螢幕上。

php-fpm定義open_basedir

因為如果伺服器管理多個網站,在php.ini裡定義多個open_basedir就不合適了,所以要麼在apache虛擬主機配置檔案裡面定義,要麼在php-fpm配置檔案裡面定義,我們可以針對不同的池子(pool)定義對應的open_basedir。

  • 配置open_basedir

    針對[www]的pool進行配置

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

    ……

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

    ……

    //新增上面一行配置

    重啟php-fpm:

    [root@localhost ~]# /etc/init.d/php-fpm reload

    Reload service php-fpm done

  • 測試

    [root@localhost ~]# curl -x127.0.0.1:80 test.com/1.txt

    test open_basedir

注意: 若open_basedir定義錯誤,就會導致無法訪問,形成404狀態碼,輸出curl直接連會提示“No input file specified.”

  • 定義錯誤日誌

    display_errors = Off 正常情況下,線上上這個是off的,別人不能通過瀏覽器看到你的錯誤資訊,而是把你的錯誤資訊記錄到伺服器的某一個檔案裡

    [root@localhost ~]# vi /usr/local/php-fpm/etc/php.ini

    ……

    display_errors=Off //搜尋display_errors 看是否為off,不是的話改為off。

    ;error_log = syslog

    error_log = /usr/local/php-fpm/var/log/php_error.log //搜尋error_log,在下面新增一行,定義錯誤日誌路徑。586行

    搜尋error_reporting

    註釋掉自帶的error_reporting

    ;error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

    error_reporting = E_ALL //定義錯誤日誌的級別,所有 460行。

    ……

    儲存退出

    手動建立錯誤日誌檔案:

    [root@localhost ~]# touch /usr/local/php-fpm/var/log/php_error.log

    [root@localhost ~]# chmod 777 /usr/local/php-fpm/var/log/php_error.log

    //防止蹦年正常寫入

  • 測試

    為了方便測試,故意將/usr/local/php-fpm/etc/php-fpm.d/www.conf 中的open_basedir路徑寫錯,來方便測試

    [root@localhost ~]# curl -x127.0.0.1:80 test.com/sleep.php -I

    HTTP/1.1 404 Not Found

    Server: nginx/1.8.0

    Date: Tue, 09 Jan 2018 16:57:28 GMT

    Content-Type: text/html; charset=UTF-8

    Connection: keep-alive

    X-Powered-By: PHP/7.1.6

    檢視錯誤日誌:

    [root@localhost ~]# cat /usr/local/php-fpm/var/log/php_errors.log 

    [09-Jan-2018 16:57:28 UTC] PHP Warning: Unknown: open_basedir restriction in effect. File(/data/wwwroot/test.com/sleep.php) is not within the allowed path(s): (/data/wwwroot/wwtest.com:/tmp/) in Unknown on line 0

    [09-Jan-2018 16:57:28 UTC] PHP Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0

    //錯誤提示訪問有限制

php-fpm 程式管理

vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
[www]
listen = /tmp/php-fcgi.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
//定義程式啟動方式(dynamic表示動態,static表示靜態)
//只有此處設定為dynamic,下面的配置才生效
pm.max_children = 50
//最多可啟動的子程式數量
pm.start_servers = 20
//設定初始啟動的程式數量
pm.min_spare_servers = 5
//表示php-fpm空閒時最少要有幾個子程式
pm.max_spare_servers = 35
//表示php-fpm空閒時最多要有幾個子程式
pm.max_requests = 500
//表示一個子程式最多可接受多少個請求
rlimit_files = 1024
//表示每個子程式開啟的多少個檔案控制程式碼
request_slowlog_timeout = 1
//當請求超過1秒開始記錄日誌
slowlog = /usr/local/php-fpm/var/log/www-slow.log
//日誌存放地址

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



本文轉自 豆渣鍋 51CTO部落格,原文連結:
http://blog.51cto.com/754599082/2059253


相關文章