用于动态dns主机的Mattermost的Apache2 Websocket代理

时间:2017-06-04 10:20:16

标签: node.js websocket proxy apache2 mattermost

我在Vagrant虚拟机中在家中使用mattermost。通过我的DSL路由器上的端口转发,我使用固定IP在WAN vHost上的子域上映射Web前端。

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

这很好用!在这种情况下,我将Web端口从端口8090映射到vHost子域上的端口80。并且Web-Frontend可以访问。

但是

mattermost正在使用另一个端口通过Websockets与Web-Frontend进行通信。为此,我还从我的本地机器转发了Websocket端口。如果我正在访问动态DNS主机URL:http://mappedsubdomain.somedyndns.tld:8090,Web-Fontend与第二个打开的Websockets端口配合良好。 Mattermost可在动态DNS主机URL上使用。

由于默认的Mattermost使用端口80作为Websockets。但就我而言,我在Mattermost中使用端口890作为Websockets。它在本地,局域网内和动态DNS主机上运行。

现在,我想用Websocket协议制作一个ProxyReverse。

WAN-Host是Apache2.2和加载的mod_proxy_wstunnel模块的Debian。

起初,我试图只是映射第二个端口:

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>

但没有。 Websockets无法正常工作。

然后我在运行NodeJS Websocket隧道的WAN vHost上尝试了它:

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

通过此电话:

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

并更改了虚拟主机配置:

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

wstunnel正在运行时,chat.domain.tld:890上的http请求以超时结束。没有wstunnel,我就得到了503。

有人给我一个有用的暗示吗?