Configurazione di Apache 2.4 mod_proxy_wstunnel per Socket.IO 1.0


15

Sto cercando di configurare Apache 2.4 per il proxy della connessione websocket per socket.io a un server websocket node.js, usando mod_proxy_wstunnel. Abbiamo funzionato bene con socket.io 0.9, ma con la versione 1.0 hanno cambiato l'endpoint del socket in un parametro di query e ora ho problemi a configurare apache con le istruzioni proxy corrette.

Tutte le richieste a /socket.io/?EIO=N&transport=websocket(dove N è qualsiasi cifra, in genere 2) devono essere inoltrate a ws://localhost:8082/socket.io/, ma tutte le altre richieste devono essere inoltrate a http://localhost:8082/socket.io/.

Ho provato le varianti di entrambe le seguenti configurazioni:

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/

Ho capito dal mio google che ProxyPass e Locations non possono indirizzare le stringhe di query, quindi c'è qualche altra opzione qui? I percorsi sono hardcoded in socket.io, così a corto di fork di tutta la libreria che non posso cambiarli.

Risposte:


39

Usa le condizioni di riscrittura per abbinare questo caso speciale:

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

NOTA Come indicato di seguito da Mark W. Questi devono essere inseriti a livello di vhost e non a livello di server o .htaccess.

Puoi anche fare riferimento a un bilanciatore:

<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

+100000 Mi hai reso felice. Sono stato a questo per ore. Ho usato il primo frammento di codice. Non ho bisogno di un bilanciatore al momento.
Eamorr,

Non riesco a farlo funzionare. Apache continua a rispondere con un codice 404. Viene visualizzato nel registro degli accessi come se stesse tentando di caricare un file normale e il processo del nodo socket non mostra alcun segno di ricezione della richiesta (mostra la chiamata per il file socket.io.js)
ChiperSoft

1
Sembra che mod_rewrite non conosca il protocollo ws: //. Lo vedo nel mio registro di riscrittura: forcing proxy-throughput with http://[REDACTED].dev/ws://localhost:8082/socket.io/(domain.dev
ChiperSoft

Questo è probabilmente il motivo per cui: issues.apache.org/bugzilla/show_bug.cgi?id=55598 Sembra che il supporto per il protocollo sia stato aggiunto in Apache 2.5
ChiperSoft

5
NOTA : questi blocchi devono essere posizionati all'interno del <VirtualHost>blocco nell'ordine esatto descritto, anche se si utilizza la radice del documento (ad es /var/www/html.). Ho trascorso quasi 2 ore a cercare di capire perché questi cambiamenti non funzionassero correttamente, solo per scoprire che RewriteRulenon funzionavano al livello principale di httpd.conf(sebbene ProxyPassfunzionasse). Le ProxyPassdirettive non funzionano in <Directory>blocchi o .htaccessfile (anche se lo RewriteRulefanno), quindi si trova il posto logico in cui raggruppare queste modifiche <VirtualHost>.
Segna W
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.