2012-07-19 17 views
17

Tengo un servidor ubuntu y un sitio web bastante cargado. Servidor es:Nginx y php-fpm: no se puede deshacer de los errores 502 y 504

  • Dedicado a nginx, utiliza php-FPM (sin Apache), mysql se encuentra en diferente máquina
  • tiene 8 GB de RAM
  • recibe alrededor de 2.000 solicitudes por segundo.

Cada proceso php-FPM consume alrededor de 65 MB de RAM, de acuerdo con top comando:

top command

Memoria libre:

[email protected]:~$ free -m 
      total  used  free  shared buffers  cached 
Mem:   7910  7156  753   0  284  2502 
-/+ buffers/cache:  4369  3540 
Swap:   8099   0  8099 

PROBLEMA

Últimamente, estoy experimentando grandes problemas de rendimiento. los tiempos de respuesta muy grandes, muy numerosos Gateway Timeouts y en las noches, cuando la carga se eleva, el 90% de los usuarios sólo ver en lugar de la página web (me parece que no puede reproducir este) "Servidor no encontrado"


REGISTROS

registro de errores

Mi Nginx está llena de los mensajes de barbecho:

2012/07/18 20:36:48 [error] 3451#0: *241904 upstream prematurely closed connection while reading response header from upstream, client: 178.49.30.245, server: example.net, request: request: "GET /readarticle/121430 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9001", host: "example.net", referrer: "http://example.net/articles" 

que he intentado cambiar al socket de Unix, pero aún así obtener esos errores:

2012/07/18 19:27:30 [crit] 2275#0: *12334 connect() to unix:/tmp/fastcgi.sock failed (2: No such file or directory) while connecting to upstream, client: 84. 
237.189.45, server: example.net, request: "GET /readarticle/121430 HTTP/1.1", upstream: "fastcgi://unix:/tmp/fastcgi.sock:", host: "example.net", referrer: "http 
://example.net/articles" 

y log php-FPM está llena de estos:

[18-Jul-2012 19:23:34] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 75 total children 

He tratado para aumentar los parámetros dados hasta 100, pero todavía no parece suficiente.


CONFIGS

Aquí está mi configuración actual

php-FPM

listen = 127.0.0.1:9001 
listen.backlog = 4096 
pm = dynamic 
pm.max_children = 130 
pm.start_servers = 40 
pm.min_spare_servers = 10 
pm.max_spare_servers = 40 
pm.max_requests = 100 

nginx

worker_processes 4; 
worker_rlimit_nofile 8192; 
worker_priority 0; 
worker_cpu_affinity 0001 0010 0100 1000; 

error_log /var/log/nginx_errors.log; 

events { 
    multi_accept off; 
    worker_connections 4096; 
} 


http { 
    include  mime.types; 
    default_type application/octet-stream; 

    access_log off; 
    sendfile  on; 
    keepalive_timeout 65; 
    gzip on; 

    # fastcgi parameters 
    fastcgi_connect_timeout 120; 
    fastcgi_send_timeout 180; 
    fastcgi_read_timeout 1000; 
    fastcgi_buffer_size 128k; 
    fastcgi_buffers 4 256k; 
    fastcgi_busy_buffers_size 256k; 
    fastcgi_temp_file_write_size 256k; 
    fastcgi_intercept_errors on; 

    client_max_body_size 128M; 

    server { 
     server_name example.net; 
     root /var/www/example/httpdocs; 
     index index.php; 
     charset utf-8; 
     error_log /var/www/example/nginx_error.log; 

     error_page 502 504 = /gateway_timeout.html; 

     # rewrite rule 
     location/{ 
      if (!-e $request_filename) { 
       rewrite ^(.*)$ /index.php?path=$1 last; 
      } 
     } 
     location ~* \.php { 
      fastcgi_pass 127.0.0.1:9001; 
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
      fastcgi_param PATH_INFO $fastcgi_script_name; 
      include fastcgi_params; 
     } 
    } 
} 

Estaría muy agradecido por cualquier consejo sobre cómo identificar el problema y qué parámetros puedo ajustar para solucionarlo. ¿O quizás 8 GB de RAM no son suficientes para este tipo de carga?

+0

no estoy muy seguro acerca de los detalles de su configuración, pero es posible que desee para calcular la cantidad de memoria que podría estar consumiendo. Una suposición rápida sería que sus 130 niños de 65mb necesitan 8,5 gigas (sin usar realmente ningún cerebro para el problema 1000/1024, pero sin contar otros procesos). Comenzaría por verificar si tienes memoria suficiente para tener a todos esos niños corriendo con todos los demás procesos, por supuesto. – Nanne

+0

65mb es bastante para una página web. Verificaría por qué la aplicación web está tan hambrienta de recursos. Aparte de eso, todo es lógico. 502 ocurre cuando nginx no recibió una respuesta adecuada de php5-fpm en el tiempo. ADVERTENCIA: [www piscina] parece ocupado sucede cuando php5-FPM no puede crear una más clild proceso para procesar la próxima consulta –

+1

Probablemente, los procesos PHP-FPM se bloquean en el acceso de MySQL. – VBart

Respuesta

1

Una serie de cuestiones. Todavía vale la pena arreglarlos con un sitio tan ocupado. MySQL puede ser la causa raíz por ahora. Pero a largo plazo necesitas hacer más trabajo.

almacenamiento en caché

veo uno de sus msg de error que muestra una petición GET a la php aguas arriba. Esto no se ve bien con un sitio de tráfico tan alto (2000 r/s como usted mencionó). Esta página (/ readarticle/121430) parece una página perfectamente caché. Para empezar, puede usar nginx para almacenar en caché dichas páginas. Salida fastcgi cache

GET /readarticle/121430 

php-FPM

pm.max_requests = 100 

El valor significa que un proceso será matado por php-FPM maestro después de servir 100 solicitudes. php-fpm usa ese valor para luchar contra filtraciones de memoria de terceros. Su sitio está muy ocupado, con 2000r/s. Tus procesos secundarios máximos son 130, cada uno solo puede servir como máximo a 100 solicitudes. Eso significa que después de 13000/2000 = 6.5 segundos, todos ellos serán reciclados. Esto es demasiado (20 procesos mueren por segundo). Al menos debería comenzar con un valor de 1000 y aumentar ese número siempre que no vea pérdida de memoria. Alguien usa 10,000 en producción.

nginx.conf

  • Número 1:

    if (!-e $request_filename) { 
         rewrite ^(.*)$ /index.php?path=$1 last; 
        } 
    

    debe sustituirse por try_files más eficientes:

    try_files $uri /index.php?path=$uri; 
    

Se ahorra un extra if bloque de ubicación y una coincidencia de regla de reescritura regex.

  • Problema 2: uso de socket Unix le ahorrará más tiempo que utilizando IP (alrededor del 10-20% de mi experiencia). Es por eso que php-fpm lo usa por defecto.

  • Problema 3: Puede que esté interesado en configurar conexiones keepalive entre nginx y php-fpm. Se da un ejemplo here en el sitio oficial de nginx.

+0

+1 para try_files. Issue2 si estoy correctamente puede hacerlo utilizando sockets unix en lugar de tcp. Estoy usando una configuración muy similar a @Silver Light y con unix socket, php-fpm y apc puedo llegar a 200k usuarios en wordpress. – spinus

0

en aras de tener una respuesta para esta pregunta:

You should check your MySQL server. Probably it's overloaded or it limits count of parallel MySQL connections. You should find the bottleneck. And according to your top screenshot it doesn't look like either RAM or CPU, then it's most likely I/O. - @VBrat

cosas que usted puede hacer en el futuro:

1- aumentar el tamaño de la memoria RAM.

2- uso de caché. vea this article en cómo la caché puede acelerar su sitio

3- reduce el número de consultas que se ejecutan.

1

que necesita ver a su php.ini settings y no creo que esto esté relacionado con MySQL, ya que parece que tienes errores de socket. Además, ¿esto es algo que comienza a suceder después de un período de tiempo o sucede inmediatamente cuando se reinicia el servidor?

intente reiniciar el demonio php5-pies por minuto y ver lo que sucede mientras la cola el registro de errores.

compruebe el archivo php.ini y también todas sus fastcgi_params suelen encontrarse en/etc/nginx/fastcgi_params. Hay un montón de ejemplos de lo que estás tratando de hacer.

Además, ¿tiene habilitada la extensión php apc almacenamiento en caché?

Se parece a esto en su archivo php.ini si su lámpara en una pila:

extensión = apc.so
....
apc.enabled = 0

Probablemente wouldn' Me duele hacer algunas pruebas de carga de conexión mysql desde la línea de comandos y ver cuáles son los resultados.

+0

APC es algo muy bueno. Me ayudó mucho mantener el sitio rápido (especialmente wordpress). – spinus

0
  • instalación de la extensión de APC para PHP (cheque/configure)
  • MySQL - Comprobar configuración, indexs, consultas lentas
  • Instalar y configurar barniz. Esto puede almacenar en caché las solicitudes de página y ser bastante útil para reducir la cantidad de solicitudes de php y consultas de mysql que necesita realizar. Puede ser complicado con cookies/ssl pero, por lo demás, no es demasiado difícil y vale la pena ejecutarlo
Cuestiones relacionadas