You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:02:37