由于nginx仅是一个web服务器,因此nginx的access日志只有对访问页面的记录,不会有php 的 error log信息。
nginx把对php的请求发给php-fpm fastcgi进程来处理,默认的php-fpm只会输出php-fpm的错误信息,在php-fpm的errors log里也看不到php的errorlog
原因:
php-fpm的配置文件php-fpm.conf中默认是关闭worker进程的错误输出,直接把他们重定向到/dev/null,所以我们在nginx的error log 和php-fpm的errorlog都看不到php的错误日志。
解决nginx下php-fpm不记录php错误日志的办法:
1.修改php-fpm.conf中配置 没有则增加
2.修改php.ini中配置,没有则增加
3.重启php-fpm
‘贰’ Nginx和PHP的配置
在现今网络架构中,Nginx与PHP的组合被广泛应用,尤其在web服务器领域。为了使Nginx能够正确调用PHP,我们需要对Nginx配置文件进行调整,尤其是涉及到对php的动态执行。本文将深入探讨如何在Nginx服务器中正确配置PHP调用方法,以及配置背后的原理。
配置文件默认位于 /etc/nginx/nginx.conf,在我的环境中,该文件位置为 /etc/nginx/nginx.conf。使用文本编辑器如vim打开配置文件,进行调整。
配置文件中的关键要点包括:
错误日志设置:通过调整error_log参数,可以指定记录信息的类型,如debug、info、notice、warn、error、crit等。
sendfile优化:启用sendfile功能,可以显着提升数据传输性能,通过将数据从硬盘快速拷贝至内核缓冲区,再发送至用户缓冲区,从而避免多次数据复制。
tcp_nopush与tcp_nodelay:tcp_nopush在启用sendfile后启用,使得程序在接收数据包后不立即发送,而是在数据包最大时一次性发送,以缓解网络拥堵;相反,tcp_nodelay则立即发送数据包。
进行php的fastcgi配置,首先在vim中打开nginx配置文件,定位到server部分进行调整。
添加监听端口:由于仅使用一个端口,无需修改其他部分。
添加location规则:创建一个匹配所有.php文件请求的location规则,配置文件中应包含对资源根目录、fastcgi_pass以及fastcgi_param的指定。
完成配置后,重启Nginx服务。通过在Nginx根目录下创建一个php文件(例如:php_info.php),并输入相关代码,访问该文件以验证配置是否成功。
了解了Nginx与php的运行原理后,配置过程变得直观且易于执行。Nginx的worker进程负责管理网络请求,而php作为一个cgi程序,则由名为php-fpm的进程管理器进行管理。fastcgi是一种进程管理器,用于管理cgi进程,如php-fpm,它监听特定端口(默认9000端口),并处理传入的请求。
配置文件中的关键信息包括:
通过此配置,当重启Nginx后,在特定目录下创建php文件并访问时,网页将显示相应内容。
对于需要对外网访问内网设置的情况,需在nginx配置文件中开放相应的端口,确保外网可以访问内网服务器的特定端口。如将外网IP映射至内网服务器的82端口,需在配置文件中进行相应的端口开放操作。
本文旨在提供Nginx配置PHP调用方法及配置原理的详细指南,助力开发者高效实现服务器配置,提升开发效率。对于进一步提升技能、解决进阶问题,可参考整理的高级进阶干货资料。
‘叁’ nginx php-fpm记录php错误日志怎么配置
要想让php-fpm显示错误日志,首先需要配置php-fpm。
在php-fpm的配置文件中(一般位于php安装目录下的etc/php-fpm.conf)配置php错误日志的文件路径。
1
2
3
4
5
6
; Error log file
; If it's set to "syslog", log is sent to syslogd instead of being written
; in a local file.
; Note: the default prefix is /home/wangwei/php/var
; Default Value: log/php-fpm.log
;error_log = log/php-fpm.log
如上是我的php-fpm.conf文件中配置错误日志的地方。把error_log = log/php-fpm.log之前的;去掉,然后修改为:
1
2
3
4
5
6
; Error log file
; If it's set to "syslog", log is sent to syslogd instead of being written
; in a local file.
; Note: the default prefix is /home/wangwei/php/var
; Default Value: log/php-fpm.log
error_log = /home/work/log/php-fpm.log.wf
修改之后,保存配置,然后重启php-fpm就可以啦。
注意如果用相对路径的话,的路径的前缀是基于php安装目录的var目录的。
‘肆’ Http协议状态码理解(1**~5**)
通俗的来说,nginx作为一个代理服务器,将请求转发到其他服务器或者php-cgi来处理,当nginx收到了无法理解的响应时,就返回502。当nginx超过自己配置的超时时间还没有收到请求时,就返回504错误。
php-fpm没有启动
我们关闭php-fpm。
刷新页面,发现返回502错误:
nginx的error_log:
php-fpm请求超时
我们首先将php-fpm.conf中的 max_terminate_request 改成5s:
在php脚本中添加如下语句:
刷新页面,发现返回502错误:
查看php-fpm的error_log,有如下日志:
查看nginx的error_log,有如下日志:
504即nginx超过了自己设置的超时时间,不等待php-fpm的返回结果,直接给客户端返回504错误。但是此时php-fpm依然还在处理请求(在没有超出自己的超时时间的情况下)。
这里有三个相关的配置:
这里我们将fastcgi_read_timeout设置为1s,后端还是延迟20s,观测效果:
nginx返回504错误。
‘伍’ 真心求助.nginx错误
Nginx服务器错误一般有以下几点原因:
1、请求的header过大。nginx默认的header长度上限是4k,如果超过了这个值,nginx会直接返回400错误.
解决方法:配置nginx.conf相关设置。可以通过以下2个参数来调整header上限:
client_header_buffer_size 16k;large_client_header_buffers 4 16k。
2、上传文件过程中出现错误。这时浏览器显示“413 Request Entity Too Large”。这是因为没有设置client_max_body_size,这个参数默认只是1M,也就是说发布的文章内容大小不能超过1M。
解决方法:增加如下两行到nginx.conf的http{}段, 增大nginx上传文件大小限制:设置允许发布内容为8M:client_max_body_size 8M;client_body_buffer_size 128k。
另外如果运行的是php,那么还要检查php.ini,这个大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大,这样就不会因为提交数据大小不一致出现的错误:post_max_size = 8M;upload_max_filesize = 6M。
修改完配置后,别忘记重新加载。
3、客户端在为等到服务器相应返回前就关闭了客户端描述符。一般出现在客户端设置超时后,服务器主动关闭。
解决方法:根据实际Nginx后端服务器的处理时间修改客户端超时时间。
4、脚本错误(php语法错误、lua语法错误)。
解决方法:查看nginx_err_log php_err_log。
5、访问量过大,系统资源限制,不能打开过多文件。 磁盘空间不足。(access log开启可能导致磁盘满溢,服务器主动关闭)。
解决方法:修改/etc/sysctl.conf文件,并使用下面的命令确认: #sysctl -p。要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。
6、后端服务无法处理,业务中断。
解决方法:从后端日志获取错误原因,解决后端服务器问题。
7、后端服务器在超时时间内,未响应Nginx代理请求。
解决方法:根据后端服务器实际处理情况,调正后端请求超时时间。
8、网站页面缓存过大。
解决方法:配置nginx.conf相关设置:fastcgi_buffers 8 128k;send_timeout 60。
‘陆’ php进程超时接口返回504错误分析
在一次接口测试中,发现返回的http 504 time out 的错误,然后查看了php-fpm的错误日志,发现了如下错误
从表现上看,是php进程超时导致的进程被kill了,那么这个超时时间以及kill的机制是跟哪些参数有关呢,这里系统这里一下。
Nginx服务一般因为php的错误或者超时会有两种错误码502 bad Gateway 或者 504 Gateway Time-out
一种情况是php产生了语法错误,比如循环调用、变量作用域错误、方法不存在等,如果开启错误日志输出的话,这种错误在php-fpm的错误日志中是可以看到调用栈信息的。
另外一种情况可能就是超时引起的php-fpm主动kill的情况,在php.ini和php.fpm中有两个配置项,用来管理php脚本的最大执行时间
当php脚本的执行时间超过这个时间时,PHP-FPM不只会终止脚本的执行,还会终止执行脚本的Worker进程。所以Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误。
以顶部的错误为例,当报502错误是,nginx的errorlog中有如下日志,:
所以只需将这两项的值调大一些就可以让PHP脚本不会因为执行时间长而被终止了。request_terminate_timeout可以覆盖max_execution_time,
所以如果不想改全局的php.ini,那只改PHP-FPM的配置就可以了。
此外要注意的是Nginx的upstream模块中的max_fail和fail_timeout两项。这两个配置表示在fail_timeout事件内,如果fail的测试达到max_fail,那么在接下来的fail_timeout时间内,Nginx都会认为上游服务器挂掉了,都会返回502错误。
所以可以将max_fail调大一些,将fail_timeout调小一些。
PHP-FPM设置的脚本最大执行时间已经够长了,但执行耗时PHP脚本时,发现Nginx报错从502变为504了。这是为什么呢?
因为我们修改的只是PHP的配置,Nginx中也有关于与上游服务器通信超时时间的配置
以Nginx超时时间为90秒,PHP-FPM超时时间为300秒为例,报504 Gateway Timeout错误时的Nginx错误访问日志如下:
调高这三项的值(主要是read和send两项,默认不配置的话Nginx会将超时时间设为60秒)之后,504错误也解决了。
而且这三项配置可以配置在http、server级别,也可以配置在location级别。担心影响其他应用的话,就配置在自己应用的location中吧。
要注意的是factcgi_connect/read/send_timeout是对FastCGI生效的,而proxy_connect/read/send_timeout是对proxy_pass生效的。
参考链接: http://www.cnblogs.com/fei33423/p/8184098.html 感谢分享!