php-fpm的pool、慢執行日誌、進程管理、open_basedir
為了避免因多站點使用同一個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
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/
php-fpm的pool、慢執行日誌、進程管理、open_basedir