Sinatra + Thin + Nginx conectó() fallido (111: conexión rechazada) mientras se conectaba al servidor ascendente.
Tengo una aplicación Sinatra que se ejecuta en Thin con Nginx como proxy inverso y recibe mucho tráfico. Mis usuarios informan errores 502 y al revisar los registros de Nginx veo muchos como estos:
[warn] upstream server temporarily disabled while connecting to upstream
connect() failed (111: Connection refused) while connecting to upstream
Si reviso los registros de la aplicación Sinatra, no veo ningún error.
Estoy iniciando Thin con lo siguiente:
--max-conns 15360 --max-persistent-conns 2048 --threaded start
He configurado lo siguiente para Nginx:
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 15360;
}
El archivo de host para la aplicación Sinatra:
server {
server_name mysinatra_app;
# muchos bots intentan encontrar vulnerabilidades en sitios de PHP
location ~ \.php {
return 404;
}
location / {
proxy_pass http://localhost:6903;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
# aumentar buffers
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
}
listen 443 ssl; # gestionado por Certbot
# ...
# configuración SSL
}
¿Por qué está sucediendo esto? ¿Es demasiado tráfico?
¿Cuál es la solución? ¿Debo seguir aumentando las worker_connections
y --max-conns
hasta que los errores se detengan?
La salida de htop
parece indicar que el servidor puede manejar más:
¿Alguna idea/consejo?
EDIT:
Si bien no veo ningún error en el registro de Sinatra o en la salida de systemctl status
, noté que el servicio nunca se ejecuta durante mucho tiempo, por lo que parece que el servidor Thin se bloquea a menudo. ¿Alguna idea de cómo puedo depurar esto más?
davy.ai
Respuesta
Causa Raíz
El mensaje de error
502
significa que el servidor aguas arriba (en este caso, Thin) no está respondiendo correctamente a las solicitudes enviadas por Nginx. Nginx actúa como un proxy inverso, por lo que reenvía las solicitudes que recibe al servidor backend correspondiente, que en este caso es Thin.El mensaje de error indica que Nginx tiene problemas para conectarse a Thin y que Thin puede estar rechazando las conexiones. Esto puede estar sucediendo porque se ha alcanzado el número máximo de conexiones al servidor Thin, o bien Thin se está bloqueando con frecuencia.
Solución
Aumentar worker_connections y max-conns
Aumentar la configuración
worker_connections
en Nginx y la opción--max-conns
en Thin puede ayudar a resolver el problema. Pero es una solución a corto plazo y no resolverá la causa raíz del problema.Cuando aparece este mensaje de error, Nginx debería estar disponible para manejar más conexiones, como se muestra en la salida de
htop
. Esto indica que el cuello de botella se encuentra en el servidor backend. Si el cuello de botella se encuentra en Thin, aumentar--max-conns
puede crear más inestabilidad en el servidor.Depuración de Thin
Para depurar Thin, debemos averiguar por qué se bloquea con frecuencia.
systemctl status
y verifica si hay informes de bloqueo o registros relevantes allí.También puedes iniciar Thin en modo de depuración para obtener más detalles sobre lo que está sucediendo. Por ejemplo, con el comando
bundle exec thin start --debug
, Thin registrará información de depuración y luego podrás comprobarla para ver qué está sucediendo.Otra prueba que puedes realizar es quitar el componente de proxy inverso de Nginx y probar si el problema persiste. Esta prueba te permitirá aislar si la causa del error está en Thin o en la conexión desde Thin a Nginx.
Conclusión
La causa raíz de este mensaje de error es que el servidor aguas arriba (Thin) no está disponible o está rechazando las conexiones provenientes de Nginx. Aumentar la configuración
worker_connections
en Nginx y la opción--max-conns
en Thin puede resolver temporalmente este problema.Sin embargo, para resolver completamente el problema, es necesario identificar por qué Thin se bloquea con frecuencia y resolver este problema. No existe una solución universal, por lo que es mejor utilizar las técnicas de depuración descritas anteriormente para identificar la causa del problema.