web-dev-qa-db-fra.com

Configuration d'Apache 2.4 mod_proxy_wstunnel pour Socket.IO 1.0

J'essaye de configurer Apache 2.4 pour mandater la connexion websocket pour socket.io à un serveur websocket node.js, en utilisant mod_proxy_wstunnel. Nous avons bien fonctionné avec socket.io 0.9, mais avec la version 1.0, ils ont changé le point de terminaison du socket en paramètre de requête, et maintenant j'ai du mal à configurer Apache avec les instructions de proxy correctes.

Toutes les demandes à /socket.io/?EIO=N&transport=websocket (où N est un chiffre, généralement 2) doit être transmis à ws://localhost:8082/socket.io/, mais toutes les autres demandes doivent être transmises à http://localhost:8082/socket.io/.

J'ai essayé des variantes des deux configurations suivantes:

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/

J'ai appris de ma recherche sur Google que ProxyPass et Locations ne peuvent pas cibler les chaînes de requête, alors y a-t-il une autre option ici? Les chemins sont codés en dur dans socket.io, donc à court de bifurquer la bibliothèque entière je ne peux pas les changer.

15
ChiperSoft

Utilisez les conditions de réécriture pour correspondre à ce cas spécial:

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

REMARQUE Comme Mark W l'a noté ci-dessous. Ces doivent être saisis au niveau vhost et non au niveau serveur ou .htaccess.

Vous pouvez également référencer un équilibreur:

<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
39
PeterPramb