1. 程式人生 > >51.php-fpm的pool 慢日誌 open_basedir 程序管理

51.php-fpm的pool 慢日誌 open_basedir 程序管理

12.21 php-fpm的pool

12.22 php-fpm慢執行日誌(測試時報錯)

12.23 open_basedir

12.24 php-fpm程序管理

 

 

 

12.21 php-fpm的pool:

 

php-fpm裡的pool也叫池子,咱們之前加入過www的配置,這個www就叫pool

Nginx可以設定不同的站點,每個站點都可以設定不同的pool。好處是當其中一個站點502了(資源耗盡了),如果所有的網站都使用了同一個池子,那麼其中一個網站發生了故障,就會把資源耗盡,就會造成其他的站點502。所以有必要把每一個站點隔離開來,每一個站點使用單獨的pool

設定多個pool的目的是,防止發生502(資源耗盡)。一個pool只能接受50個訪問請求如果再有一個請求會502。另外的pool不受影響

vim /usr/local/php-fpm/etc/php-fpm.d///在[global]部分增加

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

mkdir /usr/local/php-fpm/etc/php-fpm.d/

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

vim www.conf //內容如下

[www]

listen = /tmp/www.sock //相應的在Nginx的虛擬主機檔案裡(php相關的),監聽也選擇為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

繼續編輯配置檔案

vim axin.conf //內容如下

[axin]

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

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

/etc/init.d/php-fpm restart

 

 

例項:

[root@localhost ~]# cd /usr/local/php-fpm/etc/

[root@localhost etc]# ls

pear.conf  php-fpm.conf  php-fpm.conf.default  php.ini

[root@localhost etc]# cat php-fpm.conf 開啟php-fpm的配置檔案

[global]

pid = /usr/local/php-fpm/var/run/php-fpm.pid

error_log = /usr/local/php-fpm/var/log/php-fpm.log

[www] 之前定義的www,就是一個pool(池子)

#listen = /tmp/php-fcgi.sock 每個pool可以監聽不同的sock或者是IP

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

[root@axinlinux-01 etc]# vim php-fpm.conf

[axin.com] 複製之前的【www】。改名字和listen

listen = /tmp/axin.sock

#listen = 127.0.0.1:9000

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

[26-Jul-2019 09:16:38] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

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

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

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

Reload service php-fpm done

[root@localhost etc]# ps aux |grep php-fpm 會顯示兩個pool,最右側會有我們設定的axin.com

root       2111  0.0  0.5 229612  5052 ?        Ss   13:15   0:00 php-fpm: master process (/usr/local/php-fpm/etc/php-fpm.conf)
php-fpm    2112  0.0  0.4 229552  4732 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2113  0.0  0.4 229552  4732 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2114  0.0  0.4 229552  4732 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2115  0.0  0.4 229552  4732 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2116  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2117  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2118  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2119  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2120  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2121  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2122  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2123  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2124  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2125  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2126  0.0  0.4 229552  4740 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2127  0.0  0.4 229552  4740 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2128  0.0  0.4 229552  4740 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2129  0.0  0.4 229552  4740 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2130  0.0  0.4 229552  4740 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2131  0.0  0.4 229552  4740 ?        S    13:15   0:00 php-fpm: pool axin.com
php-fpm    2132  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2133  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2134  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2135  0.0  0.4 229552  4736 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2136  0.0  0.4 229552  4740 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2137  0.0  0.4 229552  4740 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2138  0.0  0.4 229552  4740 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2139  0.0  0.4 229552  4740 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2140  0.0  0.4 229552  4740 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2141  0.0  0.4 229552  4740 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2142  0.0  0.4 229552  4744 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2143  0.0  0.4 229552  4744 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2144  0.0  0.4 229552  4744 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2145  0.0  0.4 229552  4744 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2146  0.0  0.4 229552  4744 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2147  0.0  0.4 229552  4744 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2148  0.0  0.4 229552  4744 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2149  0.0  0.4 229552  4744 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2150  0.0  0.4 229552  4744 ?        S    13:15   0:00 php-fpm: pool www
php-fpm    2151  0.0  0.4 229552  4744 ?        S    13:15   0:00 php-fpm: pool www
root       2737  0.0  0.0 112724   992 pts/1    R+   13:41   0:00 grep --color=auto php-fpm

現在是兩個不同的池子,那怎麼去用呢?(以下)

[root@localhost etc]# vim /usr/local/nginx/conf/vhost/test.com.conf 去nginx的虛擬主機test.com.conf定義fastcgi_pass為sock

location ~ \.php$

{

include fastcgi_params;

fastcgi_pass unix:/tmp/php-fcgi.sock;

#fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

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

}

[root@localhost etc]# cd /usr/local/nginx/conf/vhost/

[root@localhost vhost]# vim aaa.com.conf 在去定義aaa.com.conf,加上php的模組

location ~ \.php$

{

include fastcgi_params;

fastcgi_pass unix:/tmp/axin.sock; 在這裡改為axin.sock。這樣兩個站點就隔離開了

#fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;

} 這要改為default

這樣兩個站點就隔離開了

server

{

   listen 80 default_server;
   server_name aaa.com;
   index index.html index.htm index.php;
   root /data/wwwroot/default;

   location ~ \.php$

   {

   include fastcgi_params;
   fastcgi_pass unix:/tmp/axin.sock;
   #fastcgi_pass 127.0.0.1:9000;
   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;
   }
}

那麼,比如test.com.conf([www])比較忙,50個服務已經滿了,但是還有新的程序進來,就會報502。因為沒有多餘的php程序給他提供服務了。而我們新建的這個aaa.com.conf([axin.com])不受影響,因為他使用的另外一個pool。這就是為什麼要定義多個pool的原因

 

我們在Nginx主配置檔案里加入了 include = etc/php-fpm.d/*.conf,那php-fpm也支援

[root@localhost vhost]# cd ..

[root@localhost conf]# tail nginx.conf

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裡我們加入了include

}

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

在[global]部分增加include = etc/php-fpm.d/*.conf

[root@localhost conf]# cat /usr/local/php-fpm/etc/php-fpm.conf 先cat出來

[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

[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

 

[axin.com]

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

[root@localhost conf]# vim /usr/local/php-fpm/etc/php-fpm.conf 刪除[www]和[axin.com](100dd)

[root@axinlinux-01 etc]# cd /usr/local/php-fpm/etc/ 進入到etc下

[root@localhost etc]# mkdir php-fpm.d 因為include路徑為php-fpm.d的目錄下,多以要建立php-fpm.d的目錄

[root@localhost etc]# cd php-fpm.d/ 進入到php-fpm.d目錄下

[root@localhost php-fpm.d]# vim www.conf ,把剛才cat的php-fpm的配置檔案裡的[www]的部分拷貝進來

[root@localhost php-fpm.d]# vim axin.conf ,把剛才cat的php-fpm的配置檔案裡的[axin.conf]的部分拷貝進來

[root@localhost php-fpm.d]# ls 這樣看著就很乾淨了,類似於nginx的vhosts

axin.conf www.conf

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

[20-Aug-2018 16:02:25] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

報錯

1.!!阿鑫做到這有報錯,報錯是vim兩個.conf檔案的時候,沒有檢查是否複製完全.

2.報錯有另一個axin 

[26-Jul-2019 10:34:40] ERROR: [pool www] unable to set listen address as it's already used in another pool 'axin.com'
[26-Jul-2019 10:34:40] ERROR: failed to post process the configuration
[26-Jul-2019 10:34:40] ERROR: FPM initialization failed

懷疑是

[root@localhost etc]# /etc/init.d/php-fpm reload 沒有重啟起來

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

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

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

12.22 php-fpm慢執行日誌:(非常有用)

 

做php的網站建議使用LNMP,因為我們可以分析php的慢執行日誌。因為在運維中,經常會遇到公司的網站訪問慢了,能找到到底什麼地方慢了,所以慢執行日誌非常重要。像系統負載高我們可以用vmstat或top卡那個程序導致的。那php網站

 

~1. 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 記錄的日誌放在這個路徑下

~2.vi /usr/local/nginx/conf/nginx.conf

配置nginx的虛擬主機test.com.conf,把unix:/tmp/php-fcgi.sock改為unix:/tmp/www.sock (這一步阿明並沒有做,阿鑫做了報502,不做報404)

~3.重新載入nginx服務

/usr/local/nginx/sbin/nginx -t

./etc/init.d/nginx start

netstat -lntp |grep 80

~4.vim /data/wwwroot/test.com/sleep.php//寫入如下內容(模擬慢執行的指令碼)

<?php echo “test slow log”;sleep(2);echo “done”;?> 為做測試,休眠2秒鐘

~5.curl -x127.0.0.1:80 test.com/sleep.php

~6.cat /usr/local/php-fpm/var/log/www-slow.log 這個檔案下就是我們設定的慢日誌

 

~~所以php一般執行時間介於1秒到兩秒之間

 

 

 

例項:

[root@localhost ~]# vim /usr/local/php-fpm/etc/php-fpm.d/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
request_slowlog_timeout = 1 在最下面加入這兩行
slowlog = /usr/local/php-fpm/var/log/www-slow.log

[root@localhost ~]# /usr/local/php-fpm/sbin/php-fpm -t 測試有無語法錯誤

[26-Jul-2019 11:45:48] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

[root@localhost ~]# ls /usr/local/php-fpm/var/log/ 檢測路徑下的慢日誌檔案是否被建立

php-fpm.log www-slow.log 對應我們加入的路徑的慢日誌檔案

[root@localhost ~]# cat /usr/local/nginx/conf/vhost/test.com.conf [www]被test所使用,所以我們看一下他的路徑。好測試他的休眠時間

location ~ \.php$

{

include fastcgi_params;

fastcgi_pass unix:/tmp/php-fcgi.sock;

#fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name; 在這個路徑下

}

[root@localhost ~]# vim /data/wwwroot/test.com/sleep.php 在查到的這個路徑下建立寫試用的休眠php檔案

<?php

echo “test slow log”;

sleep(2);

echo “done”;

?>

 

!!此處有個知識點:

有錯誤的話,有個簡單的方式。開啟它的配置檔案:

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

搜尋diapaly_errors,將=Off改為=On

display_errors = On

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

Reload service php-fpm done

在重新curlhi顯示哪裡錯了

!!!正常生產換件是為Off的,因為不能再瀏覽器上顯示錯誤日誌,要把它放在伺服器上的一個檔案裡!!!

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

<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.8.0</center>
</body>
</html>

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

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

12.23 open_basedir:

 

 

 

之前講過在php.ini裡面定義open_basedir。如果伺服器上有多個網站,那麼在php.ini裡面定義就不合適了,因為open_basedir的作用是限定php在指定的目錄裡活動。所以要麼在Apache虛擬主機配置檔案裡定義,要麼在php-fpm的配置檔案裡定義。那麼我們可以針對每個池子定義不同的open_basedir:

 

 

~1. vim /usr/local/php-fpm/etc/php-fpm.d/www.conf//加入如下內容

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

([www]這個池子,是test.com.conf在用著,所以要寫test.com)

~2.建立測試php指令碼,進行測試

~3.再次更改aming.conf,修改路徑,再次測試

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

~4.配置錯誤日誌

~5.再次測試

~6.檢視錯誤日誌

 

 

 

把open_basedir的錯誤日誌定義上

 

1. vim /usr/local/php-fpm/etc/php-fpm.d/www.conf//加入如下內容

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

([www]這個池子,是test.com.conf在用著,所以要寫test.com)

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

display_errors = Off (改為Off)成產中為Off,不能再瀏覽器上顯示錯誤日誌。要在伺服器的一個檔案裡顯示

在搜尋error_log

在;error_log = syslog 這一行下面寫error_log = /usr/local/php-fpm/var/log/php_errors.log

也就是定義錯誤日誌的路徑。完成後要看一下日誌是否生成。沒有的話就要touch一個並chmod(防止他不能正常的寫入)

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

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

 

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

在搜尋error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT在這一行用分號註釋掉。在下面加上:

error_reporting =E_ALL (也就是日誌級別,為所有)

最後要重啟 /etc/init.d/php-fpm restart
 

 

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

 

12.24 php-fpm程序管理:

 

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

[www]

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

request_slowlog_timeout = 1

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

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

 

 

~1. pm = dynamic //動態程序管理,也可以是static(以什麼樣的形式啟動)(以分號註釋)

比如結合下面的,一開始先啟動幾個,然後根據需求,比如訪問量很大的時候自動的生成新的子程序。假如伺服器比較閒的話(也就是說沒用到他的時候),還可以自動的去銷燬,當銷燬到一定程度的時候還可以自動的生成一些新的。就是由這些引數來控制什麼時候生成與銷燬

pm = static //也可以改成靜態的,就是一下子生成這麼多。但是改為static那麼只有pm.max_children = 50這一行生效了,一下的都沒有了(ps aux |grep php可以檢視)

~2.pm.max_children = 50 //最大子程序數,ps aux可以檢視

~3.pm.start_servers = 20 //啟動服務時會啟動的程序數

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

~5.pm.max_spare_servers = 35 //定義在空閒時段,子程序數的最大值,如果高於這個數值就開始清理空閒的子程序。(定義的是什麼時候去銷燬)

~6.pm.max_requests = 500 //定義一個子程序最多處理的請求數,也就是說在一個php-fpm的子程序最多可以處理這麼多請求,當達到這個數值時,