五十一、php-fpm的pool、php-fpm慢執行日誌、open_basedir、php-fpm

五十一、php-fpm的pool、php-fpm慢執行日誌、open_basedir、php-fpm進程管理

一、php-fpm的pool

pool:右側。ps aux最右側的那一列。就是它的池子。

# cd /usr/local/php-fpm/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]     //這就是一個pool

listen = /tmp/php-fcgi.sock

#listen = 127.0.0.1:9000

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


每個池子可以監聽不同的socket或者TCP/IP。

     假如Nginx有好幾個站點,每個站點都可以使用一個pool,這樣做的好處是當某個php502了(502很有可能是PHP資源不夠了),如果很多個網站都使用了同一個池子,如果哪個程序員寫錯了東西,它就會把PHP的資源耗盡,這樣其他的站點也會502,所以有必要把每個站點使用單獨的pool


php-fpm裏可以繼續增加pool:

# vim php-fpm.conf     //新增了一個

[mrx.com]

listen = /tmp/mrx.sock

#listen = 127.0.0.1:9000

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

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

[29-Apr-2018 22:10:01] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

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

Reload service php-fpm  done

# ps aux |grep php-fpm  //可以看到最右側的www和mrx.com

php-fpm    1536  0.0  0.2 227228  4708 ?        S    22:11   0:00 php-fpm: pool www

php-fpm    1537  0.0  0.2 227228  4708 ?        S    22:11   0:00 php-fpm: pool www

php-fpm    1538  0.0  0.2 227228  4708 ?        S    22:11   0:00 php-fpm: pool www

php-fpm    1539  0.0  0.2 227228  4704 ?        S    22:11   0:00 php-fpm: pool mrx.com

php-fpm    1540  0.0  0.2 227228  4704 ?        S    22:11   0:00 php-fpm: pool mrx.com

php-fpm    1541  0.0  0.2 227228  4704 ?        S    22:11   0:00 php-fpm: pool mrx.com

如何使用:

# cd /usr/local/nginx/conf/vhost/

# vim test.com.conf

location ~ \.php$

{

include fastcgi_params;

fastcgi_pass unix:/tmp/php-fcgi.sock;    這裏設置php-fcgi.sock

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;

}

# vim aaa.com.conf

location ~ \.php$       //這樣兩個站點就隔離開了

{

include fastcgi_params;

fastcgi_pass unix:/tmp/mrx.sock;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;

}

假如test.com.conf有50個請求,請求滿了,再請求就會報502,因爲沒有多餘的PHP給它提供服務了,而mrx.com這個站點不受影響,因爲它用的是另外一個池子。


# tail ../nginx.conf

tcp_nodelay on;

gzip on;

gzip_min_length 1k;

gzip_buffers 4 8k;

gzip_comp_level 5;

gzip_http_version 1.1;

gzip_types text/plain application/x-javascript text/css text/htm

application/xml;

include vhost/*.conf;       nginx中有這條,php-fpm也支持

}

# cd /usr/local/php-fpm/etc

# vim 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

加一條在global裏。

再把下面的pool的內容拆分出來。將下面的全部內容先複製再刪除。

# mkdir php-fpm.d

[root@MRX etc]# cd php-fpm.d/

        //因爲剛纔定義的是php-fpm.d,所以創建個目錄

[root@MRX php-fpm.d]# vim www.conf

[www]

listen = /tmp/php-fcgi.sock

#listen = 127.0.0.1:9000

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

# vim mrx.conf

[mrx.com]

listen = /tmp/mrx.sock

#listen = 127.0.0.1:9000

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

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

[29-Apr-2018 23:32:09] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

# /etc/init.d/php-fpm restart

Gracefully shutting down php-fpm . done

Starting php-fpm  done

再ps aux |grep php-fpm可以看到,是一樣的效果,mrx.com在前面,www在後面。


二、php-fpm慢執行日誌(非常有用)

做PHP的網站,建議用LNMP,其中一個原因就是可以分析php的慢執行日誌, 網站慢可以通過慢執行日誌分析。

# cd /usr/local/php-fpm/etc/php-fpm.d/

# vim www.conf

request_slowlog_timeout = 1  //意思是超過1秒鐘就記錄日誌,一般設置2秒適合

//這兩行加在最後面

slowlog = /usr/local/php-fpm/var/log/www-slow.log      //日誌的路徑

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

[01-May-2018 16:42:04] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

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

Reload service php-fpm  done

# ls /usr/local/php-fpm/var/log/   //檢查日誌有沒有生成

php-fpm.log  www-slow.log

配置Nginx的虛擬主機test.com.conf,把unix:/tmp/php-fcgi.sock改爲unix:/tmp/www.sock,再重新加載Nginx服務。

# vim /data/wwwroot/test.com/sleep.php

<?php

echo "test slow log";

sleep(2);

echo "done";

?>

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

display_errors = On  這裏將off修改爲on就可以在瀏覽器上看錯誤日誌,線上這裏要off掉,不能讓別人在瀏覽器上看到你的錯誤信息。

# curl -x127.0.0.1:80 test.com/sleep.php  測試,會慢2秒鐘,然後記錄進了慢執行日誌。

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

sleep() /data/wwwroot/test.com/sleep.php:3  

這行代表這個文件的第3行慢了。所以如果網站慢了就可以查看這個慢執行日誌slow.log。


三、php-fpm定義open_basedir

      之前在php.ini中定義過open_basedir,如果服務器上有多個網站,在php.ini中再去定義就不合適了。可以針對每個池子做open_basedir。

# vim /usr/local/php-fpm/etc/php-fpm.d/www.conf

php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/  加這行配置,當這行配置寫錯時,就會404,此處正確的是test.com。

# /etc/init.d/php-fpm restart

# curl -x127.0.0.1:80 test.com/3.php -I   寫錯時的效果。

HTTP/1.1 404 Not Found

# curl -x127.0.0.1:80 test.com/3.php -I   正確時的效果。

HTTP/1.1 200 OK

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

display_errors = Off     on改回off,線上這裏要off掉,不能讓別人在瀏覽器上看到你的錯誤信息。

log_errors = On    正確的做法是把錯誤信息記錄在服務器的某個文件裏。

;error_log = syslog   定義在這一行的下面。

error_log = /usr/local/php-fpm/var/log/php_errors.log  新增加的一行。

error_reporting = E_ALL    定義日誌級別,全部記錄。

# ls /usr/local/php-fpm/var/log/ 先檢查有沒有php_errors.log這個文件

php-fpm.log  www-slow.log

# touch /usr/local/php-fpm/var/log/php_errors.log      沒有就touch一個

# chmod 777 /usr/local/php-fpm/var/log/php_errors.log  權限改777,防止不能正常的寫入。

當www.com.conf寫錯時:

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

# /etc/init.d/php-fpm restart

# cat /usr/local/php-fpm/var/log/php_errors.log   看錯誤日誌

[02-May-2018 21:48:14 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/wwtest.com:/tmp/) in Unknown on line 0  不是wwtest.com

# vim www.com.conf

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

改回test.com


四、php-fpm進程管理

[root@MRX php-fpm.d]# cat www.conf

[www]

listen = /tmp/php-fcgi.sock

#listen = 127.0.0.1:9000

listen.mode = 666

user = php-fpm

group = php-fpm

pm = dynamic     //動態進程管理,可以是static(靜態),dynamic(動態)。

pm.max_children = 50     //最大子進程數,ps aux可以查看。static時只有這一行生效,用static時直接啓動時就50個,所以需使用動態。

pm.start_servers = 20      //啓動服務時會啓動的進程數

pm.min_spare_servers = 5    //定義在空閒時段,子進程數的最少數量,如果達到這個數值時,php-fpm會自動派生新的子進程。

pm.max_spare_servers = 35  //定義在空閒時段,子進程數的最大值,如果高於這個數值就開始清理空閒的子進程。

pm.max_requests = 500   //定義同一個子進程最多處理的請求數,也就是說在一個php-fpm的子進程最多可以處理這麼多請求,當達到這個數值時,它會自動退出。如果不退出這個子進程就會一直存在,萬一這個子進程有問題。

rlimit_files = 1024

request_slowlog_timeout = 1

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

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


# ps aux |grep mrx.com |wc -l

21    這裏是因爲mrx.com定義了啓動時會啓動的進程數是20,如果不使用這些進程,一會兒這些空閒進程會銷燬,銷燬限度,最低會保留5個子進程在。

# ps aux |grep php-fpm |wc -l

42

這些參數都可以自定義成自己的需求。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章