nginx proxy_pass mit dynamischen Upstream-Servern

nginx proxy_pass mit dynamischen Upstream-Servern

Wir stecken derzeit in einer Situation fest, in der wir als unseren Haupt-Frontend-Server eine Reihe von Diensten verwenden, nginxdie durch eine dynamische DNS-basierte Diensterkennung mit Mesos-DNS unterstützt werden.

Unsere Nginx-Konfiguration sieht ungefähr so ​​aus;

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
  }
}

Das Problem besteht nun darin, dass dieses Setup ordnungsgemäß funktioniert, aber eine von 4–5 Anfragen immer dazu führt, dass Nginx eine 404 zurückgibt, was keinen Sinn ergibt, da keiner der im Cluster ausgeführten Dienste auf einen anderen Slave verschoben wurde.

Da der Resolver valid=1sziemlich aggressiv ist, haben wir ihn auf längere Zeiträume ausgedehnt, weil wir dachten, dass er den DNS vielleicht zu oft abfragt. Aber jeder Wert dort verursacht die gleichen Probleme. Das Entfernen valid=xxhilft auch nicht.

Was ist hier los? Wie können wir das eindämmen?

Danke.

BEARBEITEN (vollständige Konfiguration)

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;
        }
}

verwandte Informationen