Sintonización de alto nivel de nginx y server wordpress

He estado llevando a cabo testings de carga (vía blitz.io) mientras bash ajustar el performance del server en un set de serveres que ejecutan php 5.5, wordpress 3.9.1 y nginx 1.6.2.

Mi confusión surge cuando sobrecarga un solo server con demasiado tráfico. Me doy count de que hay resources finitos en un server y en algún nivel tendrá que empezar a rechazar conexiones y / o devolver respuestas 502 (o similares). Lo que me confunde sin embargo, es por qué mi server parece estar devolviendo 502s tan temprano dentro de una testing de carga.

He intentado sintonizar nginx para aceptar varias conexiones:

nginx.conf

worker_processes auto; worker_rlimit_nofile 100000; events { worker_connections 1024; use epoll; multi_accept on; } 

site.conf

 location ~ \.php$ { try_files $uri =404; include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_read_timeout 60s; fastcgi_send_timeout 60s; fastcgi_next_upstream_timeout 0; fastcgi_connect_timeout 60s; } fastcgi_read_timeout 60s; location ~ \.php$ { try_files $uri =404; include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_read_timeout 60s; fastcgi_send_timeout 60s; fastcgi_next_upstream_timeout 0; fastcgi_connect_timeout 60s; } fastcgi_send_timeout 60s; location ~ \.php$ { try_files $uri =404; include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_read_timeout 60s; fastcgi_send_timeout 60s; fastcgi_next_upstream_timeout 0; fastcgi_connect_timeout 60s; } fastcgi_next_upstream_timeout 0; location ~ \.php$ { try_files $uri =404; include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_read_timeout 60s; fastcgi_send_timeout 60s; fastcgi_next_upstream_timeout 0; fastcgi_connect_timeout 60s; } fastcgi_connect_timeout 60s; location ~ \.php$ { try_files $uri =404; include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_read_timeout 60s; fastcgi_send_timeout 60s; fastcgi_next_upstream_timeout 0; fastcgi_connect_timeout 60s; } 

php www.conf

 pm = static pm.max_children = 8 pm = estático pm = static pm.max_children = 8 

Espero que la testing de carga para saturar a los trabajadores de PHP con bastante rapidez. Pero también espero que nginx continúe aceptando conexiones y después de que los timeouts de fast_cgi sean alcanzados, comience a devolver algún tipo de código de error HTTP.

Lo que estoy viendo es nginx devolver 502s casi inmediatamente después de la testing se inicia.

nginx error.log

 2014/11/01 20:35:24 [error] 16688#0: *25837 connect() to unix:/var/run/php5-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: OBFUSCATED, server: OBFUSCATED, request: "GET /?bust=1 HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "OBFUSCATED" 2014/11/01 20:35:24 [error] 16688 # 0: * 25837 connect () a unix: /var/run/php5-fpm.sock failed 2014/11/01 20:35:24 [error] 16688#0: *25837 connect() to unix:/var/run/php5-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: OBFUSCATED, server: OBFUSCATED, request: "GET /?bust=1 HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "OBFUSCATED" (11: Recurso no disponible temporalmente) mientras se conecta a upstream, cliente: OBFUSCATED, 2014/11/01 20:35:24 [error] 16688#0: *25837 connect() to unix:/var/run/php5-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: OBFUSCATED, server: OBFUSCATED, request: "GET /?bust=1 HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "OBFUSCATED" server: OBFUSCATED, request: "GET /? bust = 1 HTTP / 1.1", upstream: 2014/11/01 20:35:24 [error] 16688#0: *25837 connect() to unix:/var/run/php5-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: OBFUSCATED, server: OBFUSCATED, request: "GET /?bust=1 HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "OBFUSCATED" 

¿Qué me estoy perdiendo? ¿Por qué las requestes pendientes no están en la queue, y luego se completan o se agotan más tarde en el process?

Esto significa que la parte php se estrelló y no está escuchando más en el socket unix.

Así que nginx no hará queue nada, ya que simplemente no puede ponerse en contacto con el server proxy para enviar la request, y en este momento, puede imaginar fácilmente que las requestes se procesan muy rápido en el lado de nginx.

Si su server php no se fastcgi_connect_timeout , las requestes estarían de hecho en espera con respecto a los valores fastcgi_connect_timeout y fastcgi_read_timeout , esperando que aparezca algún evento. Si se alcanzaron estos times de espera, debería ver 504 códigos de error.

Su worker_connections parece un poco bajo por cierto comparado con rlimit.

También puede ser el momento de empezar a usar un bloque upstream para decidir cómo nginx debe comportarse cuando los serveres de destino se ven afectados, mediante controles de estado. Con esto usted puede manejar cuánto time es el retraso que, una vez alcanzado, marcará un server como abajo. Una vez considerados, las requestes no le alcanzarán hasta que la condición de salubridad para marcarlo vuelva a pasar.

Su problema es más probable con su configuration de PHP-FPM, porque está utilizando el gestor de processs estático con sólo 8 processs secundarios. Casi cualquier testing de carga utilizará esos 8 processs de niño al instante y pedirá más – cuando no hay un process de ocioso para procesar el código PHP, obtendrá los 502 errores que está viendo.

Usted debe cambiar a la dinámica, o incluso mejor (en mi opinión), ondemand.

Además, establezca sus max_children bastante altos, dependiendo de qué tipo de testings de carga está ejecutando. Sin saber los detalles de las testings que está ejecutando, no puedo sugerir valores para max_children. En mi caso, donde tengo varios sitios que como un set get ~ 2.500 visitantes únicos y ~ 15.000 páginas vistas diarias, mi max_children se establece en 64 y nunca se llega incluso cerca de ese número. Lo configuro más alto de lo que necesito porque las testings de carga han indicado que mi server puede manejar bastante más tráfico de lo que está recibiendo actualmente.

Una vez que tengas las testings de carga funcionando bien tendrás una mejor idea de cómo ajustar tu configuration de PHP-FPM. Yo diría que set max_children a 64 como yo lo hago; acaba de comprobar el logging PHP-FPM para ver si usted está golpeando contra ese límite y ajustar hacia arriba según sea necesario.