3

ContexteWebsocket travaille sur url EC2, mais pas sur l'URL ElasticBeanstalk

Je proxy inverse (nginx) pointant vers ElasticBeanstalk (ELB) qui est un type d'environnement SingleInstance et crée une instance EC2 (EC2). J'utilise une application nodejs nodejs. nginx est le point d'entrée de notre infrastructure.

Desciption

à partir du navigateur, je peux appeler directement les URL Websocket d'un EC2 et de ELB avec le même résultat:

Bienvenue sur SockJS!

Pour nginx J'utilise la configuration suivante (nginx conf.d/my.conf) où je change seulement les URL de EC2 ou ELB sur la ligne commençant par proxy_pass:

location /stomp { 
     proxy_pass <{EC2_URL}/stomp OR {ELB_URL}/stomp>; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_set_header Host $host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header X-Forwarded-Proto $scheme; 
    } 

Les Websockets sur le EC2 L'URL ne fonctionne que très bien.

Websockets sur le ELB URL renvoient un statut d'erreur à mon client:

code: 1002, raison: "Impossible de se connecter au serveur"

La chose la plus étrange est que mon nginx serveur n'enregistre même pas les demandes dans le cas de ELB.

Question

Pourquoi le ELB ne fonctionne pas dans le nginx configuration? Comment le corriger?

Qu'est-ce que j'ai essayé?

J'ai vérifié une question et un blog où ils des conseils à passer outre les fichiers de configuration nginx comme 00_elastic_beanstalk_proxy.conf situé dans located in /tmp/deployment/config/etc#nginx#nginx.conf. Mais mon serveur n'a pas de fichiers de configuration nginx sur le système de fichiers ...

+0

Alors, où nginx tourne-t-il dans votre cas? –

+0

À quel port vous connectez-vous? L'installation Load Balancer par défaut peut uniquement prendre le trafic du port 80 ou du port 443. Si vous utilisez SSL, avez-vous un certificat configuré avec ElasticBeanstalk? Si vous n'obtenez jamais la demande du côté Nginx, il se peut que vous ne puissiez jamais effectuer de transfert à partir de votre équilibreur de charge. Pour voir votre équilibreur de charge, vous devez aller à EC2 -> Load Balancers sur le panneau AWS. – jonzlin95

+0

@ jonzlin95 Nous nous connectons via le port 80. Il n'y a pas d'équilibreurs de charge dans 'EC2 → Load Balancers', mais ce n'est pas une surprise. Parce que nous utilisons uniquement le type d'environnement ELB avec SingleInstance. – zatziky

Répondre

1

Le problème est lié à votre proxy_set_header Host $host;. Les problèmes sont dus à la manière dont le serveur réagit à l'en-tête du nom d'hôte.

Tenir compte lorsque vous ouvrez les urls ci-dessous dans le navigateur

http://ec2-52-59-53-38.eu-central-1.compute.amazonaws.com/stomp http://stag-ws-server.eu-central-1.elasticbeanstalk.com/stomp

Un être EC2 et étant un ELB. Lorsque vous envoyez la demande à ec2, le nom d'hôte est envoyé en tant que ec2-52-59-53-38.eu-central-1.compute.amazonaws.com. Maintenant, si vous avez un service qui écoute sur le port 80 directement ou via docker. Il écoute le port 80 et ne se soucie pas du trafic.

Il suffit de savoir que si quelqu'un accède au serveur par quelque moyen que ce soit, nous répondons. Maintenant, si vous aviez un nginx sur cet EC2, qui écoute seulement un hôte virtuel spécifique et ne répond pas à un autre nom d'hôte, alors si vous l'envoyez ec2-52-59-53-38.eu-central-1.compute.amazonaws.com et qu'il s'attend à voir abc.mydomain.com alors nginx ne répondra pas à la demande.

Même chose est le cas avec votre serveur ELB. Vous hébergez nginx à un nom de domaine abc.domain.com et en utilisant proxy_pass pour transmettre le trafic à ELB. Mais en utilisant proxy_set_header Host $host;, définissez le nom d'hôte sur abc.domain.com et ELB ne peut pas comprendre où se trouve cet hôte. Donc, il ne servira pas la requête et donc l'erreur