如何通过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 )) ) }
关键修正点说明
- 嵌套WebSocket升级规则:将WebSocket升级配置放在
/websocket路径的条件块内,确保只有该路径下的WebSocket请求才会触发升级逻辑,不会影响/app的代理。 - 优化路径匹配正则:使用
^/app(/|$)和^/websocket(/|$),同时匹配不带尾斜杠的根路径(如/app)和带尾斜杠的子路径(如/app/xxx),覆盖更全面的请求场景。 - 统一代理目标配置:在路径块内集中设置
proxy.server,避免多个独立条件块的配置互相覆盖。 - 统一主机地址:将原配置中混用的
127.0.0.1和localhost统一为127.0.0.1,避免解析差异。
内容的提问来源于stack exchange,提问作者BlameCapitalism
相关产品推荐
相关产品推荐

