Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止。 Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI。
502: 查看php-fpm进程数,命令如下:
ps -ef | grep php-fpm | wc -l
php-fpm进程启动模式,pm可以设置为static和dynamic和ondemand。 如果选择static,则进程数就是固定的,由pm.max_children指定固定的子进程数。 如果选择dynamic,则进程数是动态变化的,由以下参数决定:
pm = static 表示我们创建的php-fpm子进程数量是固定的,那么就只有pm.max_children = 50这个参数生效。你启动php-fpm的时候就会一起全部启动51(1个主+50个子)个进程,颇为壮观。
pm = dynamic模式
pm = dynamic模式,表示启动进程是动态分配的,随着请求量动态变化的。 他由pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers 这几个参数共同决定。
上面已经讲过,这里再重申一下吧:
pm.max_children = 50 是最大可创建的子进程的数量。必须设置。这里表示最多只能50个子进程。
pm.start_servers = 20 随着php-fpm一起启动时创建的子进程数目。默认值:min_spare_servers + (max_spare_servers – min_spare_servers) / 2。这里表示,一起启动会有20个子进程。
pm.min_spare_servers = 10
设置服务器空闲时最小php-fpm进程数量。必须设置。如果空闲的时候,会检查如果少于10个,就会启动几个来补上。
pm.max_spare_servers = 30
设置服务器空闲时最大php-fpm进程数量。必须设置。如果空闲时,会检查进程数,多于30个了,就会关闭几个,达到30个的状态。
默认的fastcgi进程响应的缓冲区是8K,我们可以设置大一点,在nginx.conf里,加入:fastcgi_buffers 8 128k 这表示设置fastcgi缓冲区为8块128k大小的空间。 情况一解决办法(改进): 在上述方法修改后,如果还是出现问题,我们可以继续修改nginx的超时参数,将参数调大一点,如设置为60秒: send_timeout 60; 经过这两个参数的调整,结果没有再提示“504 Gateway Time-out”错误,问题基本解决。
这里我们需要对php-fpm和nginx进行配置修改。因为这种情况下,也会出现“504 Gateway Time-out”错误提示。
将max_children由之前的10改为30, 这样操作是为了保证有充足的php-cgi进程可以被使用。 将request_terminate_timeout由之前的0秒改成60秒,这样使php-cgi进程处理脚本的超时时间提高到60秒,可以防止进程被挂起以提高利用效率。
为了减少fastcgi的请求次数,尽量维持buffers不变,我们要更改nginx的几个配置项,如下: 将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”错误
本文作者:曹子昂
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!