Nginx + PHP-FPM =“随机”502错误的网关

我运行Nginx并通过FastCGI代理PHP请求到PHP-FPM进行处理。 我将随机收到502错误的网关错误页面 – 我可以通过点击我的PHP网站非常迅速/刷新页面一两分钟来重现此问题。 当我得到502错误页面时,我所要做的就是刷新浏览器并正确刷新页面。

这是我的设置:

nginx / 0.7.64 PHP 5.3.2(fpm-fcgi)(内置:Apr 1 2010 06:42:04)Ubuntu 9.10(最新的2.6 Paravirt)

我使用这个./configure指令编译PHP-FPM

./configure –enable -fpm –sysconfdir = / etc / php5 / conf.d –with-config-file-path = / etc / php5 / conf.d / php.ini –with-zlib –with -openssl –enable-zip –enable-exif –enable-ftp –enable-mbstring –enable-mbregex –enable-soap –enable-sockets –disable-cgi –with-curl –with -curlwrappers –with-gd –with-mcrypt –enable-memcache –with-mhash –with-jpeg-dir = / usr / local / lib –with-mysql = / usr / bin / mysql – / usr / bin / mysql –with-pdo-sqlite –with-pspell –with-snmp –with- sqlite –with-tidy –with-xmlrpc –with-xsl

我的php-fpm.conf看起来像这样(相关部分):

... <value name="pm"> <value name="max_children">3</value> ... <value name="request_terminate_timeout">60s</value> <value name="request_slowlog_timeout">30s</value> <value name="slowlog">/var/log/php-fpm.log.slow</value> <value name="rlimit_files">1024</value> <value name="rlimit_core">0</value> <value name="chroot"></value> <value name="chdir"></value> <value name="catch_workers_output">yes</value> <value name="max_requests">500</value> ... 

我试着将max_children增加到10,这没有什么区别。 我也尝试将其设置为“dynamic”,并将max_children设置为50,将start_server设置为“5”,没有任何区别。

我曾尝试使用1和5 nginx工作进程。

我的fastcgi_params conf如下所示:

 fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param REDIRECT_STATUS 200; 

Nginx将错误logging为:

连接到上游时客户端:68.40.xxx.xxx,服务器:www.domain.com,请求:“GET /favicon.ico HTTP / HTTP错误3947#0:* 10530连接()失败1.1“,上游:”fastcgi://127.0.0.1:9000“,主机:”www.domain.com“

PHP-FPM在错误发生时logging以下内容:

 [NOTICE] pid 17161, fpm_unix_init_main(), line 255: getrlimit(nofile): max:1024, cur:1024 [NOTICE] pid 17161, fpm_event_init_main(), line 93: libevent: using epoll [NOTICE] pid 17161, fpm_init(), line 50: fpm is running, pid 17161 [DEBUG] pid 17161, fpm_children_make(), line 403: [pool default] child 17162 started [DEBUG] pid 17161, fpm_children_make(), line 403: [pool default] child 17163 started [DEBUG] pid 17161, fpm_children_make(), line 403: [pool default] child 17164 started [NOTICE] pid 17161, fpm_event_loop(), line 111: ready to handle connections 

当我重新创build问题时,我的CPU使用率最高可达10-15%左右。 我的免费mem(免费-m)大于130MB

在使用php5-cgi来服务我的PHP请求时,我有这个间歇性的502错误网关问题。 有谁知道如何解决这一问题?

编辑/更新:我使用主pipe启动php-fpm(不是因为这个deamonized)。

我认为你的max_children太低了

 <value name="max_children">3</value> 

您也可以尝试从TCP端口切换到unix套接字为php-fpm:

PHP-fpm.conf

 <value name="listen_address">/tmp/php.sock</value> 

nginx.conf

 fastcgi_pass unix:/tmp/php.sock; 

阐述:

  1. Unix套接字速度快了20%
  2. 每个连接都不使用时间等待套接字