WebSocket 结合 Nginx 实现域名及 WSS 协议访问
简单了解一下 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 协议访问相关推荐
- Nginx去配置socket的时候,发现nginx没有配置ws/wss协议,配置步骤如下
配置之前需要知道ws协议和wss协议的区别 一.WS 和 WSS 的区别 WebSocket 协议是 html5 的一种通信协议,可以使客户端和服务端双向数据传输更加简单快捷,并且在 TCP 连接进行 ...
- 宝塔Nginx搭建多个WSS协议
websocket配置wss协议,步骤如下: 一.宝塔点击:网站->设置->配置文档,在配置文件中 server上部添加以下代码 map $http_upgrade $connection ...
- nginx配置域名启用http2协议
HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议.HTTP/2在支持HTTP1.1的基础上拓展了, 较之1.1在性能上有着大 ...
- Nginx配置域名转发及https访问
1.概述 当在一个服务器部署多个服务,不同服务需要通过不同域名访问时,可以通过Nginx代理进行域名转发,同时还可以通过配置SSL模块实现https访问. 本文示例的业务需求为: 在一个服务器同时部署 ...
- Netty通过Nginx配置 wss 协议访问(实践可行)
先写个比较简单的,后面再写一篇Vue + springboot +netty Netty在互联网以及物联网公司用的很多,底层走的还是 websocket协议,好处很多,就不一一列了,相关的文章很多,大 ...
- 【无标题】记录nginx多域名配置,浏览器访问提示:无法访问此网站 连接已重置。
问题记录 多域名配置无法访问可能的问题 1.域名未解析 云解析DNS->域名解析->解析设置->新手引导->填写记录值(服务器ip)->完成 2.ssl证书未配置 域名服 ...
- nginx实现对websocket加密协议wss协议的反向代理以及websocket整合springboot入门(踩坑)
出发点 最近公司需要有一个推送前端消息的需求 首选websocket进行推送,也做过客服系统接触过,最近看了一点websocket的相关内容记录总结一下. 什么是websocket websocket ...
- 使用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 ...
- 详细nginx配置websocket的wss协议
需求: 小程序连接websocket,必须使用wss协议 nginx配置websocket以及wss协议 其实wss协议就是使用了ssl协议的域名所自带的协议,所以wss协议需要域名来进行socket ...
最新文章
- 第二课时之python认识
- Numpy自定义dtype的一个使用误区
- 【XAF问题】多个属性验证RuleUniqueValue
- 为什么使用hibernate
- mysql8创建用户并授权_新版mysql8.0.12添加用户并设置权限避免踩坑!
- alias用法和对当前用户的永久配置
- Linux入门学习(二)
- Python学习入门基础教程(learning Python)--4.3 Python的for嵌套
- 调试器---镜像劫持
- Python:字符宽度相同的字体(等宽字体)
- Python实现页面置换算法
- teambition 还是jira_研发管理工具之 Id 比较(Jira/Teambition/TAPD/禅道)
- 浅谈JPA一:JPA是什么?
- 微信公众号推送天气(最近超火的小玩意)
- 检查凭证录入模板的核算项目研发项目是否录入
- Hive 数据倾斜问题定位排查及解决(实际案例)
- 名编辑电子杂志大师教程 | 如何打开名编辑电子杂志大师帮助文档?
- liunx下调整CPU参数获得高性能
- C++判断一个日期是某一年的多少天(含闰年判断)
- TCL脚本语言详解(1)
热门文章
- 【数据分析】—— 指标与指标体系
- 2015年第六届蓝桥杯C/C++程序设计本科B组省赛 星系炸弹(日期推算)
- 通信、电子保研经验贴,北京理工大学+中国科学院大学空天所
- 办公室VR黄片,骚操作!微软HoloLens之父辞职!
- ES6-ES11-第一部分-let、const、解构赋值、模板字符串、简化对象写法、箭头函数、函数参数默认值、rest 参数、扩展运算符、Symbol、迭代器、生成器、Promise、Set、Map
- php怎么获取html span标签的值_如何获取PHP中所有html元素的列表?
- python 词云学习
- android多个按钮美化,Android开发学习系列(一)——Android按钮圆角美化
- 7 HomePlug AV 中央协调器CCo
- 支持图灵架构和安培架构的TensorFlow Python库