web-dev-qa-db-fra.com

Obtention de 504 NodeJs GATEWAY_TIMEOUT

Je reçois une réponse 504 GATEWAY_TIMEOUT http après 60 secondes de chargement de page.

Ce n'est pas une page en cours de chargement, mais un processus en cours d'exécution. Je m'attends à ce que cela prenne plus de 60 ans et j'ai essayé d'augmenter la valeur de délai d'attente, mais cela n'a pas aidé.

J'utilise express framework pour le routage et j'héberge le travail sur EB (AWS Elastic Beanstalk). Étant donné que j'ai augmenté toutes les valeurs de délai d'attente que je pouvais éventuellement trouver sur EB et Load Balancers dans la console AWS, je suppose que ce doit être l'application elle-même dont le délai d'attente est défini sur 60 secondes. Cependant, je peux me tromper.

Mon code:

/* GET home page. */
router.get('/main',function(req, res, next) {
req.connection.setTimeout(600000);
        mainProcess(res);
        //res.send("mainProcess() called");
    });

METTRE À JOUR:

En plus de cela, j'ai essayé une approche différente. J'ai ajouté ce code au app.js:

var connectTimeout = require('connect-timeout');
var longTimeout = connectTimeout({ time: 600000 });
app.use(longTimeout);

Je n'ai pas aidé non plus.

UPDATE2: J'ai aussi essayé d'augmenter le délai d'attente dans /bin/www comme ceci:

var server = http.createServer(app);
server.timeout=600000;

UPDATE3: J'ai remarqué que le délai d'attente est lié à la configuration de nginx. Comme mes journaux disent: upstream timed out (110: Connection timed out) while reading response header Cependant, je ne peux pas trouver un moyen de modifier nginx config sur Elastic beanstalk. J'ai fait des recherches, mais tout cela me semble non standard et trop rigide pour une chose aussi simple.

9
Ondrej Tokar

D'après vos informations Update3, vous devriez configurer votre fichier de configuration nginx, comme suit:

server {
    listen  80;
    server_name     *.*;
    location / {
            proxy_pass http://192.168.0.100:8001;
            proxy_connect_timeout 60s;
            proxy_read_timeout 5400s;
            proxy_send_timeout 5400s;
            proxy_set_header Host $Host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_redirect default;
    }
}

proxy_read_timeout et proxy_send_timeout sont liés à votre problème.

4
Ken

Normalement, lorsqu'un travail prend plus de 30 ou 40 secondes, je préviens généralement l'utilisateur qui l'exécute, puis je crée un processus pour utiliser la base de données au lieu d'une requête normale au serveur afin d'éviter que l'utilisateur n'attende la requête pour éviter ce problème de délai d'attente, vous pouvez essayer ceci par exemple lorsque vous configurez le serveur pour qu'il écoute un port spécifié:

//Create server with specified port
var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
});
//set timeout time
server.timeout = 1000;
3
Fernando Zamperin

Dans votre fichier de configuration .ebextensions, ajoutez le code suivant:

container_commands:
  change_proxy_timeout:
    command: |
      sed -i '/\s*location \/ {/c \
              location / { \
                  proxy_connect_timeout       300;\
                  proxy_send_timeout          300;\
                  proxy_read_timeout          300;\
                  send_timeout                300;\
              ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

J'ai eu le même problème alors j'ai essayé de définir timeout = 120000 comme suit:

var server= http.createServer(app).listen(port, function()
{
    console.log("Express server listening on port " + port)
})
server.timeout = 120000;
1
HamidKhan