Nginx + PHP5-FPM 重复切出 502

Nginx + PHP5-FPM 重复切出 502

我在这里看到很多问题都强调了随机 502 (Nginx + PHP-FPM = “随机” 502 错误网关) 以及使用 Nginx + PHP-FPM 时类似的超时。

尽管有这么多疑问,我还是无法找到解决方案。

使用 Ubuntu 10.10 + Nginx + PHP5-FPM + APC,每 4 个请求中就有 1 个以超时和失败告终。这不是负载问题或流量大,即使在只有一个人的开发环境中也会发生这种情况。

我在 3 台 1GB 机器上执行此操作,每台机器都有相同的配置和相同的问题。

fastcgi_params

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;

/etc/php5/fpm/main.conf

; FPM Configuration ;

;include=/etc/php5/fpm/*.conf

; Global Options ;

pid = /var/run/php5-fpm.pid

error_log = /var/log/php5-fpm.log

;log_level = notice

;emergency_restart_threshold = 0

;emergency_restart_interval = 0

;process_control_timeout = 0

;daemonize = yes

; Pool Definitions ; 

include=/etc/php5/fpm/pool.d/*.conf

/etc/php5/fpm/pool.d/www.conf

[www]
listen = 127.0.0.1:9000

;listen.backlog = -1
;listen.allowed_clients = 127.0.0.1
;listen.owner = www-data
;listen.group = www-data
;listen.mode = 0666

user = www-data
group = www-data

;pm.max_children = 50
pm.max_children = 15
;pm.start_servers = 20
pm.min_spare_servers = 5
;pm.max_spare_servers = 35
pm.max_spare_servers = 10
;pm.max_requests = 500
;pm.status_path = /status

;ping.path = /ping
;ping.response = pong

request_terminate_timeout = 30
;request_slowlog_timeout = 0

;slowlog = /var/log/php-fpm.log.slow

;rlimit_files = 1024
;rlimit_core = 0

;chroot = 

chdir = /var/www

;catch_workers_output = yes

答案1

我认为 APC 应该为此负责。我看到了类似的情况apc.include_once_override = On。关闭它(和apc.canonicalize = On)后问题就解决了。

答案2

这通常意味着您的 Fastcgi 配置没有正确设置您正在处理的数据和标头。

您需要使用 fastcgi_parms 文件中的以下设置:

fastcgi_连接超时90;
fastcgi_发送超时 180;
fastcgi_读取超时180;
fastcgi_buffer_大小1024K;
fastcgi_缓冲区 8 512k;
fastcgi_busy_buffers_大小:1024k;
fastcgi_temp_file_write_size 1024k;
fastcgi_intercept_errors开启;
fastcgi_pass_header *;

以上设置来自我的开发服务器,我使用 FirePHP,当标头信息太大(即填满缓冲区)时,我发现我总是会收到 502 错误。因此,我把缓冲区做得非常大。如果您知道您的应用程序正在做什么,那么这是一个很好的起点。

我永远不会在生产服务器上使用上述设置,但您会发现,如果过多的标头/数据不是问题,则 connect_timeout、send_timeout、intercept_errors 和 pass_header 设置通常是开始解决 502 的好地方。

答案3

我同意 Ben 的观点,APC 可能是罪魁祸首。我发现 Xcache 不太容易出错,但它据说比较老,CPU 效率较低。尽管如此,由于 502 错误很难跟踪,我建议您“apt-get --purge remove”所有 php 包(特别是 APC 和 php5-fpm),然后按照如何锻造对于我来说,它非常有用。

相关内容