Apache反向代理下同一域名端口同时支持Node-RED的HTTP与WebSocket配置问题
Apache反向代理下同一域名端口同时支持Node-RED的HTTP与WebSocket配置问题
嘿,这个问题我之前折腾过!Node-RED的界面依赖普通HTTP请求加载,而实时数据(比如调试面板消息、MQTT服务器在线状态)则靠WebSocket传输,所以你的Apache反向代理得同时兼容这两种请求类型才行。之前你单独配置其中一种肯定顾此失彼,下面给你两种可行的解决方案:
方案一:用Location块分别配置(直观易维护)
这种方式把普通HTTP请求和WebSocket请求分开处理,逻辑清晰,适合新手:
首先确保Apache已经启用了必要的模块(如果没启用的话先执行):
sudo a2enmod proxy proxy_http proxy_wstunnel rewrite
然后修改你443端口的VirtualHost配置,替换成下面的内容:
<VirtualHost *:443> ServerName nr.domain.com SSLEngine On # 处理普通HTTP请求(加载Node-RED界面) <Location "/"> ProxyPass http://localhost:1880/ ProxyPassReverse http://localhost:1880/ ProxyPreserveHost On # 保留原始请求的Host头,让Node-RED正确识别 </Location> # 处理WebSocket请求(传输实时数据) <Location "/ws"> ProxyPass ws://localhost:1880/ws ProxyPassReverse ws://localhost:1880/ws # 确保WebSocket的升级头被正确传递,这是关键! ProxyAddHeaders On RequestHeader set Upgrade %{HTTP:Upgrade}e env=HTTP_UPGRADE RequestHeader set Connection "Upgrade" env=HTTP_UPGRADE </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>
方案二:用Rewrite规则自动匹配(更简洁)
这种方式通过Rewrite规则自动识别WebSocket请求,不需要单独的Location块:
同样先确保必要模块启用,然后修改443的VirtualHost:
<VirtualHost *:443> ServerName nr.domain.com SSLEngine On RewriteEngine On # 匹配WebSocket请求,转发到ws协议 RewriteCond %{HTTP:Upgrade} =websocket [NC] RewriteRule /(.*) ws://localhost:1880/$1 [P,L] # 匹配普通HTTP请求,转发到http协议 RewriteCond %{HTTP:Upgrade} !=websocket [NC] RewriteRule /(.*) http://localhost:1880/$1 [P,L] # 确保反向代理的响应头正确 ProxyPassReverse / http://localhost:1880/ ProxyPreserveHost On 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生效
修改完配置后,记得重启Apache服务让配置生效:
sudo systemctl restart apache2
现在你再访问https://nr.domain.com,应该既能正常加载Node-RED界面,又能看到实时的调试消息和MQTT状态了!
备注:内容来源于stack exchange,提问作者screendoor
相关产品推荐
相关产品推荐

