2011-04-07 11 views
10

Tenemos un servidor web ejecutándose con la instalación de nginx php5-fpm apc. Sin embargo, experimentamos errores de tiempo de espera de conexión ascendente y disminuciones de velocidad durante el procesamiento de página recientemente. Un reinicio rápido de php5-fpm solucionó el problema, pero no pudimos encontrar la causa.nginx php5-fpm upstream time-out (110: tiempo de espera de conexión agotado) mientras se conecta a upstream

Tenemos otro servidor web ejecutando apache2 bajo otro subdominio, conectando la misma base de datos, haciendo exactamente el mismo trabajo. Pero las ralentizaciones ocurren solo en el servidor nginx-fpm. Creo que php5-fpm o apc pueden causar los problemas.

registros dicen que los diversos tiempos de espera de conexión:

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

El registro de php5-FPM no muestra nada. A tan solo niño comienza y termina:

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 

servidor no estaba cargada cuando se produjo el error y media de carga era sólo 2 (16cores 2cpus) y los procesos de PHP5-FPM parecían estar funcionando bien.

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 sitio habilitado 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; 
} 

conf pies por minuto:

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

Hay parámetros de reinicio de emergencia en el archivo conf pies por minuto. No sé si nos ayudan a solucionar el problema.

emergency_restart_interval = 0 
+0

¿Qué hay de la opción de escuchar en fpm.conf? ¿Es escuchar el puerto 9000? – CyberDem0n

+0

seguro. listen = 127.0.0.1:9000 – faraklit

Respuesta

19

En primer lugar, reducir el PHP-FPM max_requests a 100; quieres que los hilos PHP se reinicien mucho antes de 10000 req.

En segundo lugar, solo tiene un proceso PHP ejecutándose con muchos niños. Esto está bien para el desarrollo, pero en producción quieres tener más procesos de PHP, cada uno con menos hijos, de modo que si ese proceso se cae por alguna razón, hay otros que pueden tomar el relevo. Entonces, en lugar de una proporción de 1:50 como la que tiene ahora, obtenga una proporción de 10: 5. Esto será mucho más estable.

Para lograr esto es posible que desee ver algo así como supervisor para administrar sus procesos de PHP. Usamos esto en producción y realmente ha ayudado a aumentar nuestro tiempo de actividad y reducir la cantidad de tiempo que pasamos administrando/monitoreando los servidores. He aquí un ejemplo de nuestra config:

/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.backend:

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

EDIT:

Al igual que con todos los servidores de conjunto de planos, no se basan en conjeturas para rastrear donde sus problemas son. Recomiendo instalar Munin junto con los diversos plugins PHP (-FPM) y Nginx; Esto te ayudará a rastrear estadísticas difíciles sobre solicitudes, tiempos de respuesta, uso de memoria, accesos al disco, niveles de subprocesos/procesos ... todo es esencial al rastrear dónde están los problemas.

Además, como mencioné en un comentario a continuación, agregar el caché del lado del servidor y del cliente a su configuración, incluso a un nivel modesto, puede ayudar a proporcionar una mejor experiencia para los usuarios, ya sea utilizando nginx soporte de caché nativo o algo más específico como barniz. Incluso los sitios/aplicaciones más dinámicos tienen muchos elementos estáticos que se pueden guardar en la memoria & servidos más rápido. Servir esto desde la memoria caché puede ayudar a reducir la carga en general y garantizar que los elementos que absolutamente deben ser dinámicos tengan todos los recursos que necesitan cuando los necesitan.

+0

Gracias, probaré sus sugerencias. Pensé que las max_requests pequeñas llevarían a procesos innecesarios kill/create overheads. Si creamos más procesos php padre y separamos procesos php ¿se ve afectado APC? No usamos socket por el momento en caso de que utilicemos otro servidor dedicado para el manejo de php. – faraklit

+1

No debería necesitar usar un servidor separado para el procesamiento de PHP si está usando nginx + php-fpm; retocar nginx/php y almacenar en caché usando barnizado será mucho más productivo. PHP funciona mejor cuando es de corta duración; para eso está diseñado, así que reiniciar es algo bueno. APC no debería verse afectado. ¡Y no olvides aceptar la respuesta si fue útil! ;-) –

+0

numprocs = 10 10 procesos comparten el mismo APC shm? y sobre el tcp, ¿qué pasa si se requiere que sirva demasiadas páginas (10-20M por/día)? Claro, lo aceptaré tan pronto como lo intente y resuelva nuestro problema. ;) – faraklit

Cuestiones relacionadas