标签归档:fpm

Nginx php-fpm日志记录 与 配置参考

Nginx的日志配置:

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

可以针对具体的域做具体配置。

PHP的php.ini中针对日志配置:

//错误报告级别
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
//是否显示错误
display_errors = On
//是否记录日志
log_errors = On
//日志记录到哪里
error_log = php_errors.log

在PHP php-fpm.conf关于日志的配置:

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;
[global]
error_log = /var/log/php-fpm/error.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
;log_level = notice

这个是针对php-fpm进行的日志配置,那么,它自然只应该记录和php-fpm相关的日志(cat /var/log/php-fpm/error.log):

[02-Aug-2015 21:40:54] WARNING: [pool www] child 4062, script '/data/web/nginx/timeout.php' (request: "GET /timeout.php") executing too slow (2.565468 sec), logging
[02-Aug-2015 21:40:54] NOTICE: child 4062 stopped for tracing
[02-Aug-2015 21:40:54] NOTICE: about to trace 4062
[02-Aug-2015 21:40:54] NOTICE: finished trace of 4062
[02-Aug-2015 22:15:29] NOTICE: Terminating ...
[02-Aug-2015 22:15:29] NOTICE: exiting, bye-bye!
[02-Aug-2015 22:15:30] NOTICE: fpm is running, pid 15707
[02-Aug-2015 22:15:30] NOTICE: ready to handle connections
[02-Aug-2015 22:45:56] NOTICE: Terminating ...
[02-Aug-2015 22:45:56] NOTICE: exiting, bye-bye!
[02-Aug-2015 22:50:41] NOTICE: fpm is running, pid 1243
[02-Aug-2015 22:50:41] NOTICE: ready to handle connections

就记录了进程启用终止等之类的信息,fpm有问题时,这个日志是很有用的信息。

如果PHP作为Apache的模块运行,当PHP脚本发生错误时,如果在PHP的php.ini中配置了log_error,那么错误就记录到这个指定文件,否则错误会上交到Apache来处理。这个过程一直被认为当PHP以fpm运行时是不正确的。不过我这里拿PHP 5.5以FPM运行时,它的过程跟PHP作为Apache的模块运行时的过程是一致的。这个应该是早期的PHP版本FPM运行时,没有向上报告导致的。比如当我去掉log_error配置项(php.ini和php-fpm.conf中都去掉):

tail -f /usr/local/nginx/logs/error.log
2015/08/02 23:30:11 [error] 1254#0: *12 FastCGI sent in stderr: "PHP message: PHP Parse error:  syntax error, unexpected 'echo' (T_ECHO) in /data/web/nginx/err.php on line 4" while reading response header from upstream, client: 192.168.1.100, server: nginx.ifeeline.com, request: "GET /err.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "nginx.ifeeline.com"

这里Nginx成功记录了PHP的语法错误。而当我恢复php.ini中的log_error配置时,错误就记录到了配置指定的文件,Nginx也没有重复记录这个错误。

PHP-FPM中,还可以配置request_slowlog,要找出执行时间超标的脚本,这个设置比较有用,以下是PHP-FPM配置参考:

#################################
#全局配置
#################################

#包含文件,一般,池的配置可以放入单独的文件
#比如www.conf,表示www池
include=/etc/php-fpm.d/*.conf

#进程ID号存放的文件,默认为none
pid = /var/run/php-fpm/php-fpm.pid

#错误日志,可以设置为syslog,让其把日志发送到syslog
#默认值/var/log/php-fpm.log
error_log = /var/log/php-fpm/error.log
;syslog.facility = daemon
;syslog.ident = php-fpm

#日志级别,可用值alert, error, warning, notice, debug
#默认值为notice
log_level = notice

#紧急重启阀值和区间,在循环的区间(emergency_restart_interval)
#如果子进程退出的次数等于emergency_restart_threshold的设置
#FPM优雅重启,默认值都为0
;emergency_restart_threshold = 0
;emergency_restart_interval = 0

#子进程等待一个来自主进程的可重用信号的限制时间
#默认为0,默认单位为s(秒)
;process_control_timeout = 0

#FPM将可fork的最大值。当在大量的池中使用动态PM时,这个值被设置来控制全局的进程数量
;process.max = 128
;process.priority = -19

#后台或前提运行
daemonize = yes

#设置主进程可打开的文件描述符数量. 默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。
;rlimit_files = 1024

#设置主进程最大的核心数
;rlimit_core = 0

#指定FPM将使用的事件机制
;events.mechanism = epoll

#当FPM和systemd,指定一个时间区间,用来向systemd报告健康通知
;systemd_interval = 10

#################################
#以下是针对池的配置
#################################

#FPM监听端口,即nginx中php处理的地址。可用格式为: 'ip:port', 'port', '/path/to/unix/socket'. 每个进程池都需要设置。
listen = 127.0.0.1:9000

#backlog数,-1表示无限制,由操作系统决定
;listen.backlog = -1

#允许访问FastCGI进程的IP,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接
listen.allowed_clients = 127.0.0.1

#unix socket设置选项,如果使用tcp方式访问,可忽略。
;listen.owner = www
;listen.group = www
;listen.mode = 0660

#启动进程的帐户和组
user = www
group = www

#如何控制子进程,选项有static和dynamic。
pm = dynamic
#如果选择static,则由pm.max_children指定固定的子进程数。如果选择dynamic,则由下开参数决定:
pm.max_children 	#,子进程最大数
pm.start_servers 	#,启动时的进程数
pm.min_spare_servers 	#,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers 	#,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理

#设置每个子进程重生之前服务的请求数(服务这么多的请求自杀重启). 对于可能存在内存泄漏的第三方模块来说是非常有用的
pm.max_requests = 500

#FPM状态页面的网址. 如果没有设置, 则无法访问状态页面。默认值为没有设置。
;pm.status_path = /status

#FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。
ping.path = /ping

#用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.
;ping.response = pong

#设置单个请求的超时中止时间
request_terminate_timeout = 0

#当一个请求到达设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 '0' 表示 'Off'
request_slowlog_timeout = 10s

#慢请求的记录日志,配合request_slowlog_timeout使用
slowlog = log/$pool.log.slow

;rlimit_files = 1024
;rlimit_core = 0

#启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.
chroot =

#设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时)
chdir =

#重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.
catch_workers_output = yes

#限制后缀,默认为php
;security.limit_extensions = .php .php3 .php4 .php5

#设置环境变量
;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp

#修改PHP配置
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
;php_flag[display_errors] = off
;php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 128M

; Set session path to a directory owned by process user
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session