【Nginx笔记02】通过Nginx服务器转发客户端的WebSocket接口到后端服务

这篇具有很好参考价值的文章主要介绍了【Nginx笔记02】通过Nginx服务器转发客户端的WebSocket接口到后端服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇文章,主要介绍如何通过Nginx服务器转发客户端的WebSocket接口到后端服务【知识星球】。

目录

一、Nginx配置WebSocket

1.1、Nginx配置内容

1.2、客户端请求地址

1.3、创建WebSocket测试工程

1.4、启动测试

1.5、WebSocket超时问题

1.5.1、设置超时时间

1.5.2、建立心跳机制(推荐)


一、Nginx配置WebSocket

今天在工作中,遇到了一个需求,这个需求大概是前端和后端需要采用WebSocket方式来进行通信,因为是WebSocket接口,客户端需要知道通讯的接口地址,WebSocket接口的地址格式是:【ws://ip:port/xxx/yyy】,其中ip和port是后端服务提供的,/xxx/yyy是后端服务中提供的具体WebSocket接口地址。

这里就遇到了一个问题,后端服务不止一台,有可能启动两台服务,采用不同的端口来区分,客户端就不知道应该填写哪个port端口,后面想到的解决方案是通过Nginx服务器进行WebSocket接口的转发,让Nginx来决定调用哪个WebSocket接口,而客户端只需要和Nginx服务器进行交互即可。

案例下载地址:【https://download.csdn.net/download/qq_39826207/88883292】

1.1、Nginx配置内容

为了让Nginx能够代理转发WebSocket接口,我们需要针对WebSocket接口地址配置一个location信息,使用proxy_pass转发到具体的后端接口服务。在nginx.conf配置文件中,添加如下配置内容:


#user  nobody;
worker_processes  1;

error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    #gzip  on;
    keepalive_timeout  65;

    # 定义变量,兼容HTTP和WebSocket两种请求协议
    map $http_upgrade $connection_upgrade {
        default          keep-alive;  # 默认 keep-alive,表示HTTP协议。
        'websocket'      upgrade;     # 若是 websocket 请求,则升级协议 upgrade。
    }

    server {
        listen 9990;
		
		# 这里写后端接口服务提供的WebSocket完整地址
		# 例如:我这里提供的WebSocket接口地址是 /demo/websocket
        location /demo/websocket {
            proxy_pass http://127.0.0.1:8880; # 转发到后端接口
    		proxy_read_timeout 20s; # 设置超时时间,默认是60s
            proxy_http_version 1.1;
            proxy_set_header Host $host; # 这个配置不要漏了,必须要
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }
}

注意:上面配置中,有两个内容需要配置,见下图中的红色框框内容:

nginx转发websocket,【中间件笔记】,nginx,websocket,nginx配置ws,转发WebSocket,WebSocket接口转发

1.2、客户端请求地址

浏览器客户端向【ws://127.0.0.1:9990/demo/websocket】建立连接,当Nginx服务器接收到之后,就会匹配上location的定义的规则,此时会将【ws://127.0.0.1:9990/demo/websocket】地址转发到【ws://127.0.0.1:8880/demo/websocket】这个地址,这就完成了WebSocket接口的转发功能。

  • 注意点:location后面定义的地址要和后端接口提供的WebSocket地址一模一样,不能采用模糊匹配,否则转发不了WebSocket接口

刚开始我是参考网上的一些配置,location后面之间使用的【/websocket】,发现怎么也转发不了,后面测试了才知道,网上那些配置,他们对应后端WebSocket接口地址就是【/websocket】,所以他们可以转发成功。我的后端接口地址是【/demo/websocket】,location配置成【/websocket】肯定是不行的。

1.3、创建WebSocket测试工程

为了模拟Nginx能否成功转发WebSocket接口,这里我本地创建了一个WebSocket的测试工程,如下所示:

nginx转发websocket,【中间件笔记】,nginx,websocket,nginx配置ws,转发WebSocket,WebSocket接口转发

1.4、启动测试

  • 第一步:启动本地的WebSocket测试工程。
  • 第二步:启动Nginx服务。
  • 第三步:找一个在线的WebSocket测试工具,查看【ws://127.0.0.1:9990/demo/websocket】是否可以连接成功。

这里我使用的是【https://wstool.js.org/】WebSocket在线测试工具,如下图所示:

nginx转发websocket,【中间件笔记】,nginx,websocket,nginx配置ws,转发WebSocket,WebSocket接口转发

从上图中,我们可以知道,WebSocket接口服务对外提供的是8880端口,客户端连接的是9990端口,端口不一致的情况下,WebSocket依然连接成功了,这说明我们配置的Nginx转发功能成功啦。

1.5、WebSocket超时问题

Nginx配置里面,默认情况下,WebSocket接口的超时时间是60s,如果在60s里面,都没有使用WebSocket进行发送消息,那么此时就会断开WebSocket连接。

这种情况下,我们客户端如果再次发送消息,就会抛出异常,因为WebSocket连接已经断开,无法发送消息,那么要如何解决这个问题呢???

针对上面的问题,可以有下面两种解决方案:

1.5.1、设置超时时间

Nginx提供了一个【proxy_read_timeout】属性,该属性可以用于设置WebSocket接口的超时时间,默认是60s,那么我们就可以设置成5分钟,配置内容如下所示:

# 这里写后端接口服务提供的WebSocket完整地址
# 例如:我这里提供的WebSocket接口地址是 /demo/websocket
location /demo/websocket {
    proxy_pass http://127.0.0.1:8880; # 转发到后端接口
	proxy_read_timeout 300s; # 设置超时时间,默认是60s
    proxy_http_version 1.1;
    proxy_set_header Host $host; # 这个配置不要漏了,必须要
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

注意:这种配置不推荐使用,因为proxy_read_timeout属性治标不治本,超过5分钟还是没有通信怎么办呢???不依然会断开连接吗。

1.5.2、建立心跳机制(推荐)

最好的机制是让客户端和服务器之间,每隔一段时间进行一次心跳通信,例如:让客户端每隔30s向服务器发送一次消息,客户端有发送消息给服务端,那么Nginx就知道当前这个WebSocket连接是有用的,就不会将其断开。

注意:假设超时时间是60s,经过30s没有通信,按理说,再过30s没有通信,就会断开连接,但是如果客户端发送一条消息给服务端,此时,超时时间就会重新计算,超时时间又会变成60s

到此,Nginx服务器转发WebSocket接口就配置完成啦。

综上,这篇文章结束了,主要介绍如何通过Nginx服务器转发客户端的WebSocket接口到后端服务。文章来源地址https://www.toymoban.com/news/detail-847252.html

到了这里,关于【Nginx笔记02】通过Nginx服务器转发客户端的WebSocket接口到后端服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 通过OpenIddict设计一个授权服务器02-创建asp.net项目

    通过OpenIddict设计一个授权服务器02-创建asp.net项目

    在这一部分中,我们将创建一个ASPNET核心项目,作为我们授权服务器的最低设置。我们将使用MVC来提供页面,并将身份验证添加到项目中,包括一个基本的登录表单。 正如前一篇文章中所说,授权服务器只是另一个web应用程序。以下内容将指导您使用用户名密码登录来设置

    2024年01月18日
    浏览(9)
  • 通过 EPOLL 解决客户端同时连接多服务器的问题

    项目需求是  程序上 同时配置了多个服务端 设备 每隔一段时间需要 比如1分钟 连一下服务器看下是否连通   并将结果上报给平台  原来是用线程池来做的   具体大概就是 定时器到了之后  遍历设备列表  找到设备之后  通过 socket连接 发送一个指令 等待服务器返回 用来

    2024年02月13日
    浏览(13)
  • vue项目通过nginx部署到服务器

    vue项目通过nginx部署到服务器

    部署的服务器是阿里云买的,使用finalShell根据账号秘密链接服务器即可 找到/user/local/nginx/conf/下面的nginx.conf文件进行配置,这里单独新建一个finace.conf文件,配置后再导入到nginx.conf文件,便于管理 这个Nginx服务器配置设置了一个监听端口为8081的服务器,服务器名称设置为127.0.0.

    2024年03月11日
    浏览(11)
  • 《Linux高性能服务器编程》笔记02

    《Linux高性能服务器编程》笔记02

    参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数(比如open和read) 那么常用(编写内核模块时一般要实现这些I/O函数),但在特定的条件下却表现出优秀的性 能。本章将讨论

    2024年01月21日
    浏览(16)
  • 通过Kuboard部署Nginx服务并映射挂载NFS服务器

    通过Kuboard部署Nginx服务并映射挂载NFS服务器

    使用Kuboard图形化页面部署Nginx工作负载,代理页面是Vue打包的todos任务记录页面,并且将nginx配置文件挂载到单独一台NFS服务器进行存储。 现场环境使用一个管理节点,两个工作节点,一个NFS存储服务器 k8s部署可以使用 Kuboard-Spray 图形化页面安装,也可以使用 kubeadm 进行安装

    2024年01月16日
    浏览(10)
  • 手机、电脑mqtt客户端通过腾讯云服务器远程连接ESP32

    手机、电脑mqtt客户端通过腾讯云服务器远程连接ESP32

            本文将实现:         1、esp32与腾讯云物联网服务器通过mqtt协议通信         2、电脑和手机客户端通过mqtt与腾讯云相通信         3、腾讯云服务器内部消息转发,将手机、电脑发布的主题转发给esp32订阅,实现手机、电脑与esp32的远程通信。      

    2024年02月11日
    浏览(15)
  • 通过nginx访问服务器指定目录下图片资源

    通过nginx访问服务器指定目录下图片资源

    实现步骤: 1、创建文件夹并且上传图片 2、查看nginx进程 ps -ef | grep nginx    3、修改nginx配置文件 根据步骤2查看nginx安装目录;(通常nginx安装目录为 cd /usr/local/nginx/) 如果自定义的安装目录则根据实际情况而定 进入到nginx安装目录下:  1、cd /usr/local/nginx/ 2、cd conf 3、vim

    2024年02月15日
    浏览(13)
  • [多媒体服务器] 通过nginx搭建 rtmp/hls/dash 媒体服务器,支持点播和直播

    How To Set Up a Video Streaming Server using Nginx-RTMP on Ubuntu 20.04 | DigitalOcean nginx,nginx rtmp插件,OBS,ffmpeg,ubuntu,youtube-dl 安装 nginx 和 rtmp 模块 增加如下内容到nginx配置文件 nginx.conf 说明: listen 1935  means that RTMP will be listening for connections on port 1935, which is standard. chunk_size 4096  means t

    2024年04月25日
    浏览(11)
  • Docker RTMP服务器搭建与视频流推送示例(流媒体服务器tiangolo/nginx-rtmp,推流客户端ffmpeg)

    Docker RTMP服务器搭建与视频流推送示例(流媒体服务器tiangolo/nginx-rtmp,推流客户端ffmpeg)

    在这篇文章中,我将详述如何搭建一个RTMP(Real-Time Messaging Protocol)服务器,并使用ffmpeg技术进行本地视频的推流。最后,我们将使用VLC播放器来播放这个RTMP流。 首先,我们需要搭建一个RTMP服务器。为了方便起见,我们将选择Docker作为服务器的环境。Docker的轻量化和可移植

    2024年01月17日
    浏览(12)
  • C/C++服务器和客户端交互笔记

    C/C++服务器和客户端交互笔记

    Socket通信三要素:通信的目的地址、使用的端口号(http 80 / smtp 25)、使用的传输协议(TCP、UDP)。 nslookup xx 可以查询xx网址的IP地址。 Socket通信模型 telnet ipxx 进行主机间通信。 一个简单的服务器和客户端通信程序,服务器端代码: 客户端代码: socket(套接字)的中文意思

    2024年02月13日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包