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
相关产品推荐
相关产品推荐

