我在家里的 Vagrant 虚拟机中使用mattermost。通过我的 DSL 路由器上的端口转发,我将 Web 前端映射到具有固定 IP 的 WAN vHost 上的子域上。
<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 前端是可访问的。
但。
最重要的是使用另一个端口通过 Websockets 与 Web 前端通信。为此,我还从本地机器转发了 Websocket 端口。如果我正在访问动态 DNS 主机 URL:http://mappedsubdomain.somedyndns.tld:8090
Web-Fontend 与第二个打开的 Websocket 端口一起工作得很好。Mattermost 可用于动态 DNS 主机 URL。
默认情况下,Websockets 使用端口 80。但就我而言,我在 Mattermost 中为 Websockets 使用端口 890。它在本地、局域网内和动态 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 Tunnel 的 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
,http 请求chat.domain.tld:890
以超时结束。没有wstunnel
,我有一个 503。
有没有人对我有用的提示?