资讯专栏INFORMATION COLUMN

WebSocket实时消息推送

coolpail / 3361人阅读

摘要:软件运行原理协议是一种全双工的通讯方式并且支持跨域二消息推送服务器的搭建我们利用的模块来实现消息推送服务。

一、消息推送的实现原理与方式 1.1 实时性较强的场景

在线聊天

监控报警

视频弹幕

1.2 基于HTTP的实时消息方案

AJAX轮询(polling) //客户端不断发送请求到服务器

长轮询(longplling) //一般30s超时

异步streaing

iframe数据量

全双工数据发送和接收可以同时进行

HTTP协议是不具备全双工的。

1.3 软件运行原理

WebSocket协议是一种全双工的通讯方式,并且支持跨域

二、消息推送服务器的搭建

我们利用nginxnginx-push-stream-module模块来实现消息推送服务。

2.1 环境搭建

首先需要下载模块源码,这里在git上直接克隆

git clone http://github.com/wandenberg/nginx-push-stream-module.git

将欲增加的模块路径定义为一个变量(此步骤非必要步骤,且定义的变量只能当前会话可用,只是为了后续操作方便)

NGINX_PUSH_STREAM_MODULE_PATH=$PWD/nginx-push-stream-module

以下是nginx已经安装过的情况下增加模块,因为以前nginx安装在/usr/local/nginx目录下,所以下面的操作都是以此目录为路径进行操作,如果安装到其他目录有些命令需要做对应的更改。

先查看原有nginx的配置参数并拷贝出来备用

/usr/local/nginx/sbin/nginx -V

解压相同版本nginx源码包(以前安装时的源码包),如果已经删除了课重新下载,版本相同即可(这里以1.12.1版本为例)
nginx官网

wget  http://nginx.org/download/nginx-1.12.1.tar.gz

tar zxvf nginx-1.12.2.tar.gz
进入nginx的目录

cd nginx-1.12.1

进行配置(其中***是前面记录的nginx原始的配置,也就是刚才拷贝出来配置,这个务必加上)

./configure --add-module=$NGINX_PUSH_STREAM_MODULE_PATH ***

编译:

make

不要执行make install避免覆盖,备份原来的nginx可执行文件

备份:

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak

将编译好的nginx复制到原始nginxsbin目录

cp objs/nginx /usr/local/nginx/sbin/

到此为止已经安装完毕,可以再执行/usr/local/nginx/sbin/nginx -V查看一下nginx的模块情况。

2.3 nginx配置

安装后需要在nginx的配置文件nginx.conf或者其他包含的配置文件中做如下配置:
1. 在http段加入:

#最大共享内存
push_stream_shared_memory_size                100m;
#频道最大长度
push_stream_max_channel_id_length             200;
#每个频道缓存的最大消息数量
push_stream_max_messages_stored_per_channel   20;
#消息生命周期(分钟)
push_stream_message_ttl                       5m;

2. 添加一个虚拟主机(server)配置如下:

server {
    listen 8080;
    server_name     127.0.0.1;
    location /pub {
        push_stream_publisher admin;
        push_stream_channels_path $arg_id;
        push_stream_store_messages on;
    }
    location ~ /sub/(.*) {
        push_stream_subscriber;
        push_stream_channels_path $1;
        push_stream_last_received_message_time      "$arg_time";
        push_stream_last_received_message_tag       "$arg_tag";
        push_stream_header_template "






";
            push_stream_message_template "";
        push_stream_footer_template "";
        default_type "text/html; charset=utf-8";
        push_stream_ping_message_interval 10s;
    }
    location ~ /ev/(.*) {
        push_stream_subscriber eventsource;
        push_stream_channels_path $1;
        push_stream_last_received_message_time      "$arg_time";
        push_stream_last_received_message_tag       "$arg_tag";
        push_stream_message_template "{"id":~id~,"channel":"~channel~","text":"~text~","tag":"~tag~","time":"~time~"}";
        push_stream_ping_message_interval 10s;
    }
    location ~ /ws/(.*) {
        push_stream_subscriber websocket;
        push_stream_channels_path $1;
        push_stream_last_received_message_time      "$arg_time";
        push_stream_last_received_message_tag       "$arg_tag";
        push_stream_message_template "{"id":~id~,"channel":"~channel~","text":"~text~","tag":"~tag~","time":"~time~"}";
        push_stream_ping_message_interval 10s;
    }
    location ~ /lp/(.*) {
        push_stream_subscriber long-polling;
        push_stream_channels_path $1;
        push_stream_last_received_message_time      "$arg_time";
        push_stream_last_received_message_tag       "$arg_tag";
        push_stream_message_template "{"id":~id~,"channel":"~channel~","text":"~text~","tag":"~tag~","time":"~time~"}";
        push_stream_longpolling_connection_ttl 30s;
    }

  }

3. 然后重新载入nginx的配置

检查配置文件是否有语法错误:

/usr/local/nginx/sbin/nginx -t

出现以下提示表示正确:

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

重新载入:

/usr/local/nginx/sbin/nginx -s reload 或 nginx -s reload 

查看端口:netstat -tnl

2.3 测试订阅/发布

Linux命令下使用curl做如下测试(其中ch1代表频道)

#发布信息:
curl http://localhost:8080/pub?id=ch1 -d "发布消息测试"
#订阅信息:
curl http://localhost:8080/lp/ch1

参考学习视频:消息推送服务器构建实时聊天室视频教程

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39804.html

相关文章

  • Web 实时推送技术的总结

    摘要:本文对过去和现在流行的实时推送技术进行了比较与总结。以上我们介绍了三种实时推送技术,然而各自的缺点很明显,使用起来并不理想,接下来我们着重介绍另一种技术它是比较理想的双向通信技术。 前言 随着 Web 的发展,用户对于 Web 的实时推送要求也越来越高 ,比如,工业运行监控、Web 在线通讯、即时报价系统、在线游戏等,都需要将后台发生的变化主动地、实时地传送到浏览器端,而不需要用户手动...

    Rocture 评论0 收藏0
  • WebSocket 前后端实时消息推送

    摘要:要做一个通信监测方面的事情,需要实时进行前后端的的消息推送,这里不分析轮询和的区别,网上讲的挺多的,下图是两者的通信示意图,这里只写怎么用。 要做一个通信监测方面的事情,需要实时进行前后端的的消息推送,这里不分析Ajax轮询和WebSocket的区别,网上讲的挺多的,下图是两者的通信示意图,这里只写怎么用。showImg(https://segmentfault.com/img/rem...

    lindroid 评论0 收藏0
  • WebSocket 前后端实时消息推送

    摘要:要做一个通信监测方面的事情,需要实时进行前后端的的消息推送,这里不分析轮询和的区别,网上讲的挺多的,下图是两者的通信示意图,这里只写怎么用。 要做一个通信监测方面的事情,需要实时进行前后端的的消息推送,这里不分析Ajax轮询和WebSocket的区别,网上讲的挺多的,下图是两者的通信示意图,这里只写怎么用。showImg(https://segmentfault.com/img/rem...

    khs1994 评论0 收藏0
  • 利用 socket.io 实现消息实时推送

    摘要:为了达到这种双向的实时消息传递,很明显地考虑用来实现。注意这个文件并不能用在实际的项目中,只是用来显示消息推送的效果而已。参考资料本文在我博客上的原地址利用实现消息实时推送 项目背景介绍 最近在写的项目中存在着社交模块,需要实现这样的一个功能:当发生了用户被点赞、评论、关注等操作时,需要由服务器向用户实时地推送一条消息。最终完成的项目地址为:socket-message-push,这里...

    RobinQu 评论0 收藏0
  • 基于node+socket.io+redis的多房间多进程聊天室

    摘要:并且指定收到消息,以及端口的监听方法。四代码示例多房间实时聊天室配置版本须在里配置定义,并设置。使同一个的请求能够落在同一个机器同一个进程中。通过主进程统一管理维护子进程,每个进程监听一个端口。 showImg(http://7tszky.com1.z0.glb.clouddn.com/FkhApdRySR927nkdDZuUPBQbJtXG); 一、相关技术介绍: 消息实时推送,指的...

    Guakin_Huang 评论0 收藏0

发表评论

0条评论

coolpail

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<