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

NGINX:两个不同WebSocket客户端连接日志异常问题排查求助

我来帮你分析下这个问题——JS客户端能通过wss成功连到NGINX反向代理的7000端口WebSocket服务,但用libwebsockets的C++客户端却不行,对吧?结合你给出的NGINX日志,我梳理几个常见的排查点和解决办法:

1. 先确认libwebsockets的TLS配置是否完整

这是最容易出问题的点:浏览器会自动调用系统根证书池验证服务端证书,但libwebsockets需要你手动配置证书相关参数:

  • 如果服务端用的是自签证书,要在C++代码里指定context->ssl_ca_file指向你的CA证书文件,不然会触发证书验证失败
  • 如果是公共CA签发的证书,得确保libwebsockets能找到系统的CA证书路径(比如Linux下是/etc/ssl/certs/ca-certificates.crt,Windows下需要指定系统证书存储路径)
  • 临时测试可以开启LCCSCF_ALLOW_SELFSIGNED和LCCSCF_SKIP_SERVER_CERT_HOSTNAME_CHECK跳过验证,但生产环境绝对不能这么做
2. 核对HTTP握手请求头的差异

从NGINX日志看,JS客户端的握手请求是标准格式:

[04/May/2018:12:25:30 +0000] "GET / HTTP/1.1" 101 0 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/ Safari/537.36"

而libwebsockets的默认请求头可能和浏览器有差异,需要检查:

  • 确保请求路径是/,和JS客户端完全一致,不要带多余的后缀
  • 确认Host头正确设置为NGINX的域名/IP:7000
  • 虽然libwebsockets通常会自动处理Upgrade和Connection头,但旧版本可能存在bug,你可以手动在代码里指定这些头字段
3. 检查NGINX是否拦截了libwebsockets的请求

有些NGINX配置会针对User-Agent做限制,JS客户端用的是浏览器标识,而libwebsockets默认的User-Agent是libwebsockets。你可以尝试在C++代码里修改User-Agent来匹配浏览器:

struct lws_client_connect_info ccinfo = {0};
// 复制JS客户端的User-Agent
ccinfo.user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/ Safari/537.36";
4. 开启libwebsockets的调试日志定位问题

开启详细日志能帮你看到握手过程的具体错误:

// 开启错误、警告、信息、调试级别的日志
lws_set_log_level(LLL_ERR | LLL_WARN | LLL_INFO | LLL_DEBUG, NULL);

重点看TLS握手阶段的日志,比如是否有证书验证失败、握手超时、请求被NGINX拒绝等信息。

5. 排查网络层面的差异
  • 先用curl -v -k wss://你的域名:7000测试C++客户端所在机器能否正常访问服务,排除网络连通性问题
  • 如果是Windows平台,检查防火墙是否允许C++客户端出站访问7000端口
  • 确认是否有代理服务器干扰:浏览器可能自动使用系统代理,但libwebsockets需要你手动在代码里配置代理参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:04:54