it-swarm.com.de

Nginx-Upstream-Verbindung wurde vorzeitig geschlossen, während der Antwortheader für Upstream-Anfragen gelesen wurde

Ich verwende Nginx und einen Knotenserver, um Aktualisierungsanforderungen zu liefern. Ich erhalte ein Gateway-Timeout, wenn ich ein Update großer Daten anfordere. Ich habe diesen Fehler aus den Nginx-Fehlerprotokollen gesehen:

2016/04/07 00:46:04 [error] 28599 # 0: * 1 Upstream vorzeitig geschlossene Verbindung, während der Antwortheader von Upstream gelesen wurde. Client: 10.0.2.77, Server: gis.oneconcern.com, Abfrage: "GET/update_mbtiles/atlas19891018000415 HTTP/1.1 ", Upstream:" http://127.0.0.1:7777/update_mbtiles/atlas19891018000415 ", Host:" gis.oneconcern.com "

Ich habe nach dem Fehler gegoogelt und alles versucht, was ich konnte, aber ich bekomme immer noch den Fehler. 

Mein nginx conf hat folgende Proxy-Einstellungen:

    ##
    # Proxy settings
    ##

    proxy_connect_timeout 1000;
    proxy_send_timeout 1000;
    proxy_read_timeout 1000;
    send_timeout 1000;

So wird mein Server konfiguriert 

server {
listen 80;

server_name gis.oneconcern.com;
access_log /home/ubuntu/Tilelive-Server/logs/nginx_access.log;
error_log /home/ubuntu/Tilelive-Server/logs/nginx_error.log;

large_client_header_buffers 8 32k;
location / {
    proxy_pass http://127.0.0.1:7777;
    proxy_redirect off;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $http_Host;
    proxy_cache_bypass $http_upgrade;
}

location /faults {
    proxy_pass http://127.0.0.1:8888;
    proxy_http_version 1.1;
    proxy_buffers 8 64k;
    proxy_buffer_size 128k;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $Host;
    proxy_cache_bypass $http_upgrade;
}

}

Ich verwende ein nodejs-Backend, um die Anforderungen auf einem aws-Server zu bedienen. Der Gateway-Fehler wird nur angezeigt, wenn die Aktualisierung sehr lange dauert (ca. 3-4 Minuten). Bei kleineren Updates erhalte ich keine Fehlermeldung. Jede Hilfe wird sehr geschätzt. 

Knoten js code:

app.get("/update_mbtiles/:earthquake", function(req, res){
var earthquake = req.params.earthquake
var command = spawn(__dirname + '/update_mbtiles.sh', [ earthquake, pg_details ]);
//var output  = [];

command.stdout.on('data', function(chunk) {
//    logger.info(chunk.toString());
//     output.Push(chunk.toString());
});

command.stderr.on('data', function(chunk) {
  //  logger.error(chunk.toString());
 //   output.Push(chunk.toString());
});

command.on('close', function(code) {
    if (code === 0) {
        logger.info("updating mbtiles successful for " + earthquake);
        tilelive_reload_and_switch_source(earthquake);
        res.send("Completed updating!");
    }
    else {
        logger.error("Error occured while updating " + earthquake);
        res.status(500);
        res.send("Error occured while updating " + earthquake);
    }
});
});

function tilelive_reload_and_switch_source(earthquake_unique_id) {
tilelive.load('mbtiles:///'+__dirname+'/mbtiles/tipp_out_'+ earthquake_unique_id + '.mbtiles', function(err, source) {
    if (err) {
        logger.error(err.message);
        throw err;
    }
    sources.set(earthquake_unique_id, source); 
    logger.info('Updated source! New tiles!');
});
}

Vielen Dank.

30
Divya Konda

Ich denke, dieser Fehler von Nginx zeigt an, dass die Verbindung von Ihrem nodejs-Server (d. H. "Upstream") geschlossen wurde. Wie ist nodejs konfiguriert?

5
SilentMiles

Ich habe dieses Problem gelöst, indem ich einen höheren Timeout-Wert für den Proxy eingestellt habe:

location / {
    proxy_read_timeout 300s;
    proxy_connect_timeout 75s;
    proxy_pass http://localhost:3000;
}

Dokumentation: https://nginx.org/de/docs/http/ngx_http_proxy_module.html

9
Lowinput

Sie können das Timeout im Knoten so erhöhen.

app.post('/slow/request', function(req, res){ req.connection.setTimeout(100000); //100 seconds ... }

2
tanner burton

Ich hatte den gleichen Fehler für eine Weile, und was hat es für mich behoben.

Ich habe im Service einfach erklärt, dass ich Folgendes verwende:

Description= Your node service description
After=network.target

[Service]
Type=forking
PIDFile=/tmp/node_pid_name.pid
Restart=on-failure
KillSignal=SIGQUIT
WorkingDirectory=/path/to/node/app/root/directory
ExecStart=/path/to/node /path/to/server.js

[Install]
WantedBy=multi-user.target

Was hier Ihre Aufmerksamkeit erregen sollte, ist "After = network.target" . Ich habe Tage und Tage auf der Nginx-Seite nach Fixes gesucht, während das Problem nur das war haben, starten Sie den ExecStart-Befehl direkt und versuchen Sie, den Fehler zu reproduzieren. Wenn es nicht knallt, bedeutet das nur, dass Ihr Dienst ein Problem hat. Zumindest fand ich meine Antwort.

Für alle anderen viel Glück!

1
millenion

In meinem Fall habe ich versucht, das Timeout in der Konfigurationsdatei zu erhöhen, aber es hat nicht funktioniert. Später stellte sich heraus, dass es funktionierte, wenn nach weniger Daten gefiltert wurde, die auf einer Seite angezeigt werden sollten. In der Datei views.py habe ich gerade "& Q (year = 2019)" hinzugefügt, um nur die Daten für das Jahr 2019 anzuzeigen. Übrigens, eine dauerhafte Korrektur würde Pagination verwenden.

def list_offers(request, list_type):
context = {}
context['list_type'] = list_type
if list_type == 'ready':
    context['menu_page'] = 'ready'
    offer_groups = OfferGroup.objects.filter(~Q(run_status=OfferGroup.DRAFT) & Q(year=2019)).order_by('-year', '-week')

context['grouped_offers'] = offer_groups

return render(request, 'app_offers/list_offers.html', context)
0
ddss12