![反向代理后面的同一端口和域上的 HTTP 和 websocket](https://linux22.com/image/784243/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%90%8E%E9%9D%A2%E7%9A%84%E5%90%8C%E4%B8%80%E7%AB%AF%E5%8F%A3%E5%92%8C%E5%9F%9F%E4%B8%8A%E7%9A%84%20HTTP%20%E5%92%8C%20websocket.png)
我想尝试 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 配置进行一些修改。您可以尝试以下操作:
- 通过将以下行添加到 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。