Wie richte ich einen Apache-Proxy für Meteor / SockJS und WebSocket ein?

7

Ich habe einen Apache Proxy für eine Meteor App und Apache und Meteor sind auf zwei separaten Maschinen. Ich brauche es auf diese Weise, da Apache eine Menge echter Websites bedienen muss und es wäre keine gute Idee, die Meteor-App aufgrund begrenzter Ressourcen auf dieser Maschine zu installieren.

Der WebSocket-Handshake schlägt jedoch mit dem Antwortcode 400 "Kann nur auf Websocket upgraden" fehl, wenn ich versuche, mich von außen über den Proxy zu verbinden. Alles funktioniert gut, wenn ich aus dem LAN direkt mit dem Meteorrechner verbinde. Wenn WebSocket fehlschlägt, geht SockJS / Meteor zurück zu XHR, aber das führt leider zu einigen Fehlern in der betreffenden App. Daher muss WebSocket in den meisten Fällen wirklich funktionieren.

Ich habe meine Apache-Installation mit dem hier erwähnten Patch gepatcht: Ссылка Das sah aus, als wäre es gut gelaufen, aber nichts hat sich geändert ...

Meine Apache-Proxy-Anweisungen lauten derzeit wie folgt:

%Vor%

Und ich weiß sogar, was das Problem auslöst. Der Apache-Proxy verwirrt mit dem Header. Der ursprüngliche Anforderungsheader des fraglichen Pakets, das meinen Rechner verlässt, sieht folgendermaßen aus:

%Vor%

Während das Paket vom Apache-Proxy wie folgt weitergeleitet wird:

%Vor%

Also "Upgrade" wird entfernt und "Verbindung" geändert und so schlägt der Websocket-Handshake fehl. Jetzt könnte ich versuchen, "Upgrade" immer auf "Websocket" mit einer RequestHeader-Direktive zu setzen. Allerdings fühlt sich das nicht richtig an und ich denke, es würde andere Probleme aufwerfen und so fragte ich mich, ob es eine echte Lösung für dieses Problem gibt. Oder ist das etwas, das der Patch von Ссылка ansprechen sollte und etwas schief gelaufen ist, nachdem ich es angewendet habe?

Von dem, was ich gelesen habe, kann der Wechsel zu nginx diese Einrichtung erleichtern. Ich werde darüber nachdenken, aber wenn möglich würde ich das gerne mit Apache machen, da Nginx andere Dinge komplizierter machen würde und mich eine Menge Zeit kosten würde.

    
Jey DWork 25.02.2014, 01:20
quelle

5 Antworten

16

Wir verwenden dies für Apache und eine SockJS-App hinter Apache. Apache führt den WebSocket-Proxy automatisch aus, aber Sie müssen das Schema in ws umschreiben, sonst wird es auf XHR zurückfallen. Aber nur wenn die Verbindung ein WebSocket Handshake ist. Wenn Sie Folgendes hinzufügen, wird Ihr Problem behoben :) (Hinweis: Ändern Sie localhost:3000 entsprechend in Ihre eigene Back-End-URL.)

%Vor%     
Fatih Arslan 20.08.2014, 12:39
quelle
11

Diese Antwort basiert auf Fatihs Antwort. Seine Lösung schlägt für Browser fehl, die einen anderen Verbindungsanforderungsheader als "Upgrade" senden, z. B. "Keep-Alive, Upgrade". Das war bei mir mit Firefox 42 der Fall.

Um das Problem auch für Firefox zu lösen, ändern Sie den Apache RewriteCond wie folgt:

%Vor%

( ^ Upgrade $ wird zu Upgrade $ )

Ich wollte dies als Kommentar zu Fatihs Antwort geben, allerdings fehlt mir der notwendige Ruf.

    
derwiwie 19.12.2015 13:03
quelle
8

Nachdem ich mehrere Antworten gelesen und auf dem Meteor-Forum gepostet habe, ist die ganze Enchilada, die für mich funktioniert hat, eine Menge Versuche. Die anderen Antworten waren etwas unvollständig oder funktionierten zumindest nicht für mich.

Ich musste tun:

%Vor%

Außerdem musste ein ProxyPass und ein ProxyPassReverse hinzugefügt werden und ^ Upgrade $ wurde geändert, um $ von einer anderen SO-Antwort zu aktualisieren.

%Vor%

starte Apache neu.

Ich habe auf der Konsole gecheckt und es gibt jetzt keinen Fehler und keine xhr-Anfragen. Also ich gehe davon aus, dass es richtig funktioniert

    
pferrel 28.04.2016 23:18
quelle
1

Ich wünschte, ich wäre in der Lage, Ihnen eine direkte Antwort mit Apache-Anweisungen zu geben, aber da Sie nginx erwähnt haben, und dass die Tatsache ist, ist es schwer zu konfigurieren, würde ich gerne mit einer Alternative, die tatsächlich nginx verwendet aber abwiegen schützt dich vor allen Schwierigkeiten.

Das Tutorial in Ссылка durchläuft die Schritte, um Phusion Passenger mit oder ohne nginx (intern wird nginx sowieso verwendet) für Multi-Instanz-Produktions-Meteor-Implementierungen, die skaliert werden können, um alle Kerne in Ihrem Server zu nutzen.

Es ist so einfach wie:

%Vor%     
Serkan Durusoy 25.02.2014 12:56
quelle
0

Fatih-Arslan antwortet mit Derwiwi wirkte wie ein Zauberer. Eine Sache, die ich verwenden musste, war wss statt ws , da mein Dienst nur in https funktioniert.

%Vor%     
nurb 11.09.2017 12:55
quelle