nginx_http_push_module模块使用详解

关于

nginx_http_push_module模块致力成为一个成熟的http推送和comet服务,它能够处理好全部链接,并且仅通过http请求,可以完成广播消息到所有客户端,这让你写异步web应用程序时得心应手,并且在代码中完全不必理会延时请求。该模块完整的实现了Basic
HTTP Push Relay Protocol

为什么选择此模块

当你要写一个实时更新的模块时,例如某些聊天室、多人在线flash游戏等。无论哪种方式,我们都要避免更新请求时刷新页面或者每隔几秒轮训服务器,这样的代码丑陋无比(也许是我翻译错误)。

如何使用 

你可以下载模块代码、安装模块、编写nginx的conf文件,通过几行的javascript,你就可以实现一个用户客户端。只需要通过http请求,你也可以发送实时消息给长轮训用户。

下载:

http://pushmodule.slact.net/downloads/nginx_http_push_module-0.692.tar.gz

如果需要跟更新版本,或者链接不可用,可访问官方地址http://pushmodule.slact.net

安装(包括安装了一些其它模块并不是必须的):

./configure --prefix=/usr/local/nginx     \

--with-debug                            \

--with-http_stub_status_module          \

--with-http_ssl_module                  \

--with-http_realip_module               \

--with-http_image_filter_module         \

--with-pcre=../pcre-8.21                \

--add-module=../ngx_devel_kit-0.2.19    \

--add-module=../lua-nginx-module-0.9.8  \

--add-module=../echo-nginx-module       \

--add-module=../redis2-nginx-module     \

--add-module=../set-misc-nginx-module   \

--add-module=../nginx_http_push_module-0.692

make

make install

我使用的nginx版本为nginx-1.7.2,官方要求最低版本为0.7,0.6和0.5版本都不支持。

编写简单nginx配置文件查看模块如何使用:

1.打开nginx配置文件,写入如下代码:

...

location /pub {
    set $push_channel_id $arg_id;
    push_publisher;
    push_store_messages on;
    push_message_timeout 2h;
    push_max_message_buffer_length 10;
}
location /sub {
    push_subscriber;
    set $push_channel_id $arg_id;
    push_subscriber_concurrency broadcast;
    default_type text/plain;
}  

...

2.重启nginx

./nginx –s stop

./nginx

3.消息订阅

#curl --get http://172.16.18.114/sub?id=jfy

参数id=jfy即为push_channel_id

测试可以看到处于等待状态。

4.消息发布

#curl -d "nginx_http_push_module" http://172.16.18.114/pub?id=jfy

这里的id=jfy,与上面sub的相同

发布后,上面的sub会返回消息

配置信息详解

变量:

$push_channel_id

作为唯一标识,区别通信通道,要通信的pub和sub这个值必须相同。

例如:

set $push_channel_id $arg_id;

#channel id 就是当前url上的字符串变量"id"

#(/pub?id=channel_id_string)

指令:

Publisher / Subscriber

push_subscriber[ long-poll | interval-poll ]

默认值:long-poll

位置:server,location

定义一个server或者location作为subscriber,这个代表一个sub与信息管道进行通信,通过请求头headers中设置If-Modified-Since和If-None-Match自动遍历列表,处理队列中保留时间最长的消息或是即将到来的新消息。具体可以参考protocol
documentation

当有sub请求数据并且数据未到达时,sub端长轮训请求。如果是interval-poll方式,则会返回304码,返回最近接受的数据。

If-None-Match和If-Modified-Since说明:

pub消息时,消息会带一个唯一的时间戳message_time,如果同一时间内同时pub多条信息,则会启用消息的message_tag属性值从0开始递增,否则message_tag=0;

sub消息后队列中的数据并不删除

sub消息返回的结果中,http header中有:

Last-Modified: Thu, 21 Aug 2014 05:44:47 GMT    即为message_time

Etag: 0                                         即为message_tag

sub会从http的headers中取If-None-Match作为上次获取到的消息的tag, If-Modified-Since作为上次获取到的消息的time

sub从后往前遍历队列,先比较这条消息的message_time与header中的time,如果这两个相同则再比较tag,来决定获取现有的哪一条消息或是等待将来的消息

如果sub的header中没有If-None-Match和If-Modified-Since,则当0处理,那就是将永远一直获取最旧的一条消息

正确的用法是:

当次sub请求中headers,If-None-Match赋值为上次sub返回headers中的Etag值

当次sub请求中headers,If-Modified-Since赋值为上次sub返回headers中的Last-Modified值

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;

当使用off时,pub消息时若没有sub则消息会被丢弃

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长度,长的部分将会被截断

push_max_channel_subscribers[number ]

默认值:0(unlimited)

使用环境:main,server,location

最大并发subscriber数,你懂得!!!!

nginx_http_push_module模块使用详解

时间: 2024-10-10 17:09:18

nginx_http_push_module模块使用详解的相关文章

opencart 模块开发详解

opencart 模块开发详解 由 xiekanxiyang » 2013年 7月 11日 10:17 pm opencart 将页面分成若干模块, 每个模块可以有多个实例(可能这样说不是很恰当) 每个实例可以指定它出现在哪个页面 这样更好的实现了代码的可重用性,可以达到更好的页面布局的可调节性. Opencar内置了几个模块,但实际应用中我们经常要根据需要开发自己模块,现在我给大家介绍下opencart的模块开发的细节 开发步骤:首先:模块代码也分前台,后台. 后台功能是模块的安装,编辑,模块

python之模块datetime详解

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块datetime详解 import datetime #data=datetime.date(2015,11,9)#表示日期的类 #data=datetime.time(hour[,minute[,second[,microsecond[,tzinfo]]]])#表示时间的类,从小时时间开始为参数 #data=datetime.datetime(year,month,day[,hour[

python os.path模块常用方法详解

python os.path模块常用方法详解 1.   os.path.abspath(path)   返回path规范化的绝对路径. >>> import os    >>> os.path.abspath('pjc.txt')     '/home/pjc/pjc.txt' >>> os.path.abspath('c:\\test.csv')         #Windows主机指定完美的路径    'c:\\test.csv' 2.os.pat

Spring Boot的每个模块包详解

Spring Boot的每个模块包详解,具体如下: 1.spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2.spring-boot-starter-actuator 帮助监控和管理应用. 3.spring-boot-starter-amqp 通过spring-rabbit来支持AMQP协议(Advanced Message Queuing Protocol). 4.spring-boot-starter-aop 支持面向方面的编程

Python中标准模块importlib详解

Python中标准模块importlib详解 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外,importlib允许程序员创建他们自定义的对象,可用于引入过程(也称为importer). 什么是imp? 另外有一个叫做imp的模块,它提供给Python import语句机制的接口.这个模块在Python 3.4中被否决,目的就是为了只使用importlib. 这个模块有些复杂,因此我们在这

关于Saltstack核心模块state详解

一.问题背景:  学习使用自动运维工具saltstack的过程中,其中state模块是帮助管理员控制minion达到一个预想的状态.换句话来说,我想让minion能够远程执行命令,自动配置环境文件,软件安装.服务启动.关闭,信息收集等自动化操作,都能通过saltstack的state模块实现.  并且最重要的一个好处就是简单.简洁.方便.引用一段官方文档的话: Simplicity, Simplicity, SimplicityMany of the most powerful and usef

python——pickle模块的详解

pickle模块详解 该pickle模块实现了用于序列化和反序列化Python对象结构的二进制协议. “Pickling”是将Python对象层次结构转换为字节流的过程, “unpickling”是反向操作,从而将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构.pickle模块对于错误或恶意构造的数据是不安全的. pickle协议和JSON(JavaScript Object Notation)的区别 : 1. JSON是一种文本序列化格式(它输出unicode文本,虽然大部分时间它

Python之正则re模块 --- findall()详解

1. findall() 函数的2种表示形式 1 import re 2 kk = re.compile(r'\d+') 3 kk.findall('one1two2three3four4') 4 #[1,2,3,4] 5 6 #注意此处findall()的用法,可传两个参数; 7 kk = re.compile(r'\d+') 8 re.findall(kk,"one123") 9 #[1,2,3] 2. 正则表达式可能遇到的坑  --- 正则表达式中的括号() 1. 当正则表达式中

LCD1602液晶显示模块深入详解之软件篇(AVR)

LCD1602液晶显示模块的驱动虽然比七段数码管之类的显示要复杂一些,但实际上也并不是很难,最主要的还是初始化,为什么这么说呢?我们在调试一块新液晶屏的时候,都会先初始化看看有没有光标在闪,没有光标前是一番努力(PROTEUS上也是这么做的),光标出来之后就相对很容易了. 那初始化的流程是怎么样的呢?我们还是看看HD44780的数据手册吧,如下图所示: 可以看到,初始化的主要步骤如下: (1)上电:这特么也算是一个步骤么?是的!如果你用的是其它液晶模块,比如LCD12864,会发现有一个复位引脚