我在这里看到很多问题都强调了随机 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),然后按照如何锻造对于我来说,它非常有用。