504 Gateway Timeout - deux EC2 instances avec équilibreur de charge

C'est peut-être le problème impossible. J'ai tout essayé. J'ai l'impression qu'il y a un type AU standard qui fait tourner sa moustache.

Le problème:

J'ai Amazon EC2 qui exécute une application. Il fonctionne sans problème lorsqu'il n'y a qu'une seule instance et aucun équilibreur de charge.

mais dans mon environnement de production j'ai deux instances identiques tournant derrière un équilibreur de charge et quand j'exécute certaines tâches, comme une fonctionnalité cela génère un PDF et l'attache à un e-mail, rien ne se passe du tout, et lorsque vous utilisez Google Developer tools avec L'onglet Réseau, j'obtiens l'erreur "504 Gateway Timeout" une fois que le timeout atteint (Je l'ai réglé à 30 secondes).

ma base de données est externe, sur Amazon RDS.

je pense.... Si je pouvais forcer un client à rester connecté à son serveur initial sur lequel il s'est connecté, ce problème serait résolu, parce que je crois comprendre que le délai d'attente de la passerelle 504 est se produit lorsque l'instance-1 essaie de contacter l'instance-2 pour effectuer la tâche.

cela ne se produit QU'avec L'équilibrage de charge, mais jamais en se connectant directement à l'un de mes deux serveurs.

Équilibrage De La Charge De Paramètres:

  • L'équilibreur de charge a une CRECORD sur mon Greffier, de sorte que app.myapplication.com points à myloadbalancerDNSname.elb.amazonaws.com
  • L'équilibreur de charge a 2 sain cas, chaque fois dans la même région mais ils sont dans des zones de disponibilité différentes.
  • Le programme d'équilibrage de charge en utilisant les mêmes Groupes de Sécurité comme les Instances (permettre à TOUTES les adresses ip sur les ports 22, 80 et 443)
  • le répartiteur de charge a mis en marche l'équilibrage de charge à travers la zone.
  • de la SCRO (Amazon S3) est activé pour GET, POST, PUT, DELETE de * à * (je n'ai aucune idée de comment cela est associé à mon cas, mais de toute façon, je n'ai que les instructions dit)
  • L'équilibreur de charge a des auditeurs configuré comme tel:
    • Équilibrage de la Charge de Protocole:HTTP Équilibreur de Charge Port:80 Exemple de Protocole:HTTP Instance de Port:80
    • Load Balancer Protocol: HTTPS Load Balancer Port: 443 Instance Protocol: HTTP Instance Port: 80 (cipher choisi correctement par mon fournisseur de Cert, et les champs SSL 100% sûrement correct)

encore quelques idées:

cela étant dit, je suis pas de test avec HTTPS, mais HTTP normal à la place. Je ne suis pas convaincu que SSL soit configuré correctement, même si mon fournisseur de certificat l'a dit. La raison pour laquelle je me méfie, c'est que quand j'essaie d'entrer https://app.myapplication.com j'obtiens l'erreur "(échoué) net::ERR_CONNECTION_CLOSED" dans les outils de développement Google, dans l'onglet Réseau. Mais cela ne devrait pas être applicable parce que j'ai le problème même en utilisant HTTP régulier. Je peux dépanner SSL plus tard.

Donc réitérer, mon problème est d'avoir le problème" 504 Gateway Timeout " lors de l'utilisation de certaines fonctions, mais aussi occasionnellement au hasard au lieu de charger la page (mais rarement). Ce problème de 504 ne se produit que LORSQU'on utilise L'équilibrage de charge, mais jamais lorsqu'on se connecte directement à l'une de mes deux instances.

Je ne sais pas quelle question poser, parce que j'ai suivi chaque document au T, double et triple vérifié toutes les suggestions partout sur le web et rien.

15
demandé sur user3035649 2014-10-24 10:56:21

5 réponses

Quel serveur web utilisez-vous? J'ai eu un problème très similaire avec Nginx et l'équilibrage de charge AWS. J'ai ajouté keepalive_timeout 75s; au bloc http dans mon fichier de configuration nginx et je n'ai pas vu le problème depuis.

assurez-vous de redémarrer nginx après avoir ajouté et sauvegardé cette ligne (sur ubuntu sudo service nginx restart. Sur redhat arrêter de nginx /path/to/nginx/executable -s stop/path/to/nginx/executable pour le démarrage de nginx)

cette correction a été recommandée par AWS sur leur page d'aide AWS équilibrage de la Charge de dépannage

10
répondu Maximus 2014-12-31 22:55:33

tout d'abord, quel est le temps mort de votre Elbe? Vous trouverez au bas de l'onglet "Description" pour votre équilibreur de charge. Vous pouvez en savoir plus sur le temps mort ici dans l'ELB documentation. La valeur par défaut est de 60 secondes. Vous devriez également envisager de configurer ou d'augmenter Keep-alive dans votre serveur web. La façon dont vous le faites dépendra du serveur web que vous utilisez.

Deuxièmement, si vous pensez que c'est dû au client de passer d'une instance pour les autres, vous devriez l'activer stickiness session dans la ELB. Cela permettra de s'assurer qu'un client est toujours dirigé vers la même instance d'arrière-plan par le répartiteur de charge. Pour activer ceci, allez à nouveau dans l'onglet "Description" puis cliquez sur le lien Modifier à côté de chaque entrée dans la section Configuration du Port. Vous voudrez probablement choisir l'option "Activer L'autocollant de Cookie généré par Load Balancer" car cela indiquera à la BEI de gérer tous les aspects de l'autocollant.

5
répondu Bruce P 2014-10-24 14:46:56

Dans mon cas, il s'avère qu'il n'y a pas de problème avec l'équilibrage de charge. La solution finale étant le fichier hosts D'Ubuntu dans lequel il y avait une entrée inexplicable pour acheminer le trafic d'une certaine adresse IP mystère au nom d'hôte de mon application. Ainsi, pendant le processus de création du PDF, les chemins étaient réécrits par le générateur de PDF pour pointer vers le serveur mystère, et donc les problèmes de temporisation de la passerelle. Je ne sais pas pourquoi ça marchait de temps en temps et pas défaillant.

127.0.0.1 localhost
127.0.1.1 ubuntu-server
42.139.126.191 app.myapp.com

C'est à ça que ça ressemblait, alors j'ai enlevé cette troisième ligne et tous les engrenages ont recommencé à tourner. :P

3
répondu user3035649 2015-01-05 09:33:55

nous utilisons des instances EC2 D'Amazon derrière un ELB D'Amazon et nous avons eu 504 erreurs GATEWAY_TIMEOUT. Nous utilisons Apache et PHP sur des serveurs Web Ubuntu.

Dans notre cas, l'erreur était due à l'serveurs à court de mémoire. Nous n'avons pas vu le "out of memory" dans nos journaux D'erreurs Apache. Il y avait une entrée de ligne 504 dans les journaux D'accès Apache. Nous avons confirmé la "mémoire" en regardant dans le fichier syslog ( /var/log/syslog ) et fixe le problème de mémoire.

ceci résolu l'erreur 504 pour nous.

2
répondu Rainbard 2015-10-16 04:35:49

vérifiez les paramètres des groupes de sécurité. L'accès au port 80 peut être limité.

0
répondu Henry 2017-11-05 07:02:34