HTTP 和 websocket 位於反向代理後面的相同連接埠和網域上

HTTP 和 websocket 位於反向代理後面的相同連接埠和網域上

我想嘗試 Node-Red 並已將其安裝在我的 Ubuntu 伺服器上。該伺服器運行 apache 反向代理,但我無法讓它正常工作。如果我為 HTTP 連接建立虛擬主機,我可以很好地存取 Node-Red 介面,但它不會向我顯示任何活動,例如線上 MQTT 伺服器或偵錯訊息。經過一番谷歌搜尋後,我發現這是因為它也使用了 websocket,而這些也必須通過。

這是我未能解決的難題:我可以透過 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。

相關內容