0

i'm using mattermost locally at home in a Vagrant Virtual Machine. With Port Forwarding on my DSL Router, i map the web frontend on a subomain on my WAN vHost with fixed IP.

<VirtualHost *:80>

  ServerName chat.domain.tld
  ServerSignature Off
  ProxyPreserveHost On

  <Location />
    Order deny,allow
    Allow from all

    ProxyPassReverse http://chat.domain.tld/
  </Location>

  RewriteEngine on
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule .* http://mappedsubdomain.somedyndns.tld:8090%{REQUEST_URI} [P,QSA]

  DocumentRoot /somewhere/on/my/disk

</VirtualHost>

And that works fine! In this case i'm mapped the Web Frontend from Port 8090 to the port 80 on the vHost Subdomain. And the Web-Frontend is reachable.

But.

mattermost is using another Port to communicate with the Web-Frontend over Websockets. For that i also forwarded the Websocket Port from my local Machine. If i'm accessing the Dynamic DNS Host Url: http://mappedsubdomain.somedyndns.tld:8090 the Web-Fontend works well WITH the second opened Port for Websockets. Mattermost is usable on the Dynamic DNS Host Url.

As Default Mattermost is using Port 80 for the Websockets. But in my case, i'm using port 890 for the Websockets in Mattermost. It works locally, inside the LAN and over the Dynamic DNS Host.

Now, i want to make a ProxyReverse withe the Websocket Protocol.

The WAN-Host is a Debian with Apache2.2 and the loaded mod_proxy_wstunnel Module.

At first, i tried simply to map the second Port:

Listen 890
<VirtualHost *:890>
  ServerName chat.domain.tld
  ServerSignature off

  ProxyRequests off
  RewriteEngine on

  RewriteCond %{HTTP:Upgrade} =websocket [NC]
  RewriteRule /(.*)           ws://mappedsubdomain.somedyndns.tld:890/$1 [P,L]

  RewriteCond %{HTTP:Upgrade} !=websocket [NC]
  RewriteRule /(.*)           http://mappedsubdomain.somedyndns.tld:890/$1 [P,L]

  <Location />
    Order deny,allow
    Allow from all

    ProxyPassReverse http://mappedsubdomain.somedyndns.tld:890/
    ProxyPassReverse ws://mappedsubdomain.somedyndns.tld:890/
  </Location>

  DocumentRoot /somewhere/on/my/disk

</VirtualHost>

But nothing. Websockets not working.

Then i tried it from a on the WAN vHost running NodeJS Websocket Tunnel:

https://www.npmjs.com/package/wstunnel

With this call:

wstunnel -t 8091 ws://mappedsubdomain.somedyndns.tld:890/

and with changed Virtual Host Config:

RewriteRule /(.*)       ws://localhost:8091/$1
RewriteRule /(.*)       http://localhost:8091/$1 [P,L]
ProxyPassReverse        ws://localhost:8091/    
ProxyPassReverse        http://localhost:8091/

When wstunnel is running, a http Request on chat.domain.tld:890 ends with a timeout. Without wstunnel, i've got a 503.

Have anyone a helpful hint for me?

  • at the moment i've got a connection, but a error comes: Bad Request {"id":"api.web_socket.connect.upgrade.app_error","message":"Fehler beim Hochstufen der Websocket-Verbindung","detailed_error":"","request_id":"ytrcucx9jj8ymjedxtahndsaxy","status_code":500} that means: Failed to upgrade websocket connection – seekwhencer Jun 04 '17 at 12:58