Frage

Ich habe einen Apache-Proxy für eine Meteor-App und Apache und Meteor befinden sich auf zwei separaten Computern.Ich brauche das so, da Apache viele echte Websites bedienen muss und es aufgrund der begrenzten Ressourcen keine gute Idee wäre, die Meteor-App auf diesem Rechner zu installieren.

Allerdings schlägt der WebSocket-Handshake mit dem Antwortcode 400 „Upgrade nur auf WebSocket möglich“ fehl, wenn ich versuche, von außen über den Proxy eine Verbindung herzustellen.Alles funktioniert einwandfrei, wenn ich mich über das LAN direkt mit der Meteormaschine verbinde.Wenn WebSocket ausfällt, greift SockJS/Meteor auf XHR zurück, aber leider führt dies zu einigen Fehlern in der betreffenden App.Daher brauche ich in den meisten Fällen wirklich WebSocket, um zu funktionieren.

Ich habe meine Apache-Installation mit dem hier genannten Patch gepatcht: https://stackoverflow.com/a/16998664Es sah so aus, als wäre es gut gelaufen, aber es hat sich nichts geändert ...

Meine Apache-Proxy-Anweisungen lauten derzeit wie folgt:

ProxyRequests Off
ProxyPreserveHost On
ModPagespeed Off
<proxy>
Order deny,allow
Allow from all
</proxy>
ProxyPass / http://10.0.2.6:3000/
ProxyPassReverse / http://10.0.2.6:3000/

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

GET /sockjs/430/minw4r_o/websocket HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: myKey
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
User-Agent: My Agent

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

GET /sockjs/430/minw4r_o/websocket HTTP/1.1
Host: example.com
Origin: http://example.com
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: myKey
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
User-Agent: My Agent
X-Forwarded-For: 24.xxx.xxx.xxx
X-Forwarded-Host: example.com
X-Forwarded-Server: example.com
Connection: Keep-Alive

Daher wird „Upgrade“ entfernt und „Verbindung“ geändert, sodass der Websocket-Handshake fehlschlägt.Jetzt könnte ich versuchen, „Upgrade“ mit einer RequestHeader-Direktive immer auf „websocket“ zu setzen.Allerdings fühlt sich das nicht richtig an und ich schätze, es würde andere Probleme aufwerfen. Deshalb habe ich mich gefragt, ob es eine echte Lösung für dieses Problem gibt?Oder ist das etwas, von dem der Patch stammt? https://stackoverflow.com/a/16998664 sollte sich das ansprechen und bei der Anwendung ist bei mir ein Fehler aufgetreten?

Nach dem, was ich gelesen habe, könnte der Wechsel zu Nginx diese Einrichtung einfacher machen.Ich werde darüber nachdenken, aber wenn möglich, würde ich es gerne mit Apache machen, da Nginx andere Dinge komplizierter machen und mich viel Zeit kosten würde.

War es hilfreich?

Lösung

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 greift es auf XHR zurück.Aber nur, wenn es sich bei der Verbindung um einen WebSocket-Handshake handelt.Wenn Sie Folgendes hinzufügen, wird Ihr Problem behoben :) (Hinweis:ändere das localhost:3000 entsprechend Ihrer eigenen Backend-URL.

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^websocket$ [NC]
RewriteCond %{HTTP:CONNECTION} Upgrade [NC]
RewriteRule .* ws://localhost:3000%{REQUEST_URI} [P]

Andere Tipps

Diese Antwort basiert auf der Antwort von Fatih.Seine Lösung fehlschlägt für Browsern aus, die einen anderen Verbindungsanforderungs-Header als "Upgrade" senden, z. B. "Heper-Alive, Upgrade".Dies war für mich mit Firefox 42 der Fall.

Um das Problem für Firefox anzugreifen, ändern Sie den Apache RewriteCond wie folgt:

generasacodicetagpre.

( ^ Upgrade $ wird Upgrade $ )

Ich wollte dies als Kommentar zur Antwort von Fatih setzen, fehlt mir jedoch nicht den notwendigen Ruf.

Nachdem er mehrere Antworten gelesen hatte, posted auf dem Meteor-Forum, und viele Versuche hier ist die gesamte Enchilada, die für mich funktionierte.Die anderen Antworten waren etwas unvollständig oder funktionierte zumindest nicht für mich.

Ich musste tun:

generasacodicetagpre.

musste auch einen Proxypass und ProxypasReverse hinzufügen und ändert ^ Upgrade $ ein Upgrade von $ von einer anderen Antwort.

generasacodicetagpre.

Starten Sie dann Apache neu.

Ich habe auf der Konsole überprüft und es gibt jetzt keinen Fehler und keine XHR-Anforderungen.Also gehe ich davon aus, dass es richtig funktioniert

Ich wünschte, ich könnte Ihnen eine direkte Antwort mit Apache-Anweisungen geben, da Sie jedoch Nginx erwähnt haben und dass die Tatsache ist, dass es schwer zu konfigurieren ist, ich möchte mit einer Alternative wiegen, die tatsächlich nginx verwendetschützt Sie von allen Komplexitäten.

das Tutorial bei https://github.com/phusion/Passagier- / Wiki / PHUUS-Passagier: -Metor-Tutorial geht durch die Schritte zum Einrichten von PHUUS-Passagier mit oder ohne nginx (it intern nginx ohnehin) für Multi-Instanz-Produktionsmeteor-Bereitstellungen, die alle Kerne skalieren können, um alle Kerne in Ihrem Server zu nutzen.

Es ist so einfach wie:

generasacodicetagpre.

fatih-arslan Antwort mit Derwiwie hat die Änderung von wie Charme gearbeitet. Eine Sache, die ich verwenden musste, war anstelle von WSS anstelle von ws , da mein Dienst nur in HTTPS funktioniert.

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top