es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

Imagen de htop

¿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?

Tags:  , , ,

Answer

  1. Avatar for 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.

    1. Primero, comprueba la salida de systemctl status y verifica si hay informes de bloqueo o registros relevantes allí.
    2. Revisa cualquier información contenida en los registros de la aplicación Sinatra relacionados con Thin.
    3. Verifica los registros de Thin en busca de mensajes de error o advertencias.

    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.

Comments are closed.