3

HintergrundWebsocket arbeitet auf url EC2, aber nicht auf ElasticBeanstalk URL

Ich habe Reverse-Proxy (nginx), der auf ElasticBeanstalk (ELB), die ein SingleInstance Umgebungstyp ist und schafft eine EC2-Instanz (EC2). Ich verwende eine dockerisierte Nodejs-App. nginx ist der Einstiegspunkt für unsere Infrastruktur.

Desciption

Von Browser, kann ich direkt anrufen Websocket URLs eines EC2 und von ELB mit dem gleichen Ergebnis:

Willkommen bei SockJS!

Für nginx ich die folgende Konfiguration verwenden (nginx conf.d/my.conf), wo ich nur URLs von EC2 ändern oder ELB auf der Linie mit proxy_pass beginnen:

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

WebSockets auf der EC2 URL funktionieren nur gut.

Websockets auf der ELB URL zurückgeben einen Fehlerstatus zurück zu meinem Klienten:

Code: 1002 Grund: "Kann keine Verbindung zum Server"

Das Merkwürdigste ist, dass mein nginx Server protokolliert nicht einmal die Anforderungen im Fall von ELB.

Frage

Warum ist die ELB nicht nginx Konfiguration in der Arbeit? Wie man es korrigiert?

Was habe ich ausprobiert?

Ich habe eine question und ein blog geprüft, wo sie Beratung in located in /tmp/deployment/config/etc#nginx#nginx.conf nginx Konfigurationsdateien wie 00_elastic_beanstalk_proxy.conf befindet sich außer Kraft zu setzen. Aber mein Server hat keine Nginx-Konfigurationsdateien auf dem Dateisystem ...

+0

Also wo läuft Nginx in Ihrem Fall? –

+0

Welchen Port verbinden Sie? Die standardmäßige Konfiguration von Load Balancer darf nur Daten von Port 80 oder Port 443 verarbeiten. Wenn Sie SSL verwenden, verfügen Sie über ein mit ElasticBeanstalk konfiguriertes Zertifikat? Wenn Sie die Anfrage nie auf der Nginx-Seite erhalten, werden Sie möglicherweise nie von Ihrem Load Balancer weitergeleitet. Um Ihren Load Balancer zu sehen, gehen Sie zu EC2 -> Load Balancer im AWS-Panel. – jonzlin95

+0

@ jonzlin95 Wir verbinden über Port 80. Es gibt keine Load Balancer in "EC2 → Load Balancer", aber das ist keine Überraschung. Weil wir nur den ELB mit dem SingleInstance-Umgebungstyp verwenden. – zatziky

Antwort

1

Das Problem hängt mit Ihrer proxy_set_header Host $host; zusammen. Das Problem liegt an der Art und Weise, wie der Server auf den Hostnamen-Header reagiert.

Betrachten Sie, wenn Sie die folgenden URLs in Browser öffnen

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

Ein Wesen EC2 und man eine ELB zu sein. Wenn Sie die Anfrage an ec2 senden, wird der Hostname als ec2-52-59-53-38.eu-central-1.compute.amazonaws.com gesendet. Wenn Sie nun einen Dienst haben, der Port 80 direkt oder über Andockfenster abgehört. Es hört Port 80 und kümmert sich nicht darum, wie der Verkehr dazu kommt.

Es weiß nur, dass wir antworten, wenn jemand den Server erreicht. Wenn Sie nun einen Nginx auf diesem EC2 haben, der nur auf einen bestimmten virtuellen Host hört und nicht auf einen anderen Hostnamen reagiert, dann antwortet nginx nicht auf die Anfrage, wenn Sie ihn ec2-52-59-53-38.eu-central-1.compute.amazonaws.com senden und abc.mydomain.com sehen.

Dies ist der Fall, der mit Ihrem ELB-Server passiert. Sie hosten nginx bei einigen Domänennamen abc.domain.com und verwenden proxy_pass, um den Datenverkehr an ELB zu übergeben. Setzen Sie den Hostnamen unter Verwendung von proxy_set_header Host $host; jedoch auf abc.domain.com und ELB kann nicht verstehen, wo sich dieser Host befindet. So wird es nicht die Anfrage Server und damit der Fehler

Verwandte Themen