反向代理后面的同一端口和域上的 HTTP 和 websocket

反向代理后面的同一端口和域上的 HTTP 和 websocket

我想尝试 Node-Red,并已将其安装在我的 Ubuntu 服务器上。此服务器运行 apache 反向代理,但我无法使其正常工作。如果我为 HTTP 连接创建虚拟主机,我可以正常访问我的 Node-Red 界面,但它不会显示任何活动,例如在线 MQTT 服务器或调试消息。经过一番谷歌搜索,我发现这是因为它也使用 websockets,这些也必须通过。

这是我没能解决的难题:我可以通过 HTTP 或 websockets,但不能同时通过。如果我通过 HTTP,加载 Node-Red web 界面,然后将反向代理设置更改为 WS 直通,我就能获得完整的功能。但是我无法重新加载或重新连接到 Node-Red 页面,因为 HTTP 直通已被删除。

如何在同一个域和端口上添加两者?或者这根本是不可能的?以下是我的部分 apache2 配置:

<VirtualHost *:80>
ServerName nr.domain.com
Redirect permanent / https://nr.domain.com/
RewriteEngine on
RewriteCond %{SERVER_NAME} =nr.domain.com
RewriteRule ^https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
ServerName nr.domain.com
SSLEngine On
<Location />
ProxyPass http://localhost:1880/
ProxyPassReverse http://localhost:1880/
</Location>

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/nr.domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/nr.domain.com/privkey.pem
</VirtualHost>

如果我使用 ProxyPass ws:// 等添加位置,实时信息和调试器可以工作,但 Web 界面不再可访问。如何修改我的 apache 配置文件以使两者都可以工作?

答案1

看起来你还需要基于以下代理 Web 套接字连接先前的答案

尝试对你的配置做类似的操作。

<VirtualHost *:80>
  ServerName nr.domain.com
  Redirect permanent / https://nr.domain.com/
  RewriteEngine on
  RewriteCond %{SERVER_NAME} =nr.domain.com
  RewriteRule ^https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
  ServerName nr.domain.com
  SSLEngine On
  <Location />
    ProxyPass http://localhost:1880/
    ProxyPassReverse http://localhost:1880/
  </Location>

  # New web socket proxy
  <Location /comms>       
    ProxyPass ws://localhost:1880/comms
    ProxyPassReverse ws://localhost:1880/comms
  </Location>

  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/nr.domain.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/nr.domain.com/privkey.pem
</VirtualHost>

答案2

要通过 Apache 反向代理为 Node-Red 启用 HTTP 和 WebSocket 流量,您需要对 Apache 配置进行一些修改。您可以尝试以下操作:

  1. 通过将以下行添加到 Node-Red 的 VirtualHost 部分来启用 WebSocket 代理:
    <Location /ws>
      ProxyPass ws://localhost:1880/ws
      ProxyPassReverse ws://localhost:1880/ws
    </Location>

这告诉 Apache 将所有 WebSocket 流量代理到 Node-Red。

  1. 修改现有的 ProxyPass 和 ProxyPassReverse 指令以排除 WebSocket 端点。在上一步的标签后添加以下行:
    ProxyPassMatch "^/(?!ws)(.*)" "http://localhost:1880/$1"

这会告诉 Apache 将除 WebSocket 端点之外的所有 HTTP 流量代理到 Node-Red。

修改后的 VirtualHost 部分应如下所示:

<VirtualHost *:443>
  ServerName nr.domain.com
  SSLEngine On

  <Location /ws>
    ProxyPass ws://localhost:1880/ws
    ProxyPassReverse ws://localhost:1880/ws
  </Location>

  <Location />
    ProxyPassMatch "^/(?!ws)(.*)" "http://localhost:1880/$1"
    ProxyPassReverse http://localhost:1880/
  </Location>

  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/nr.domain.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/nr.domain.com/privkey.pem
</VirtualHost>

重新启动 Apache 以使更改生效:

sudo systemctl restart apache2

通过这些更改,HTTP 和 WebSocket 流量都应该通过 Apache 反向代理正确代理到 Node-Red。

相关内容