基本上在centos下配置lnmp组合都是用同一个配置文件,从来没出过问题。但是最近在一个vps上安装了同样的环境后,网站上10多人开始打开非常慢。有几次直接达到了nginx中设置的脚本最大超时时间300秒。结果nginx向客户端浏览器发送了一个504网关超时错误代码,经过分析,更改了几个配置文件。
从错误码来看,基本可以确定与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的请求数量,尽量保持缓冲区不变:
Fastcgi_buffers从4 64k更改为2 256k;
fastgi _ buffer _ size由64k改为128K;
fastgi _ busy _ buffers _ size从128K更改为256K;
fastgi _ temp _ file _ write _ size从128K更改为256K。
好了,重新加载php-fpm和nginx的配置,再次测试。到现在两周没有504网关超时,就是这个结果。
另外,php-fpm默认的静态处理模式会使php-cgi的进程长时间占用内存而无法释放,这也是nginx出错的原因之一,所以可以将php-fpm的处理模式改为apache模式。
value name="style "类似Apache/value
从更改到现在的测试表明,上述方法效果还是比较明显的,没有发现Nginx502坏网关或504网关超时错误。当然,如果你的VPS或者服务器的性能足够好,也不必根据具体情况做不必要的改动。