nginx反向代理websocket 小坑
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 一样样的道理。
- ws ,得出http代理websocket: ws://example.com/chat;
- 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来测试,我们既然要在条件允许条件下尽可能,尽可能减少差异。
小结
- ws 和 wss 差异如同http 和https 这点开发应该注意事情。
- nginx 反向代理websocket 问题中间 如果有设备 涉及到nginx ,版本可能也会问题 nginx1.3 才开始支持websocket ,一些设备厂商,或者每升级nginx 的东西需要注意版本补丁等问题。
文中引文出自:
https://www.cnblogs.com/mafly/p/websocket.html
nginx反向代理websocket 小坑相关推荐
- Nginx反向代理WebSocket服务连接报错:WebSocket connection to “wssxxxxxx“ failed
最近使用 node.js 搭建 WebSocket 服务,在本地测试 connection 都是正常,于是部署到 Linux 服务上,需要用 Nginx 来反向代理 WebSocket 服务.浏览器控 ...
- Nginx反向代理WebSocket
http {upstream websocket {server 192.168.1.1:8010;}server {listen 8020;location / {proxy_pass http:/ ...
- Nginx 反向代理 websocket 协议
为什么80%的码农都做不了架构师?>>> 主要配置内容 server {listen 80;server_name xxx.xxx.xxx;location / {try_fi ...
- 【详细说明】nginx反向代理wss websocket
[Nginx那些事]系列 [Nginx那些事]nginx 安装及常用指令 [Nginx那些事]Nginx 配置文件说明 [Nginx那些事]nginx原理解析 [Nginx那些事]nginx配置实例( ...
- 【完整教程】nginx反向代理wss,实现不修改服务器端websocket代码加密通讯请求
最近在用go语言的leaf框架开发H5游戏的服务器端,用websocket的方式进行服务器与客户端之间的通讯.然后之前都是本地websocket开发,要部署到facebook平台的时候,平台要求与第三 ...
- 使用Nginx反向代理豆瓣Api电影接口(解决微信小程序频繁调用api被关小黑屋)
首先你要知道什么是Nginx服务器,这个问题百度明白之后继续查看此文章 (要学会自己动手自己独立思考哦) 直接贴代码 ①小程序调用api需要要是https模式才行,https申请请去自己买的云服务器端 ...
- 使用nginx反向代理在微信小程序中使用http请求
使用nginx反向代理在微信小程序中使用http请求 由于微信小程序对第三API的请求做了限制官方说明文档,导致我们无法访问非https的请求,然而我们在开发小程序过程中所请求的第三方接口不一定都是h ...
- 云服务器,Linux上安装xampp,搭建node服务,云服务器Firewalld、iptables,nginx反向代理
目录 写在前面的 前期准备 下载xampp: xampp安装步骤 1.首先链接远程linux服务器 2.xshell终端执行安装命令 3.启动:xampp服务 4.访问数据库,修改数据库密码 安装守护 ...
- Nginx反向代理与负载均衡等配置文件示例
Nginx反向代理于负载均衡等配置文件示例 Nginx.conf配置文件 worker_processes 8;events {worker_connections 1024; }http {incl ...
最新文章
- 集众家之所长,你工作中遇到的可视化问题,如何在 Tableau 官网提交 Case?
- Oracle任务调度的高级选项
- 短url服务java_Serverless-实现一个短网址服务(二)
- mongodb集群数据同步及故障演练
- 图卷积网络-《深入浅出图神经网络》读书笔记
- 基于腾讯云播放器封装的Flutter Video Player插件
- 985 材料专业研究生年薪 20 多万也不少了吧,为什么还有那么多人劝退,转行能挣多少钱?
- detecting android sdk, Select Android SDK directory
- Koo叔说Shader—果冻效果
- 利用requests库模拟访问博客来提升文章阅读量
- Work20230417
- 武汉工程大学第一届程序设计女生赛(牛客contest 4746)解题报告 Apare_xzc
- VMware安装Centos7和卸载超详细过程(图文)
- studio 3t 如何链接开启验证的mongodb
- 线性代数_4、行列式按行展开,异乘变零,拉普拉斯定理
- iPhone手机使用:iPhone XR的双卡双待设置
- 简单的营销策略重复做,发挥到极致就是一心一意的去做
- 【小程序】爆肝 3 天总结的微信小程序优化指南(收藏夹吃灰吧!)
- JSP、Servlet、JDBC学习笔记
- 国际化复数形式的支持与pygettext的补丁