WebSockets and Apache proxy: how to configure mod_proxy_wstunnel?

apache, node.js, proxy, socket.io, websocket

Solution

I finally managed to do it, thanks to this topic. TODO:

1) Have Apache 2.4 installed (doesn't work with 2.2), and do:

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel

2) Have `nodejs` running on port 3001

3) Do this in the Apache config

<VirtualHost *:80>
  ServerName example.com

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

  ProxyPass / http://localhost:3001/
  ProxyPassReverse / http://localhost:3001/
</VirtualHost>

Note: if you have more than one service on the same server that uses websockets, you might want to do this to separate them.

Problem

I have : Apache 2.4 on port 80 of my server, with mod_proxy and mod_proxy_wstunnel enabled Node.js + `socket.io` on port 3001 of the same server Accessing `example.com` (with port 80) redirects to 2. thanks to this method with the following Apache configuration: ``` <VirtualHost *:80> ServerName example.com ProxyPass / http://localhost:3001/ ProxyPassReverse / http://localhost:3001/ ProxyPass / ws://localhost:3001/ ProxyPassReverse / ws://localhost:3001/ </VirtualHost> ``` It works for everything, except the WebSocket part : `ws://...` are not transmitted like it should by the proxy. When I access the page on `example.com`, I have: ``` Impossible to connect ws://example.com/socket.io/?EIO=3&transport=websocket&sid=n30rqg9AEqZIk5c9AABN. ``` Question: How to make Apache proxy the WebSockets as well?

Original source

Related problems