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