• 售前

  • 售后

热门帖子
入门百科

nginx反向署理webSocket配置详解

[复制链接]
一叶知秋117 显示全部楼层 发表于 2021-10-25 19:25:32 |阅读模式 打印 上一主题 下一主题
最近在做项目标时候用到了webSocket协议,而且是在微信小步伐中用到了webSocket,微信小步伐中使用wss协议的时候不能设置端口,只能使用默认的443端口。我擦,我的https已经监听了443端口,webSocket再去监听443,肯定不行啊。要想办法办理,老大把这个问题交给我了,我愉快(手动懵逼)的吸收了这个任务。想到了两种办法办理。一种办理办法是把webSocket摆设到另一台服务器上,这样本钱也太高了。另一种办法,就是使用nginx反向代理。
由于webSocket协议是基于http协议升级的(见下图),以是可以使用nginx反向代理webSocket.

webSocket

从这张图片上可以看出,webSocket毗连的创建是在http协议的基础上。
  1. GET /chat HTTP/1.1
  2. Host: server.example.com
  3. Upgrade: websocket
  4. Connection: Upgrade
  5. Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
  6. Sec-WebSocket-Protocol: chat, superchat
  7. Sec-WebSocket-Version: 13
  8. Origin: http://example.com
复制代码
熟悉HTTP的童鞋大概发现了,这段雷同HTTP协议的握手请求中,只是多了几个东西。
  1. Upgrade: websocket
  2. Connection: Upgrade
  3. 这个就是Websocket的核心了,告诉Apache、Nginx等服务器:我发起的是Websocket协议。
  4. Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
  5. Sec-WebSocket-Protocol: chat, superchat
  6. Sec-WebSocket-Version: 13
复制代码
起首,Sec-WebSocket-Key 是一个Base64 encode的值,这个是欣赏器随机生成的,告诉服务器:泥煤,不要忽悠窝,我要验证尼是不是真的是Websocket助理。
最后,Sec-WebSocket-Version 是告诉服务器所使用的Websocket Draft(协议版本),在最初的时候,Websocket协议还在 Draft 阶段,各种奇奇怪怪的协议都有,而且另有很多期奇奇怪怪差别的东西,什么Firefox和Chrome用的不是一个版本之类的,当初Websocket协议太多可是一个浩劫题。。不外现在还好,已经定下来啦 各人都使用的一个东西
然后服务器会返回下列东西,表现已经担当到请求, 成功创建Websocket啦!
  1. HTTP/1.1 101 Switching Protocols
  2. Upgrade: websocket
  3. Connection: Upgrade
  4. Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
  5. Sec-WebSocket-Protocol: chat
复制代码
这里开始就是HTTP最后负责的地域了,告诉客户,我已经成功切换协议啦~
  1. Upgrade: websocket
  2. Connection: Upgrade
复制代码
依然是固定的,告诉客户端即将升级的是Websocket协议。至此,HTTP已经完成它全部工作了,接下来就是完全按照Websocket协议举行了。
明确协议的原理了就可以下一步了
起首nginx先设置好https的证书

服务器的证书是老大设置好的,我就直接用了。需要的本身查一下吧0.0
在nginx设置文件的
  1. service
复制代码
节点中添加如下设置
  1. location /wss
  2.     {
  3.          proxy_pass http://127.0.0.1:8888;
  4.          proxy_http_version 1.1;
  5.          proxy_set_header Upgrade $http_upgrade;
  6.          proxy_set_header Connection "Upgrade";
  7.         proxy_set_header X-Real-IP $remote_addr;
  8.      }
复制代码
表明一下参数
  1. /wss
复制代码
这个是随便起的,告诉Nginx要代理的url,现在我的设置为
  1. wss
复制代码
,当我访问的我的服务器
  1. https://abc.com/wss
复制代码
时,Nginx会把我的请求映射到本机的8888端口。
  1. proxy_pass
复制代码
要代理到的url,我的代理到本机的8888端口。
  1. proxy_http_version
复制代码
代理时使用的 http版本。
重点来了:
代理webSocket的关键参数
  1. proxy_set_header Upgrade
复制代码
把代理时http请求头的
  1. Upgrade
复制代码
设置为原来http请求的请求头,wss协议的请求头为
  1. websocket
复制代码
  1. proxy_set_header Connection
复制代码
由于代理的wss协议,以是http请求头的
  1. Connection
复制代码
设置为
  1. Upgrade
复制代码

  1. proxy_set_header X-Real-IP
复制代码
给代理设置原http请求的ip,填写
  1. $remote_addr
复制代码
即可
至于websocket协议的response的参数,在反向代理的时候不用管。
到这里,Nginx反向代理webSocket的设置就完成了,重启Nginx,用websocket毗连试试,在原来wss地点的地方填写
  1. wss://abc.com/wss
复制代码
。假如websocket成功毗连,说明Nginx反向代理websocket已经成功了。
总结

现在的设置只是反向代理到本机时的设置,假如要反向代理到别的主机,在代理时大概会跨域问题,需要在Nginx的反向代理中做跨域的设置。
思索

在Nginx的设置文件中能看到这一段
  1. location ~ .php$ {
  2.    root html;
  3.    fastcgi_pass 127.0.0.1:9000;
  4.    fastcgi_index index.php;
  5.    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  6.    include fastcgi_params;
  7. }
复制代码
这是Nginx中php的设置文件,我擦,怎么这么眼熟,这个设置清单跟刚才的websocket的反向代理这么像。通过上网查资料才知道,原来Nginx在处置处罚php范例的请求时,把请求发fastcgi管理进程处置处罚,fascgi管理进程选择cgi子进程处置处罚结果并返回被nginx,而php-fpm是一个PHP FastCGI管理器,nginx本身不能处置处罚PHP,它只是个web服务器,当吸收到请求后,假如是php请求,则发给php表明器处置处罚,并把结果返回给客户端。以是说Nginx在处置处罚php范例的请求时,本质上也是通过反向代理功能实现的。
我们可以把头脑展开,用Nginx反向代理可以实现更多的功能,比如代理Tomcat
  1. location /Tomcat
  2.     {
  3.          proxy_pass http://127.0.0.1:8080;
  4.          proxy_http_version 1.1;
  5.         proxy_set_header X-Real-IP $remote_addr;
  6.      }
复制代码
当然,也可以用Nginx反向代理实现负载平衡,这个我还没有试过,等以后用到了,再来增补
以上就是本文的全部内容,希望对各人的学习有所资助,也希望各人多多支持脚本之家。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作