2011-04-07 47 views
10

我们有nginx的PHP5 - fpm的APC设定运行的web服务器。 然而,我们的页面呈现在最近经历了上游连接超时错误和缓慢起伏。一个快速的php5-fpm重启解决了这个问题,但我们找不到原因。nginx的PHP5 - fpm的上游超时(110:连接超时),同时连接到上游

我们有另一个Web服务器正在运行的Apache2下另一个子域,连接同一个数据库,这样做完全一样的工作。但是缓慢的下降只发生在nginx-fpm服务器上。 我认为PHP5-FPM或APC可能导致的问题。

日志告诉各种连接超时:

upstream timed out (110: Connection timed out) while connecting to upstream bla bla bla

的PHP5-FPM日志不显示任何东西。只要孩子开始和结束:

Apr 07 22:37:27.562177 [NOTICE] [pool www] child 29122 started 
Apr 07 22:41:47.962883 [NOTICE] [pool www] child 28346 exited with code 0 after 2132.076556 seconds from start 
Apr 07 22:41:47.963408 [NOTICE] [pool www] child 29172 started 
Apr 07 22:43:57.235164 [NOTICE] [pool www] child 28372 exited with code 0 after 2129.135717 seconds from start 

服务器时出现错误和负载平均为仅2(2cpus 16cores)未加载和PHP5-FPM过程似乎是工作的罚款。

的nginx的conf:

user www-data; 
worker_processes 14; 
pid /var/run/nginx.pid; 
# set open fd limit to 30000 
worker_rlimit_nofile 30000; 

events { 
     worker_connections 768; 
     # multi_accept on; 
} 

http { 

     ## 
     # Basic Settings 
     ## 

     sendfile on; 
     tcp_nopush on; 
     tcp_nodelay on; 
     keepalive_timeout 65; 
     types_hash_max_size 2048; 
     # server_tokens off; 

     # server_names_hash_bucket_size 64; 
     # server_name_in_redirect off; 

     include /etc/nginx/mime.types; 
     default_type application/octet-stream; 

     ## 
     # Logging Settings 
     ## 

     access_log /var/log/nginx/access.log; 
     error_log /var/log/nginx/error.log; 

     ## 
     # Gzip Settings 
     ## 

     gzip on; 
     gzip_disable "msie6"; 

     # gzip_vary on; 
     # gzip_proxied any; 
     # gzip_comp_level 6; 
     # gzip_buffers 16 8k; 
     # gzip_http_version 1.1; 
     # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 

     ## 
     # Virtual Host Configs 
     ## 

     include /etc/nginx/conf.d/*.conf; 
     include /etc/nginx/sites-enabled/*; 
} 

nginx的启用站点的conf:

location ~* \.php$ { 
     fastcgi_split_path_info ^(.+\.php)(.*)$; 
     fastcgi_pass backend; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include 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_intercept_errors  off; 
     fastcgi_ignore_client_abort  off; 
     fastcgi_connect_timeout 20; 
     fastcgi_send_timeout 20; 
     fastcgi_read_timeout 180; 
     fastcgi_buffer_size 128k; 
     fastcgi_buffers 4 256k; 
     fastcgi_busy_buffers_size 256k; 
     fastcgi_temp_file_write_size 256k; 
    } 

## Disable viewing .htaccess & .htpassword 
    location ~ /\.ht { 
     deny all; 
    } 
} 
upstream backend { 
     server 127.0.0.1:9000; 
} 

FPM的conf:

pm.max_children = 500 
pm.start_servers = 100 
pm.min_spare_servers = 50 
pm.max_spare_servers = 100 
pm.max_requests = 10000 

有在FPM的conf文件紧急重新启动设置。 我不知道他们是否帮我们解决了这个问题?

emergency_restart_interval = 0 
+0

fpm.conf中的listen选项怎么样?它监听端口9000吗? – CyberDem0n 2011-04-08 03:08:36

+0

当然。听= 127.0.0.1:9000 – faraklit 2011-04-08 15:24:56

回答

19

首先,PHP-FPM max_requests降低至100;您希望PHP线程重启的时间早于10000请求。

其次,你只有一个PHP进程运行很多孩子。这对于开发来说很好,但是在生产中你希望有更多的PHP进程,每个进程都有更少的子进程,所以如果进程因任何原因停止运行,还有其他可能会导致进程的进程。所以,而不是像现在这样1:50的比例,去比例为10:5。这将是更稳定。

要达到此目的,您可能需要查看诸如supervisor之类的内容来管理您的PHP进程。我们在生产中使用它,它确实帮助我们延长了正常运行时间,并减少了我们花费在管理/监控服务器上的时间。下面是我们配置的例子:

/etc/php5/php-fpm.conf:

[global] 
daemonize = no 

[www] 
listen = /tmp/php.socket 

/etc/supervisor.d/php-fpm.conf:

[program:php] 
user=root 
command=/usr/sbin/php-fpm -c /etc/php5/php.ini -y /etc/php5/php-fpm.conf 
numprocs=10 
process_name=%(program_name)s 

的/ etc/nginx的/ CONF/PHP。后端:

upstream backend { 
    server unix:/tmp/php.socket 
} 

编辑:

与所有服务器设置窗口,不靠猜测工作来跟踪您的问题。我建议安装Munin以及各种PHP(-FPM)和Nginx插件;这些将帮助您追踪有关请求,响应时间,内存使用情况,磁盘访问,线程/进程级别等的硬统计信息......在追踪问题出现的位置时,这一切都非常重要。另外,正如我在下面的评论中提到的,即使在适当的级别添加服务器端和客户端缓存,也可以帮助为用户提供更好的体验,无论是使用nginx的本地缓存支持或更特定的东西,如varnishd。即使是最具活力的网站/应用程序也有很多静态元素,可以在内存中保存更快的服务。从缓存中提供这些内容可以帮助减少总体负载,并确保那些绝对需要动态的元素在需要时拥有所需的全部资源。

+0

谢谢,我会尝试你的建议。我认为小的max_requests会导致不必要的进程终止/创建开销。如果我们创建更多的父级php进程并单独执行php进程,APC会受到影响吗?如果我们使用另一台专用服务器进行php处理,我们暂时不使用套接字。 – faraklit 2011-04-08 12:19:29

+1

如果您使用的是nginx + php-fpm,则不需要为PHP处理使用单独的服务器;调整nginx/php和使用varnishd缓存将会更加高效。当PHP寿命较短时,PHP效果更好;这就是它的设计目标,所以重新启动是件好事。 APC不应受到影响。如果有帮助,不要忘记接受答案! ;-) – 2011-04-11 07:52:26

+0

numprocs = 10 10个进程共享相同的APC shm?以及关于tcp问题,如果它需要服务太多页面(每天10-20M)?当然,我会尽快接受并解决我们的问题。 ;) – faraklit 2011-04-11 22:19:56

相关问题