nginx proxy_pass con servidores dinámicos ascendentes

nginx proxy_pass con servidores dinámicos ascendentes

Actualmente estamos atrapados en una situación en la que utilizamos nginxcomo nuestro servidor frontend principal un conjunto de servicios respaldados por un descubrimiento de servicios dinámico basado en DNS con Mesos-DNS.

Nuestra configuración de nginx se parece un poco a esto;

http {
  resolver 10.10.1.1 valid=1s; // some internal DNS server
}

server {
  set $core_api core-api-service.marathon.mesos; // some internal DNS
  location /api {
    proxy_pass $core_api:8080; // resolve core_api DNS dynamically to one of the IP's of the slave the process is running + listening on
  }
}

Ahora el problema es que esta configuración funciona correctamente, pero una de cada 4 o 5 solicitudes siempre da como resultado que Nginx devuelva un 404, lo cual no tiene sentido porque ninguno de los servicios que se ejecutan dentro del clúster se ha movido a un esclavo diferente.

Ahora, el solucionador valid=1ses bastante agresivo, por lo que lo ampliamos a períodos más largos, pensando que tal vez eso era consultar el DNS con demasiada frecuencia. Pero cualquier valor allí causa los mismos problemas. Quitar el valid=xxtampoco ayuda.

¿Que está pasando aqui? ¿Cómo mitigamos esto?

Gracias.

EDITAR (configuración completa)

server {
    listen       80;
    server_name  .myapp.com;
    return       301 https://www.myappname.com$request_uri;
}

server {
        listen   80;

        gzip on;
        gzip_min_length  1100;
        gzip_buffers  4 32k;
        gzip_types    text/plain application/x-javascript text/xml text/css;
        gzip_vary on;

        root /usr/share/nginx/www;
        index index.html index.htm;
        include /etc/nginx/mime.types;
        server_name api.myappname.com;
        error_page 404 /static/404.html;
        error_page 403 /static/404.html;
        error_page 503 /static/503.html;
        error_page 502 /static/502.html;
        set $core_api http://core_api.marathon.mesos;

        location /api {
                if ($http_x_forwarded_proto != 'https') {
                        rewrite ^ https://$host$request_uri? permanent;
                }
                limit_req   zone=one  burst=35;
                limit_req_status 503;
                proxy_pass            $core_api:8080;
                proxy_set_header      X-Real-IP  $remote_addr;
        }
}

información relacionada