我在这里看到了很多关于使用Nginx + PHP-FPM时随机select502( Nginx + PHP-FPM =“Random”502 Bad Gateway )和类似超时的问题。
即使有所有的问题,我仍然无法find解决scheme。
使用Ubuntu 10.10 + Nginx + PHP5-FPM + APC,并且每4个请求中的每1个就会以超时和失败结束。 这不是一个负载问题或大stream量,它甚至发生在一个人的开发环境中。
我在3个1GB的机器上这样做,每个机器都有相同的configuration和相同的问题。
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
我的钱是在APC被责备。 我看到类似于apc.include_once_override = On 。 closures(和apc.canonicalize = On )为我修好了。
这通常意味着您的Fastcgiconfiguration没有正确设置您正在交付的数据和标题。
您将需要在fastcgi_parms文件中使用以下设置:
fastcgi_connect_timeout 90; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 1024K; fastcgi_buffers 8 512k; fastcgi_busy_buffers_size 1024k; fastcgi_temp_file_write_size 1024k; fastcgi_intercept_errors on; fastcgi_pass_header *;
上面的设置是从我的开发服务器,我使用FirePHP,当头信息太大(即它填满了缓冲区),我发现我总是得到502错误。 因此,我已经使缓冲区真的很大。 如果你知道这是你的应用程序正在做什么,那么这是一个很好的开始。
我永远不会在生产服务器上使用上述设置,但是如果过多的头文件/数据不是问题,那么connect_timeout,send_timeout,intercept_errors和pass_header设置通常是开始解决问题的好地方。
我同意本塔APC可能是罪魁祸首。 我发现Xcache不太容易出错,但是它被告知更老,更less的CPU效率。 尽pipe如此,由于502错误难以追踪,所以我build议你“apt-get -purge remove”所有的php软件包(特别是APC和php5-fpm),只要按照howtoforge的说明操作即可我。