Be a happy coder

You are here

Nginx php-fpm, sockets unix y el error 502 Bad gateway

14 Feb 2012

El uso de sockets unix para la comunicación de nginx y php-fpm es recomendable, ya que nos da mejor rendimiento que realizando la conexión por tcp.

Durante momentos de alta carga en el servidor, nginx comenzó a lanzar pantallas "502 Bad Gateway", en lugar de nuestras bonitas páginas generadas por php. Tras comprobar el log de nginx, este error aparecía de forma repetida:

2012/02/13 15:32:01 [error] 1000#0: *28859 connect() to unix:/tmp/php5-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 50.18.121.64, server: www.server.com, request: "HEAD /club - HTTP/1.1", upstream: "fastcgi://unix:/tmp/php5-fpm.sock:", host: "www.server.com"

Creando un pequeño fichero php que sólo hacía un echo, experimente con ab (Apache HTTP server benchmarking tool):

ab -kc 100 -n 1000 http://www.server.com/javitest.php

El resultado era correcto, pero al subir a 200 conexiones, saltaba el error 502. Probando, se comprueba que hay un límite de 128 conexiones encoladas por nginx. Profundizando un poco más, existe un límite de 128 conexiones que pueden ser encoladas en escucha para los socket unix. De modo, que necesitamos incrementar ese límite:

root@localhost~# sysctl net.core.somaxconn=1024

Subo el límite para nginx, al doble:

worker_connections 2048;

invoke-rc.d php5-fpm restart && invoke-rc.d nginx restart

Reinicio de los servicios y parece que las páginas 502 ya no vuelven a salir.

Server Software:        nginx/1.0.12
Server Hostname:        server.com
Server Port:            80

Document Path:          /javitest.php
Document Length:        185 bytes

Concurrency Level:      500
Time taken for tests:   0.301 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Non-2xx responses:      5000
Keep-Alive requests:    5000
Total transferred:      1980000 bytes
HTML transferred:       925000 bytes
Requests per second:    16632.85 [#/sec] (mean)
Time per request:       30.061 [ms] (mean)
Time per request:       0.060 [ms] (mean, across all concurrent requests)
Transfer rate:          6432.23 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   6.3      0      25
Processing:     0   26  15.9     27      65
Waiting:        0   26  15.9     27      65
Total:          0   28  16.8     28      75

Percentage of the requests served within a certain time (ms)
  50%     28
  66%     35
  75%     39
  80%     42
  90%     50
  95%     55
  98%     63
  99%     67
 100%     75 (longest request)

Con 500 conexiones, no tenemos problema.

Etiquetas: