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

如何通过lighttpd将WebSocket与HTTP请求代理到不同端口?

问题分析与修复方案

你的lighttpd配置存在两个核心问题,导致仅能正常运行一个服务:

  • 无路径限制的WebSocket升级规则:独立的$REQUEST_HEADER["Upgrade"] == "websocket"块会拦截所有带WebSocket Upgrade头的请求,无论请求路径是什么,强制代理到8081端口。这会干扰/app路径的代理逻辑,导致两个服务的代理规则冲突。
  • WebSocket代理配置拆分:WebSocket所需的升级配置与路径代理配置分离,导致/websocket路径的普通HTTP请求和WebSocket升级请求的代理逻辑混乱,容易出现覆盖问题。

修正后的配置

# 代理/app路径到8080端口的HTTP服务
$HTTP["url"] =~ "^/app(/|$)" {
    proxy.server = (
        "" => ((
            "host" => "127.0.0.1",
            "port" => 8080
        ))
    )
}

# 代理/websocket路径到8081端口的WebSocket服务(含升级处理)
$HTTP["url"] =~ "^/websocket(/|$)" {
    # 仅对该路径下的WebSocket升级请求做特殊处理
    $REQUEST_HEADER["Upgrade"] == "websocket" {
        setenv.set-request-header = ("Connection" => "Upgrade")
        proxy.header = ( "upgrade" => "enable" )
    }
    # 统一设置代理目标
    proxy.server = (
        "" => ((
            "host" => "127.0.0.1",
            "port" => 8081
        ))
    )
}

关键修正点说明

  1. 嵌套WebSocket升级规则:将WebSocket升级配置放在/websocket路径的条件块内,确保只有该路径下的WebSocket请求才会触发升级逻辑,不会影响/app的代理。
  2. 优化路径匹配正则:使用^/app(/|$)和^/websocket(/|$),同时匹配不带尾斜杠的根路径(如/app)和带尾斜杠的子路径(如/app/xxx),覆盖更全面的请求场景。
  3. 统一代理目标配置:在路径块内集中设置proxy.server,避免多个独立条件块的配置互相覆盖。
  4. 统一主机地址:将原配置中混用的127.0.0.1和localhost统一为127.0.0.1,避免解析差异。

内容的提问来源于stack exchange,提问作者BlameCapitalism

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 04:12:22