一尘不染

WebSockets和Apache代理:如何配置mod_proxy_wstunnel?

node.js

我有 :

  1. Apache(v2.4)在我服务器的端口80上www.domain1.com,启用了 mod_proxymod_proxy_wstunnel

  2. node.js + socket.io 在同一服务器的端口3001上。

www.domain2.com由于使用此处描述的方法,访问(使用端口80)将重定向到2
.。我已经在Apache配置中对此进行了设置:

<VirtualHost *:80>
    ServerName www.domain2.com
    ProxyPass / http://localhost:3001/
    ProxyPassReverse / http://localhost:3001/
    ProxyPass / ws://localhost:3001/
    ProxyPassReverse / ws://localhost:3001/
</VirtualHost>

它适用于除websocket部分之外的所有内容:ws://...不会像代理服务器那样传输。

访问上的页面时www.domain2.com,我有:

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

问: 如何也使Apache代理WebSockets?


阅读 337

收藏
2020-07-07

共1个答案

一尘不染

由于这个话题,我终于设法做到了。

去做:

1)安装Apache 2.4(不适用于2.2),然后执行以下操作:

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel

2)nodejs在端口3001上运行

3)在Apache配置中执行此操作

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

注意:如果在使用websocket的同一服务器上有多个服务,则可能需要这样做以将它们分开。

2020-07-07