简单了解一下 WebSocket

现在,很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。
在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
WebSocket一种在单个 TCP 连接上进行全双工通讯的协议。使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

以上信息摘自维基百科(https://zh.wikipedia.org/wiki/WebSocket)

简单点说,WebSocket 就是减小客户端与服务器端建立连接的次数,减小系统资源开销,只需要一次 HTTP 握手,整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直与客户端保持连接,直到你关闭请求,同时由原本的客户端主动询问,转换为服务器有信息的时候推送。当然,它还能做实时通信、更好的二进制支持、支持扩展、更好的压缩效果等这些优点。

推荐一个知乎上叫 Ovear 的网友关于 WebSocket 原理的回答,嘻哈风格科普文,简直不要更赞了!地址:https://www.zhihu.com/question/20215561/answer/40316953

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 一样样的道理。

如果你的网站是 HTTPS 协议的,那你就不能使用 ws:// 了,浏览器会 block 掉连接,和 HTTPS 下不允许 HTTP 请求一样,如下图:

Mixed Content: The page at 'https://domain.com/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://x.x.x.x:xxxx/'. This request has been blocked; this endpoint must be available over WSS.

这种情况,毫无疑问我们就需要使用 wss:\\ 安全协议了,我们是不是简单的把 ws:\\ 改为 wss:\\ 就行了?那试试呗。

改好了,报错啦!!!

VM512:35 WebSocket connection to 'wss://IP地址:端口号/websocket' failed: Error in connection establishment: net::ERR_SSL_PROTOCOL_ERROR

很明显 SSL 协议错误,说明就是证书问题了。记着,这时候我们一直拿的是 IP地址 + 端口号 这种方式连接 WebSocket 的,这根本就没有证书存在好么,况且生成环境你也要用 IP地址 + 端口号 这种方式连接 WebSocket 吗?肯定不行阿,要用域名方式连接 WebSocket 阿。

Nginx 配置域名支持 WSS

不用废话,直接在配置 HTTPS 域名位置加入如下配置:

server {
listen 443;
server_name test.xxxx.com;access_log logs/test.xxxx.log main;ssl on;
ssl_certificate /etc/test.xxxx.com.cer;  # 这里是服务端的证书路径
ssl_certificate_key /etc/test.xxxx.com.key; # 这里是秘钥路径
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 SSLv2 SSLv3;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
ssl_verify_client off;location / {
proxy_redirect off;
proxy_pass http://test;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “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

Unexpected response code:404问题解决方案。

希望此文能够帮助到您!

WebSocket 结合 Nginx 实现域名及 WSS 协议访问相关推荐

  1. Nginx去配置socket的时候,发现nginx没有配置ws/wss协议,配置步骤如下

    配置之前需要知道ws协议和wss协议的区别 一.WS 和 WSS 的区别 WebSocket 协议是 html5 的一种通信协议,可以使客户端和服务端双向数据传输更加简单快捷,并且在 TCP 连接进行 ...

  2. 宝塔Nginx搭建多个WSS协议

    websocket配置wss协议,步骤如下: 一.宝塔点击:网站->设置->配置文档,在配置文件中 server上部添加以下代码 map $http_upgrade $connection ...

  3. nginx配置域名启用http2协议

    HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议.HTTP/2在支持HTTP1.1的基础上拓展了, 较之1.1在性能上有着大 ...

  4. Nginx配置域名转发及https访问

    1.概述 当在一个服务器部署多个服务,不同服务需要通过不同域名访问时,可以通过Nginx代理进行域名转发,同时还可以通过配置SSL模块实现https访问. 本文示例的业务需求为: 在一个服务器同时部署 ...

  5. Netty通过Nginx配置 wss 协议访问(实践可行)

    先写个比较简单的,后面再写一篇Vue + springboot +netty Netty在互联网以及物联网公司用的很多,底层走的还是 websocket协议,好处很多,就不一一列了,相关的文章很多,大 ...

  6. 【无标题】记录nginx多域名配置,浏览器访问提示:无法访问此网站 连接已重置。

    问题记录 多域名配置无法访问可能的问题 1.域名未解析 云解析DNS->域名解析->解析设置->新手引导->填写记录值(服务器ip)->完成 2.ssl证书未配置 域名服 ...

  7. nginx实现对websocket加密协议wss协议的反向代理以及websocket整合springboot入门(踩坑)

    出发点 最近公司需要有一个推送前端消息的需求 首选websocket进行推送,也做过客服系统接触过,最近看了一点websocket的相关内容记录总结一下. 什么是websocket websocket ...

  8. 使用nginx解决一台服务器中ws协议与wss协议共存问题 2017-07-09 13:29:06

    https://www.worldflying.cn/article-id-13.html https://tieba.baidu.com/p/5213484390?red_tag=000961462 ...

  9. 详细nginx配置websocket的wss协议

    需求: 小程序连接websocket,必须使用wss协议 nginx配置websocket以及wss协议 其实wss协议就是使用了ssl协议的域名所自带的协议,所以wss协议需要域名来进行socket ...

最新文章

  1. 第二课时之python认识
  2. Numpy自定义dtype的一个使用误区
  3. 【XAF问题】多个属性验证RuleUniqueValue
  4. 为什么使用hibernate
  5. mysql8创建用户并授权_新版mysql8.0.12添加用户并设置权限避免踩坑!
  6. alias用法和对当前用户的永久配置
  7. Linux入门学习(二)
  8. Python学习入门基础教程(learning Python)--4.3 Python的for嵌套
  9. 调试器---镜像劫持
  10. Python:字符宽度相同的字体(等宽字体)
  11. Python实现页面置换算法
  12. teambition 还是jira_研发管理工具之 Id 比较(Jira/Teambition/TAPD/禅道)
  13. 浅谈JPA一:JPA是什么?
  14. 微信公众号推送天气(最近超火的小玩意)
  15. 检查凭证录入模板的核算项目研发项目是否录入
  16. Hive 数据倾斜问题定位排查及解决(实际案例)
  17. 名编辑电子杂志大师教程 | 如何打开名编辑电子杂志大师帮助文档?
  18. liunx下调整CPU参数获得高性能
  19. C++判断一个日期是某一年的多少天(含闰年判断)
  20. TCL脚本语言详解(1)

热门文章

  1. 【数据分析】—— 指标与指标体系
  2. 2015年第六届蓝桥杯C/C++程序设计本科B组省赛 星系炸弹(日期推算)
  3. 通信、电子保研经验贴,北京理工大学+中国科学院大学空天所
  4. 办公室VR黄片,骚操作!微软HoloLens之父辞职!
  5. ES6-ES11-第一部分-let、const、解构赋值、模板字符串、简化对象写法、箭头函数、函数参数默认值、rest 参数、扩展运算符、Symbol、迭代器、生成器、Promise、Set、Map
  6. php怎么获取html span标签的值_如何获取PHP中所有html元素的列表?
  7. python 词云学习
  8. android多个按钮美化,Android开发学习系列(一)——Android按钮圆角美化
  9. 7 HomePlug AV 中央协调器CCo
  10. 支持图灵架构和安培架构的TensorFlow Python库