web-dev-qa-db-fra.com

Nginx en amont, connexion prématurément fermée lors de la lecture de l'en-tête de réponse en amont, pour les demandes volumineuses

J'utilise nginx et le serveur de noeud pour répondre aux demandes de mise à jour. Je reçois un délai d'attente de la passerelle lorsque je demande une mise à jour pour des données volumineuses. J'ai vu cette erreur dans les journaux d'erreurs nginx:

2016/04/07 00:46:04 [erreur] 28599 # 0: * 1 connexion en amont fermée prématurément lors de la lecture de l'en-tête de réponse en amont, client: 10.0.2.77, serveur: gis.oneconcern.com, requête: "GET/update_mbtiles/atlas19891018000415 HTTP/1.1 ", en amont:" http://127.0.0.1:7777/update_mbtiles/atlas19891018000415 ", hôte:" gis.oneconcern.com "

J'ai googlé pour l'erreur et essayé tout ce que je pouvais, mais j'obtiens toujours l'erreur. 

Mon conf nginx a ces paramètres de proxy:

    ##
    # Proxy settings
    ##

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

Voici comment mon serveur est configuré 

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

}

J'utilise un backend nodejs pour traiter les requêtes sur un serveur aws. L'erreur de passerelle ne s'affiche que lorsque la mise à jour prend beaucoup de temps (environ 3-4 minutes). Je ne reçois aucune erreur pour les mises à jour plus petites. Toute aide sera grandement appréciée. 

Node code js:

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!');
});
}

Je vous remercie.

30
Divya Konda

Je pense que cette erreur de Nginx indique que la connexion a été fermée par votre serveur nodejs (c'est-à-dire "en amont"). Comment est-ce que nodejs est configuré?

5
SilentMiles

J'ai résolu ce problème en définissant une valeur de délai plus élevée pour le proxy:

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

Documentation: https://nginx.org/en/docs/http/ngx_http_proxy_module.html

9
Lowinput

Vous pouvez augmenter le délai d’expiration dans le noeud comme ceci.

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

2
tanner burton

J'ai eu la même erreur pendant un certain temps, et voici ce qui l'a corrigé pour moi.

J'ai simplement déclaré en service que j'utilise ce qui suit:

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

Ce qui devrait retenir votre attention ici est "Après = network.target" . J'ai passé des jours et des jours à chercher des correctifs du côté de nginx, alors que le problème était justement cela . lancez directement la commande ExecStart et essayez de reproduire le bogue. Si cela ne se produit pas, cela signifie simplement que votre service a un problème. Au moins c'est comme ça que j'ai trouvé ma réponse.

Bonne chance à tous les autres!

1
millenion