Deluge客户端经Nginx gRPC反向代理连接失败问题排查
Deluge RPC反向代理故障解决方案
问题根因
Deluge daemon默认监听的58846端口走的是自定义二进制RPC协议,不属于HTTP、gRPC、HTTP/2任何一类Web协议。之前用Nginx的HTTP、gRPC反向代理规则转发流量时,Nginx会尝试按HTTP协议规范解析客户端发送的二进制报文,自然会出现乱码、无效请求行、HTTP/2连接前缀非法这类报错,和TLS配置、HTTP/2支持没有关系。
已排查确认的正常项
- 局域网内Deluge桌面端、安卓端、WebUI连接RPC服务均正常
- Nginx可正常接收公网请求,周边防火墙、端口转发、DNS配置无异常
- Deluge服务本身运行无故障
可行解决方案
方案1:四层TCP代理转发原生RPC流量(适配所有原生客户端)
用Nginx的stream模块做传输层转发,不对上层协议做解析,直接透传TCP流量即可适配Deluge原生RPC协议,配置步骤:
- 执行
nginx -V检查输出参数,确认已编译带--with-stream模块,Nginx官方安装包默认自带该模块 - 在Nginx配置文件中,在
http {}块的同级位置新增stream配置段,不要写在http块内部:stream { server { listen 58850; proxy_pass localhost:58846; # 适配RPC长连接,避免空闲时连接被主动断开 proxy_timeout 300s; proxy_connect_timeout 5s; # 如需开启TLS加密,取消下面两行注释即可,证书路径和之前HTTP配置一致 # ssl_certificate /etc/ssl/nginx/example.com.pem; # ssl_certificate_key /etc/ssl/nginx/example.com.key; } } - 删除之前在http块中配置的监听58850端口的Deluge相关server段,避免端口冲突
- 执行
nginx -t校验配置无语法错误后,执行nginx -s reload重载配置即可。此时桌面端、安卓端原生Deluge客户端直接连接deluge.example.com:58850即可正常通信。
方案2:反向代理HTTP WebUI(仅网页访问场景)
如果不需要使用原生桌面、移动端客户端,只需要通过浏览器访问Deluge,直接代理Deluge默认的8112 WebUI端口即可,该端口走标准HTTP协议,普通HTTP反向代理可正常工作,参考配置:
server { listen 443 ssl http2; server_name deluge.example.com; ssl_certificate /etc/ssl/nginx/example.com.pem; ssl_certificate_key /etc/ssl/nginx/example.com.key; location / { proxy_pass http://localhost:8112; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 适配WebUI的WebSocket推送 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
配置校验重载后,直接访问https://deluge.example.com即可打开WebUI。
之前配置的错误点说明
- 用
grpc://做反向代理完全不适用:gRPC是基于HTTP/2的标准化RPC协议,和Deluge的私有二进制RPC协议没有兼容性 - 给监听端口加
http2参数无法解决问题:客户端发送的根本不是HTTP/2流量,自然会触发「invalid connection preface」报错,日志中的乱码就是二进制RPC报文被强行按HTTP文本解析的结果 - 公网传输建议开启TLS加密,四层TCP代理下开启TLS不需要修改客户端连接逻辑,Deluge原生客户端本身支持RPC over TLS。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

