sudo a2enmod proxy_http
sudo a2enmod proxy_fcgi
sudo a2enmod proxy_wstunnel
# VirtualHost ms.example.net
<VirtualHost *:80>
ServerName ms.example.net
ProxyRequests Off
ProxyPreserveHost On
RemoteIPHeader X-Forwarded-For
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:14102/$1 [P,L]
ProxyPass /socket.io http://localhost:14102/socket.io
ProxyPassReverse /socket.io http://localhost:14102/socket.io
</VirtualHost>
<VirtualHost *:443>
ServerName ms.example.net
ProxyRequests Off
ProxyPreserveHost On
RemoteIPHeader X-Forwarded-For
RewriteEngine on
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/example.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.net/privkey.pem
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:14102/$1 [P,L]
ProxyPass /socket.io http://localhost:14102/socket.io
ProxyPassReverse /socket.io http://localhost:14102/socket.io
</VirtualHost>
Use a secure URL for your initial connection, i.e. instead of “http://” use “https://”. If the WebSocket transport is chosen, then Socket.IO should automatically use “wss://” (SSL) for the WebSocket connection too.
var socket = io.connect('https://localhost', {secure: true});
References
http://xpo6.com/socket-io-via-apache-reverse-proxy/
https://stackoverflow.com/questions/36472920/apache-proxy-configuration-for-socket-io-project-not-in-root
https://gist.github.com/iacchus/954e0787d6893c5ab8e1
https://stackoverflow.com/questions/6599470/node-js-socket-io-with-ssl