在CentOS下配置lnmp组合基本上用的都是一样的配置文件,一直都没出现过问题,可最近在一个vps上安装一样的环境以后,网站在线10多人就出 现了打开速度很是缓慢的状况,有好几回都是直接达到了nginx中设置的脚本最大超时时间300秒,结果致使nginx往客户端浏览器发送了一个504 Gateway Time-out的错误代码,分析了以后改动了几处配置文件,终于避免了该状况的出现。
从 错误代码基本能够肯定跟nginx自己无关,主要是提交给php-fpm的请求未能正确反馈而致使,通常状况下,提交动态请求的时候,nginx会直接把 请求转交给php-fpm,而php-fpm再分配php-cgi进程来处理相关的请求,以后再依次返回,最后由nginx把结果反馈给客户端浏览器,但 我这个vps目前跑的是个纯php应用内容,实际上用户全部的请求都是php请求,有的耗费时间比较久,php-cgi进程就一直都被用满,而php- fpm自己的配置文件只打开了10组php-cgi进程,这样的话在线用户稍微多的话就会致使请求没法被正常处理而出错。
大概分析出了原 因,下面作就比较容易了,首先是更改php-fpm的几处配置:
把max_children由以前的10改成如今的30,这样就能够保证 有充足的php-cgi进程能够被使用;
把request_terminate_timeout由以前的0s改成60s,这样php-cgi进程 处理脚本的超时时间就是60秒,能够防止进程都被挂起,提升利用效率。
接着再更改nginx的几个配置项,减小FastCGI的请求次 数,尽可能维持buffers不变:
fastcgi_buffers由 4 64k 改成 2 256k;
fastcgi_buffer_size 由 64k 改成 128K;
fastcgi_busy_buffers_size 由 128K 改成 256K;
fastcgi_temp_file_write_size 由 128K 改成 256K。
好了,从新加载php-fpm和nginx的配置,再次测试,至今两周时间内没有再出现504 Gateway Time-out的状况,算是达到效果了。
另外,php-fpm的默认静态处理方式会使得php-cgi的进程长期占用内存而没法释放,这也是致使nginx出错的缘由之一,所以能够将php-fpm的处理方式改为apache模式。
<value name=”style”>apache-like</value>
从更改完毕到如今的测试代表上述方式的效果仍是很明显的,并无发现一次Nginx502 bad gateway或504 Gateway Time-out错误。固然,若是你的VPS或者服务器的性能足够好能够根据具体状况没必要作无谓的改动。php
二. 状态码解释
502 Bad Gateway:做为网关或者代理工做的服务器尝试执行请求时,从上游服务器接收到无效的响应。
504 Gateway Time-out:做为网关或者代理工做的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。html
三. 502 Bad Gateway缘由分析
将请求提交给网关如php-fpm执行,可是因为某些缘由没有执行完毕致使php-fpm进程终止执行。说到此,这个问题就很明了了,与网关服务如php-fpm的配置有关了。
php-fpm.conf配置文件中有两个参数就须要你考虑到,分别是max_children和request_terminate_timeout。
max_children最大子进程数,在高并发请求下,达到php-fpm最大响应数,后续的请求就会出现502错误的。能够经过netstat命令来查看当前链接数。
request_terminate_timeout设置单个请求的超时终止时间。还应该注意到php.ini中的max_execution_time参数。当请求终止时,也会出现502错误的。
当积累了大量的php请求,你重启php-fpm释放资源,但一两分钟不到,502又再次呈现,这是什么缘由致使的呢? 这时还应该考虑到数据库,查看下数据库进程是否有大量的locked进程,数据库死锁致使超时,前端终止了继续请求,可是SQL语句还在等待释放锁,这时就要重启数据库服务了或kill掉死锁SQL进程了。
对于长时间的请求能够考虑使用异步方式,能够参阅《关于PHP实现异步操做的研究》。前端
四. 504 Gateway Time-out缘由分析
504错误通常是与nginx.conf配置有关了。主要与如下几个参数有关:fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout、fastcgi_buffer_size、fastcgi_buffers、fastcgi_busy_buffers_size、fastcgi_temp_file_write_size、fastcgi_intercept_errors。特别是前三个超时时间。若是fastcgi缓冲区过小会致使fastcgi进程被挂起从而演变为504错误。nginx
五. 小结
总而言之,502错误主要从四个方向入手:
1. max_children
2. request_terminate_timeout、max_execution_time
3. 数据库
4. 网关服务是否启动如php-fpm数据库
504错误主要查看nginx.conf关于网关如fastcgi的配置。apache