利用nginx_push_stream_module实现服务器消息推送
NGiNX_HTTP_Push_Module 是一个 Nginx 的扩展模块,它实现了 HTTP Push 和Comet server的功能。HTTP Push 被经常用在网页上主动推的技术,例如一些聊天室啊,更新信息非常频繁的应用场合。
Http Server Push是一种推送技术,服务器主动向浏览器发送数据。
可以参考:http://wiki.nginx.org/HttpPushStreamModule
1. 下载安装
1) 下载源代码包
Nginx:http://nginx.org/
Nginx Http Push Module:http://pushmodule.slact.net/(网站打不开)csdn上有一份http://download.csdn.net/download/javadxz/10046650。
2) 解压缩
tar zxvf nginx-1.12.2.tar.gz
tar zxvf nginx_http_push_module-0.692.tar.gz
3) 编译安装
进入nginx根目录
编译Nginx,configure指定待添加模块的路径
./configure --add-module=/home/nginx/nginx_http_push_module-0.692
make && make install
错误提示:
./configure: error: the HTTP rewrite module requires the PCRE library. 安装pcre-devel与openssl-devel解决问题
yum install gcc gcc-c++ openssl_devel -y
yum -y install pcre-devel openssl openssl-devel
./configure --prefix=/usr/local/nginx
2. 配置
关于推送配置说明,可参考推送模块源码包内的README,
推送协议可参考protocol.txt,或访问http://pushmodule.slact.net/protocol.html,
在Nginx配置文件中添加一个基本的推送配置,
可参考自带的用于测试的配置文件nginx_http_push_module-0.692/tests/nginx.conf,将其中配置部分附加到Nginx配置文件的http结构中(安装后nginx启动默认读取的文件是/usr/local/nginx/conf/nginx.conf)
location /chat {
push_channel_group pushmodule_chat;
location /chat/pub {
set $push_channel_id $arg_id; #多个聊天室就相当于 ?id=markdream
push_publisher;
push_message_timeout 5m;
push_message_buffer_length 10;
}
location /chat/sub {
set $push_channel_id $arg_id; #多个聊天室就相当于 ?id=markdream
push_subscriber;
send_timeout 3600;
}
}

3. 调试
启动
./nginx
./nginx -s reload
./nginx -s stop
启动Nginx,使用curl进行推送测试
1) subscriber请求数据:
curl -X GET localhost:8082/chat/sub?id=1
向channel1请求数据,当前channel无数据,等待数据生成
2) publisher推送数据:
curl -X POST -d "china 2017-10-31" http://localhost:8082/chat/pub?id=1
向channel1推送数据,subscriber收到数据并返回


4. 总结
Http服务器需要使用一个或一组url指定发布服务和订阅服务(publisher and subscriber locations,我翻译的不太合理)。
所有发送到发布服务的请求被视为发布请求,所有发送到订阅服务的请求被视为订阅请求。
通道(channel)需要使用唯一id进行标识,推荐使用url指定具体通道,如 localhost:8082/sub?id=1。
发布请求(publisher request)通过POST向服务器传输数据,并通知其向某些通道某些用户发送数据,
订阅请求(subscriber request)通过GET向服务器请求数据,通知其该用户想要接收数据。
配置信息详解
变量:
$push_channel_id
作为唯一标识,区别通信通道,要通信的pub和sub这个值必须相同。
例如:
set $push_channel_id $arg_id;#channel id 就是当前url上的字符串变量"id"#(/foo/bar?id=channel_id_string)
指令:
Publisher/Subscriber
push_subscriber[ long-poll | interval-poll ]
默认值:long-poll
位置:server,location
定义一个server或者location作为subscriber,这个代表一个sub与信息管道进行通信,通过entity-caching请求头(If-Modified-Since and If-None-Match)自动遍历列表,处理队列中保留时间最长的信息。
当有sub请求数据并且数据未到达时,sub端长轮训请求。如果是interval-poll方式,则会返回304码,返回最近接受的数据。

push_subscriber_concurrency[ last | first | broadcast ]
默认值:broadcast
使用环境:http,server,location
多用户请求时的控制处理,工作方式:
broadcast:广播形式接受,所有当前连接的用户请求被保存;
last:最近的用户请求被保存,其他用户全部409冲突;
first:最开始的用户请求被保存,其他全部409冲突;
push_publisher
默认值:none
使用环境:server,location
定义一个server或者location作为publisher,发给publisher的http请求被视为发送给subscribers的数据。
信息存储:
push_store_messages[ on | off ]
默认值:on
使用环境:http,server,location
当使用off时,仅表示push_message_buffer_length 0;
push_max_reserved_memory[ size ]
默认值:16M
使用环境:http
这个模块的内存块大小将会用于信息队列和信息缓存。
push_min_message_buffer_length[number ]
默认值:1
使用环境:http,server,location
每个channel的最小信息存储。
push_max_message_buffer_length[number ]
默认值:10
使用环境:http,server,location
每个channel的最大信息存储数。
push_message_buffer_length[ on |off ]
默认值:off
使用环境:http,server,location
每个channel存储的确切信息数
push_delete_oldest_received_message[off ]
默认值:0
使用环境:http,server,location
当启动时,一旦channel中最老的数据被用户接受后,它将被删除。所有超过push_max_message_buffer_length的信息将会在channel的信息缓存中。原作者建议避免使用改指令,因为它违背了用户get请求的幂等原则。
push_message_timeout[ time ]
默认值:1h
使用环境:http,server,location
作为消息在对立当中的过期时间,如果你不希望消息有过期时间,可以设置为0.
安全
push_authorized_channels_only[ on| off ]
默认值:off
使用环境:http,server,location
subscriber是否可以通过请求来创建一个channel。如果设置on,publisher必须在subscriber请求数据前,发送一个post或者put请求。否则所有的subscriber请求不存在的channels时,将会得到403码。
push_channel_group[ string ]
默认值:none
使用环境:server,location
作为一种约束,适用于发给指定channel,而其他channel将永远不会收到。就好像是channel id的前缀字符串。
push_max_channel_id_length[ number]
默认值:512
使用环境:main,server,location
设置最大的channel id长度,长的部分将会被截断,例如:
1.设置conf:
push_max_channel_id_length5;
2.输入连接:
http://192.168.0.237:2033/activity?id=lengzijian
3.更改perl脚本

4.查看页面

push_max_channel_subscribers[number ]
默认值:0(unlimited)
使用环境:main,server,location
最大并发subscriber数,你懂得!!!!
总结
最后附上用nginx_http_push_module实现的官方的聊天室:
聊天室下载地址:http://www.2zct.com/nginx/chat.zip
nginx配置信息下载地址:http://www.2zct.com/nginx/nginx_conf.zip

稍微做了改动,js+nginx实现,如果有任何问题,可以留言解答。
利用nginx_push_stream_module实现服务器消息推送的更多相关文章
- HTML5服务器消息推送(java版)
前端代码(html5.html): <html> <meta http-equiv="Content-Type" content="text/html; ...
- SignalR SelfHost实时消息,集成到web中,实现服务器消息推送
先前用过两次SignalR,但是中途有段时间没弄了,今天重新弄,发现已经忘得差不多了,做个笔记! 首先创建一个控制台项目Nuget添加引用联机搜索:Microsoft.AspNet.SignalR.S ...
- springboot实现服务器端消息推送(websocket + sockjs + stomp)
服务器端推送技术在web开发中比较常用,可能早期很多人的解决方案是采用ajax向服务器轮询消息,这种方式的轮询频率不好控制,所以大大增加了服务器的压力,后来有了下面的方案:当客户端向服务器发送请求时, ...
- web消息推送的各种解决办法
摘要 在各种BS架构的应用程序中,往往都希望服务端能够主动地向客户端推送各种消息,以达到类似于邮件.消息.待办事项等通知. 往BS架构本身存在的问题就是,服务器一直采用的是一问一答的机制.这就意味着如 ...
- Java Socket聊天室编程(一)之利用socket实现聊天之消息推送
这篇文章主要介绍了Java Socket聊天室编程(一)之利用socket实现聊天之消息推送的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 网上已经有很多利用socket实现聊天的例子了 ...
- javascript跨域传递消息 / 服务器实时推送总结
参考文档,下面有转载[非常好的两篇文章]: http://www.cnblogs.com/loveis715/p/4592246.html [跨源的各种方法总结] http://kb.cnblogs. ...
- 利用Kafka的Assign模式实现超大群组(10万+)消息推送
引言 IM即时通信场景下,最重要的一个能力就是推送:在线的直接通过长连接网关服务转发,离线的通过APNS或者极光等系统进行推送. 本文主要是针对在线用户推送场景来进行总结和探讨:如何利用Kafka ...
- 基于XMPP协议(openfire服务器)的消息推送实现
转自:http://blog.csdn.net/nomousewch/article/details/8088277 最近好像有不少朋友关注Android客户端消息推送的实现,我在之前的项目中用到过J ...
- 用 centrifugo 搭建 消息推送服务器 docker + rancher 搭建
关于消息推送服务器 目前有很多第三方的开放成熟的推送服务.鉴于项目需要 我们项目需要自己搭建 自己的推送服务. 我们的推送应用场景 聊天消息 项目内部消息提醒 移动设备接受消息 应用到的相关软件工具知 ...
随机推荐
- 网络编程的基本概念,TCP/IP协议简介
8.1.1 网络基础知识 计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议. 网络编程的目的就是指直接或 ...
- mysql报错注入手工方法
以前觉得报错注入有那么一长串,还有各种concat(),rand()之类的函数,不方便记忆和使用,一直没怎么仔细的学习过.这次专门学习了一下,看了一些大牛的总结,得到一些经验,特此记录下来,以备后续巩 ...
- Shell 命令行获取本机IP,grep的练习
Shell 命令行获取本机IP,grep的练习 在 mac 下面输入 ifconfig 或者在 linux 下面输入 ip a 就可以得到我们的网卡信息.不过通常情况下,我们需要查看的是我们的IP地址 ...
- python常用模块之json、pickle模块
python常用模块之json.pickle模块 什么是序列化? 序列化就是把内存里的数据类型转换成字符,以便其能存储到硬盘或者通过网络进行传输,因为硬盘或网络传输时只接受bytes. 为什么要序列化 ...
- python爬虫入门(2)re模块-正则表达式
正则表达式 search //匹配第一次遇到符合规则的 匹配IP地址 import re re.search(r'(([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])\.){3 ...
- threeJs中旋转位移等操作坐标系
1.场景中的立方体.圆柱等三维模型的位置属性.平移方法参照Scene对象的世界坐标系 2.场景中立方体.圆柱等的三维模型的角度属性.旋转方法参照模型自身的模型坐标系
- eclipse如何通过git把项目上传到码云上
转载:原文链接:https://www.cnblogs.com/yixtx/p/8310311.html 1.eclipse安装git插件 具体我也做过,因为我下载的eclipse版本以及由git插件 ...
- 监听器(Listener)学习(一)
一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通 ...
- WPF 程序无法触摸操作?我们一起来找原因和解决方法!
WPF 自诞生以来就带着微软先生的傲慢.微软说 WPF 支持触摸,于是 WPF 就真的支持触摸了.对,我说的是"支持触摸",那种摸上去能点能动的:偶尔还能带点儿多指的炫酷效果.但是 ...
- jQuery AJAX 跨域请求
跨域请求 只要 dataType : 'jsonp', jsonp:"jsoncallback", 然后返回一个json格式的就可以了 <!doctype html> ...