五十一、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,所以
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