1. 程式人生 > >五十一、php-fpm的pool、php-fpm慢執行日誌、open_basedir、php-fpm

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

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

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


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