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.
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