Basj Basj - 4 months ago 80
Node.js Question

WebSockets and Apache proxy : how to configure mod_proxy_wstunnel?

I have :


  1. Apache
    (v2.4) on port 80 of my server for
    www.domain1.com
    , with mod_proxy and mod_proxy_wstunnel enabled

  2. node.js + socket.io
    on port 3001 of the same server.



Accessing
www.domain2.com
(with port 80) redirects to 2. thanks to the method described here. I have set this in the Apache configuration:

<VirtualHost *:80>
ServerName www.domain2.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
www.domain2.com
, I have:

Impossible to connect ws://www.domain2.com/socket.io/?EIO=3&transport=websocket&sid=n30rqg9AEqZIk5c9AABN.


Question: How to make Apache proxy the WebSockets as well?

Answer

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

TODO:

1) Have Apache 2.4 installed (doesn't work with 2.2), a2enmod proxy and a2enmod proxy_wstunnel

2) Have nodejs running on port 3001

3) Do this in the Apache config

<VirtualHost *:80>
  ServerName www.domain2.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>