nginx 反向代理websocket 的小坑

  • 现象
    • 第一坑
    • 第二坑
    • 小结

现象

  因为小程序,有域名有个websocket 需要做个反向代理,按照需求测试和生产都给做了反向代理。

给他们配置过测试环境,上线的时候告诉我怎么都连不上,作为运维部,只有配合一起调试,查找原因。

第一坑

首先我们拿到问题分析,测试和生产的区别,测试域名使用的http,生产使用的https 首先我看到这个差异,从这个地方找原因。

测试看上:101 正确返回

生产环境:

图示其实上面图示很明确了需要使用wss,为更一步确认信息。
生产https 有证书解析的websocket 是否支持证书加密??带着这个疑问,差约了些资料,websocket 的确支持https加密协议的不过,有点差异。

ws 和 wss 又是什么鬼?
Websocket使用 ws 或 wss 的统一资源标志符,类似于 HTTP 或 HTTPS,其中 wss 表示在 TLS 之上的 Websocket ,相当于 HTTPS 了。如:
ws://example.com/chat
wss://example.com/chat
默认情况下,Websocket 的 ws 协议使用 80 端口;运行在TLS之上时,wss 协议默认使用 443 端口。其实说白了,wss 就是 ws 基于 SSL 的安全传输,与 HTTPS 一样样的道理。

  1. ws ,得出http代理websocket: ws://example.com/chat;
  2. wss,我们看出https代理websocket:wss://example.com/chat
    生产和测试如果代码一样的话肯定就不对了,为此开发吧地址从:
    ws 改成了 wss 成功,然后开发组同事从web也调取成功,功成身退。

第二坑

  回到自己座位不到半小时,开发部门又找过来,说生产还有问题?

带着疑问再次配合他们找问题,发现问题重现的环境在,我们的外网和有问题,内网没有问题,所以我们撸了一遍环境差异。

生产环境外网 生产环境内网
格尔网关 nginx ssl 卸载
瑞数安全设备
应用 应用

差异可以看出 生产外网差别是多个格尔网关,
这个设备其实也是nginx 封装产品。
我们看下现状 外网 返回的竟然是个404
显然这个显然 个人猜测实是协议转发过去不对了,wss不存在404 一说,所以我还是去万能的互联网 查找下nginx 反向代理websocket 相关问题。

Nginx 配置域名支持 WSS
不用废话,直接在配置 HTTPS 域名位置加入如下配置:
location /websocket {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
}
接着拿域名再次连接试一下,不出意外会看 101 状态码:
upgrade_101
这样就完成了,在 HTTPPS 下以域名方式连接 WebSocket ,可以开心的玩耍了。
稍微解释一下 Nginx 配置
Nginx 自从 1.3 版本就开始支持 WebSocket 了,并且可以为 WebSocket 应用程序做反向代理和负载均衡。
WebSocket 和 HTTP 协议不同,但是 WebSocket 中的握手和 HTTP 中的握手兼容,它使用 HTTP 中的 Upgrade 协议头将连接从 HTTP 升级到 WebSocket,当客户端发过来一个 Connection: Upgrade请求头时,Nginx 是不知道的,所以,当 Nginx 代理服务器拦截到一个客户端发来的 Upgrade 请求时,需要显式来设置Connection 、Upgrade 头信息,并使用 101(交换协议)返回响应,在客户端和代理服务器、后端服务器之间建立隧道来支持 WebSocket。
当然,还需要注意一下,WebSockets 仍然受到 Nginx 缺省为60秒的 proxy_read_timeout 的影响。这意味着,如果你有一个程序使用了 WebSockets,但又可能超过60秒不发送任何数据的话,那你要么需要增加超时时间,要么实现一个 ping 的消息以保持联系。使用 ping 的解决方法有额外的好处,可以发现连接是否被意外关闭。
更具体文档详见 Nginx 官方文档:http://nginx.org/en/docs/http/websocket.html

我们看到一个信息nginx 1.3版本开始支持websocket ,严重怀疑问题出在格尔网关的版本上,咨询了格尔厂商支持问题,说没有打上websocket 补丁。
至此问题都算找到原因和解决方法。
显然格尔网关依然把 wss 当做http 协议转到应用 必然出现404现象。

为避免出现这种生产和测试不一致的情况,责令测试开发环境也使用https来测试,我们既然要在条件允许条件下尽可能,尽可能减少差异。

小结

  1. wswss 差异如同http 和https 这点开发应该注意事情。
  2. nginx 反向代理websocket 问题中间 如果有设备 涉及到nginx ,版本可能也会问题 nginx1.3 才开始支持websocket ,一些设备厂商,或者每升级nginx 的东西需要注意版本补丁等问题。

文中引文出自:
https://www.cnblogs.com/mafly/p/websocket.html

nginx反向代理websocket 小坑相关推荐

  1. Nginx反向代理WebSocket服务连接报错:WebSocket connection to “wssxxxxxx“ failed

    最近使用 node.js 搭建 WebSocket 服务,在本地测试 connection 都是正常,于是部署到 Linux 服务上,需要用 Nginx 来反向代理 WebSocket 服务.浏览器控 ...

  2. Nginx反向代理WebSocket

    http {upstream websocket {server 192.168.1.1:8010;}server {listen 8020;location / {proxy_pass http:/ ...

  3. Nginx 反向代理 websocket 协议

    为什么80%的码农都做不了架构师?>>>    主要配置内容 server {listen 80;server_name xxx.xxx.xxx;location / {try_fi ...

  4. 【详细说明】nginx反向代理wss websocket

    [Nginx那些事]系列 [Nginx那些事]nginx 安装及常用指令 [Nginx那些事]Nginx 配置文件说明 [Nginx那些事]nginx原理解析 [Nginx那些事]nginx配置实例( ...

  5. 【完整教程】nginx反向代理wss,实现不修改服务器端websocket代码加密通讯请求

    最近在用go语言的leaf框架开发H5游戏的服务器端,用websocket的方式进行服务器与客户端之间的通讯.然后之前都是本地websocket开发,要部署到facebook平台的时候,平台要求与第三 ...

  6. 使用Nginx反向代理豆瓣Api电影接口(解决微信小程序频繁调用api被关小黑屋)

    首先你要知道什么是Nginx服务器,这个问题百度明白之后继续查看此文章 (要学会自己动手自己独立思考哦) 直接贴代码 ①小程序调用api需要要是https模式才行,https申请请去自己买的云服务器端 ...

  7. 使用nginx反向代理在微信小程序中使用http请求

    使用nginx反向代理在微信小程序中使用http请求 由于微信小程序对第三API的请求做了限制官方说明文档,导致我们无法访问非https的请求,然而我们在开发小程序过程中所请求的第三方接口不一定都是h ...

  8. 云服务器,Linux上安装xampp,搭建node服务,云服务器Firewalld、iptables,nginx反向代理

    目录 写在前面的 前期准备 下载xampp: xampp安装步骤 1.首先链接远程linux服务器 2.xshell终端执行安装命令 3.启动:xampp服务 4.访问数据库,修改数据库密码 安装守护 ...

  9. Nginx反向代理与负载均衡等配置文件示例

    Nginx反向代理于负载均衡等配置文件示例 Nginx.conf配置文件 worker_processes 8;events {worker_connections 1024; }http {incl ...

最新文章

  1. 集众家之所长,你工作中遇到的可视化问题,如何在 Tableau 官网提交 Case?
  2. Oracle任务调度的高级选项
  3. 短url服务java_Serverless-实现一个短网址服务(二)
  4. mongodb集群数据同步及故障演练
  5. 图卷积网络-《深入浅出图神经网络》读书笔记
  6. 基于腾讯云播放器封装的Flutter Video Player插件
  7. 985 材料专业研究生年薪 20 多万也不少了吧,为什么还有那么多人劝退,转行能挣多少钱?
  8. detecting android sdk, Select Android SDK directory
  9. Koo叔说Shader—果冻效果
  10. 利用requests库模拟访问博客来提升文章阅读量
  11. Work20230417
  12. 武汉工程大学第一届程序设计女生赛(牛客contest 4746)解题报告 Apare_xzc
  13. VMware安装Centos7和卸载超详细过程(图文)
  14. studio 3t 如何链接开启验证的mongodb
  15. 线性代数_4、行列式按行展开,异乘变零,拉普拉斯定理
  16. iPhone手机使用:iPhone XR的双卡双待设置
  17. 简单的营销策略重复做,发挥到极致就是一心一意的去做
  18. 【小程序】爆肝 3 天总结的微信小程序优化指南(收藏夹吃灰吧!)
  19. JSP、Servlet、JDBC学习笔记
  20. 国际化复数形式的支持与pygettext的补丁

热门文章

  1. 光彩夺目的30款太阳光线照射Ps笔刷
  2. ps2023宿主滤镜磨皮插件Portraiture安装教程
  3. PR第二次培训笔记(基本剪辑步骤 导出)
  4. 阿俊带你用Kotlin刷算法(三)
  5. [模型库]两款经典puma560机器人三维模型
  6. 如何编写优秀的测试用例,建议收藏和转发
  7. html网页设计期末大作业——化妆品html+div商城(19页)
  8. 转载:基于MATLAB的几种图像分割算法
  9. 读《熵减 华为活力之源》
  10. 图说卡尔曼滤波(正在进行时)