我想嘗試 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 設定進行一些修改。您可以嘗試以下方法:
- 透過將以下行新增至 Node-Red 的 VirtualHost 部分來啟用 WebSocket 代理程式:
<Location /ws>
ProxyPass ws://localhost:1880/ws
ProxyPassReverse ws://localhost:1880/ws
</Location>
這告訴 Apache 將所有 WebSocket 流量代理到 Node-Red。
- 修改現有的 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。