Configurando o Apache 2.4 mod_proxy_wstunnel para Socket.IO 1.0

13

Estou tentando configurar o Apache 2.4 para fazer proxy da conexão websocket para o socket.io para um servidor websocket node.js, usando mod_proxy_wstunnel. Nós tínhamos isso funcionando bem com o socket.io 0.9, mas com o release 1.0 eles mudaram o terminal do soquete para um parâmetro de consulta, e agora estou tendo problemas para configurar o apache com as instruções de proxy corretas.

Todas as solicitações para /socket.io/?EIO=N&transport=websocket (onde N é qualquer dígito, geralmente 2) precisam ser encaminhadas para ws://localhost:8082/socket.io/ , mas todas as outras solicitações precisam ser encaminhadas para http://localhost:8082/socket.io/ .

Eu tentei variações das duas configurações a seguir:

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/

Eu recolhi do meu googling que ProxyPass e Locations não podem segmentar strings de consulta, então há alguma outra opção aqui? Os caminhos são codificados para o socket.io, portanto, com pouca capacidade de bifurcar toda a biblioteca, não consigo alterá-los.

    
por ChiperSoft 29.07.2014 / 19:12

1 resposta

34

Use as condições de reconfiguração para corresponder a este caso especial:

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 Como Mark W observou abaixo. Estes devem ser inseridos no nível do vhost e não no servidor ou no nível do .htaccess.

Você também pode fazer referência a um balanceador:

<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
    
por 21.08.2014 / 13:58