Nginx配置WSS反向代理遇404错误及SSL_read()失败问题求助
Nginx配置WSS反向代理遇404错误及SSL_read()失败问题求助
我之前折腾WSS反向代理的时候也踩过类似的坑,结合你的配置和问题描述,帮你梳理下核心问题和解决办法:
一、核心问题:404错误的根源
你用location /statistics时出现404,换成location /就正常,问题出在Nginx的proxy_pass路径规则上:
- Apache的
ProxyPass在匹配/statistics时,会自动把请求中的/statistics路径去掉,转发到后端的根路径/; - 但你当前Nginx的
proxy_pass https://127.0.0.1:23456;没有加末尾的斜杠,会把完整的请求路径(比如/statistics)直接传给后端,而你测试后端wss://kaveneger.ir:23456是正常的,说明后端只监听根路径/,根本没有/statistics这个路由,所以返回404。
二、针对性解决步骤
1. 修正proxy_pass路径,添加末尾斜杠
把location /statistics里的proxy_pass改成带斜杠的形式,让Nginx自动替换掉匹配的/statistics路径:
location /statistics { # 关键:末尾加斜杠,将/statistics映射到后端的/ proxy_pass https://127.0.0.1:23456/; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; # 调整proxy_ssl_name为后端的IP/域名,确保SSL SNI匹配 proxy_ssl_name 127.0.0.1; proxy_ssl_session_reuse off; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 去掉不必要的客户端证书配置,除非后端明确要求验证客户端证书 # proxy_ssl_certificate "/etc/letsencrypt/live/domain/fullchain.pem"; # proxy_ssl_certificate_key "/etc/letsencrypt/live/domain/privkey.pem"; }
2. 调整SSL相关配置
proxy_ssl_name:要设置为后端服务器的IP或域名(比如这里的127.0.0.1),而不是前端的$host,否则后端SSL证书的SNI校验会失败;- 去掉
proxy_ssl_certificate和proxy_ssl_certificate_key:这两个是Nginx作为客户端向后端发起SSL请求时提供的证书,如果你后端没有要求客户端证书验证,这两行反而会导致握手异常。
3. 验证配置并重启Nginx
先检查配置语法是否正确:
nginx -t
如果提示test is successful,就重启Nginx:
nginx -s reload
三、关于SSL_read() failed错误的说明
日志里的这个错误大概率是404错误导致的连锁反应:当Nginx返回404后,客户端提前关闭了连接,导致SSL握手还没完成就中断,从而触发这个错误。解决404问题后,这个SSL错误应该会自动消失。
四、测试验证
重新用wscat测试:
wscat -c wss://domain.com:444/statistics
正常情况下应该能成功连接了。
备注:内容来源于stack exchange,提问作者Steve Moretz
相关产品推荐
相关产品推荐

