Konfigurowanie Apache 2.4 mod_proxy_wstunnel dla Socket.IO 1.0

15

Usiłuję skonfigurować Apache 2.4 do proxy proxy połączenia websocket dla socket.io z serwerem websocket node.js, używając mod_proxy_wstunnel. Działa to dobrze z socket.io 0.9, ale w wersji 1.0 zmieniono punkt końcowy gniazda na parametr zapytania, a teraz mam problem ze skonfigurowaniem apache z prawidłowymi instrukcjami proxy.

Wszystkie żądania do /socket.io/?EIO=N&transport=websocket(gdzie N jest dowolną cyfrą, zwykle 2) muszą być przekazywane do ws://localhost:8082/socket.io/, ale wszystkie inne żądania muszą być przekazywane do http://localhost:8082/socket.io/.

Próbowałem odmian obu następujących konfiguracji:

ProxyPass /socket.io/?EIO=2&transport=websocket http://localhost:8082/socket.io/?EIO=2&transport=websocket
ProxyPassReverse /socket.io/?EIO=2&transport=websocket http://localhost:8082/socket.io/?EIO=2&transport=websocket

ProxyPass /socket.io/ http://localhost:8082/socket.io/
ProxyPassReverse /socket.io/ http://localhost:8082/socket.io/

.

RewriteRule /socket.io/?EIO=([0-9]+)&transport=websocket ws://localhost:8082/socket.io/ [QSA,P]

ProxyPass /socket.io/ http://localhost:8082/socket.io/
ProxyPassReverse /socket.io/ http://localhost:8082/socket.io/

Z Google'a dowiedziałem się, że ProxyPass i Lokalizacje nie mogą kierować na ciągi zapytań, więc czy jest tu jakaś inna opcja? Ścieżki są zakodowane na stałe w socket.io, więc tak szybko, jak rozwidlenie całej biblioteki, nie mogę ich zmienić.

ChiperSoft
źródło

Odpowiedzi:

39

Użyj warunków Przepisz, aby dopasować do tego specjalnego przypadku:

RewriteEngine On
RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
RewriteCond %{QUERY_STRING} transport=websocket    [NC]
RewriteRule /(.*)           ws://localhost:8082/$1 [P,L]

ProxyPass        /socket.io http://localhost:8082/socket.io
ProxyPassReverse /socket.io http://localhost:8082/socket.io

UWAGA Jak zaznaczono poniżej w znaku W. Te muszą być wprowadzone na poziomie vhost, a nie na poziomie serwera lub .htaccess.

Możesz także odwołać się do modułu równoważącego:

<Proxy balancer://http-localhost/>
    BalancerMember http://localhost:8082 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    BalancerMember http://localhost:8083 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    ProxySet lbmethod=bytraffic
</Proxy>

<Proxy balancer://ws-localhost/>
    BalancerMember ws://localhost:8082 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    BalancerMember ws://localhost:8083 keepalive=On smax=1 connectiontimeout=10 retry=600 timeout=900 ttl=900
    ProxySet lbmethod=bytraffic
</Proxy>

RewriteEngine On
RewriteCond %{REQUEST_URI}  ^/socket.io                [NC]
RewriteCond %{QUERY_STRING} transport=websocket        [NC]
RewriteRule /(.*)           balancer://ws-localhost/$1 [P,L]

ProxyPass        /socket.io balancer://http-localhost/socket.io
ProxyPassReverse /socket.io balancer://http-localhost/socket.io
PeterPramb
źródło
+100000 Zrobiłeś mi dzień. Byłem w tym przez wiele godzin. Użyłem pierwszego fragmentu kodu. W tej chwili nie potrzebuję stabilizatora.
Eamorr,
Nie jestem w stanie uruchomić tego. Apache wciąż odpowiada kodem 404. Pojawia się w dzienniku dostępu, jakby próbował załadować normalny plik, a proces węzła gniazda nie wykazuje żadnych oznak otrzymania żądania (pokazuje wywołanie pliku socket.io.js)
ChiperSoft,
1
Wygląda na to, że mod_rewrite nie zna protokołu ws: //. Widzę to w moim dzienniku przepisywania: forcing proxy-throughput with http://[REDACTED].dev/ws://localhost:8082/socket.io/(domain.dev
ChiperSoft,
Prawdopodobnie właśnie dlatego: Issues.apache.org/bugzilla/show_bug.cgi?id=55598 Wygląda na to, że obsługa protokołu została dodana w Apache 2.5
ChiperSoft
5
UWAGA : Bloki te należy umieścić w <VirtualHost>bloku w dokładnie opisanej kolejności, nawet jeśli używasz katalogu głównego dokumentu (np /var/www/html.). Spędziłem prawie 2 godziny, próbując dowiedzieć się, dlaczego te zmiany nie działały poprawnie, po prostu aby dowiedzieć się, że RewriteRulenie działały na poziomie root httpd.conf(chociaż ProxyPassdziałały). Te ProxyPasswytyczne nie działają w <Directory>blokach lub .htaccessplików (chociaż RewriteRule„s zrobić), więc logicznym miejscem do grupy tych zmian jest w <VirtualHost>.
Mark W