基于nginx_http_push_module模块让nginx变成Comet Server

基于http协议搭建各种服务已经成为一种大势,但是基于http协议的客户端和服务器端的交互却是个难题,没办法http协议天生如此,其是无状态的协议,每次交互建立链接,结束断开.

客户端和服务器交互很简单,请求描述功能接口的url即可,带上参数.可是服务器要和客户端交互,那就有些困难.下面是几种方法.

1.客户端轮询,最差的一种,客服端和服务器端都在白忙活,浪费资源.

2.long-polling,长轮询,客户端和服务器端保持一个链接,客户端主动发起一个链接,没有如果服务器端没有数据发送給客户端,链接保持,直到服务器有数据发送給客户端,客户端接收数据,断开链接.客户端再链接服务器,进入下一个周期.这就是服务器push.

nginx是一款优秀的web服务器和反响代理服务器,其在同时并发连接方面性能优异,那么其作为hold住大量客服端服务器再合适不过.

nginx_http_push_module(NHPM)模块可以将你的nginx打造成一个Comet Server.

NHPM提供两个antor,一个是publisher,消息发布者,一个是subscriber,客户端,联系他们的关系是channel,频道.

这是一个大致的简图.

安装NHPM,在编译nginx是使用add-module将下载的模块添加进来,官网为https://pushmodule.slact.net.

这是我的编译参数:

./configure --with-http_gzip_static_module --with-http_ssl_module --with-http_stub_status_module --with-http_gunzip_module --with-http_realip_module --add-module=/home/zhou/software/nginx-1.7.6/module/nginx_http_push_module-0.73

编译的过程中可以会报错,是编译的报警参数严格就会当成错误,主要是一个变量没有初始化.将ngx_http_push_module.c的673行的buf_use_count赋值为NULL就可以了.然后make && sudo make install,默认安装到/usr/local/nginx.

安装成功之后,我们就需要配置我们的NHPM.阅读模块的README文件,其有关于配置参数的详细的说明,protocl.txt有详细的关于其实现的long-polling的说明.test目录提供了相关的配置例子.

下面是我的配置:

在server 80下配置了两个location

location /pub {

set $push_channel_id $arg_id;

push_publisher;#角色 

push_store_messages on; #打开消息队列

push_max_message_buffer_length 20;#长度

push_message_timeout 2h;#过期时长

}

location /sub {

push_subscriber;#角色

push_subscriber_concurrency broadcast;#广播的形式

set $push_channel_id $arg_id;

default_type  text/plain;

}

写了个python,脚本最为客户端,写了个页面作为消息发布

import httplib

def subscriber(**opts):
        while True:
                con = httplib.HTTPConnection("localhost")
                con.request('GET', '/sub?id=' + opts['channel'], headers = opts['head'])
                re = con.getresponse();
                print re.read()
      print re.getheader('Last-Modified')    
                opts['head']['If-Modified-Since'] = re.getheader('Last-Modified')

subscriber(channel = 'miss', head = {'If-Modified-Since':''})

接收到一条消息后,重新建立连接是将得到的回复中的

LAST_MODIFIED值传给发送头中的<pre><code class="language-ruby" data-lang="ruby"><span class="s1">If-Modified-Since'</span></code>

其是根据这个来判断消息新旧的时序.现在运行这个脚本其会报No channel id provided,我们的channel是miss,这是因为我们没有向这个频道push,其在第一次push会创建.push的页面

<form action="http://localhost/pub?id=miss" method="post">
Message:
<input name="a" type="text"/>
<input name="" type="submit" value="Push" />
</form>

很简单.我们要firefox打开它

然后按下push,提交,得到如下的返回

说明miss channel创建成功,现在没有一个subscriber,现在运行python脚本

其答应了一条消息,然后就阻塞等待回复,这是我们在push一条数据.

其又接收一条然后阻塞等待,这样实现了服务器发送数据給客户端.基于这个我们可以搭建如下简单的一个控制系统.

NHPM负责控制消息的发布,Logic server完成相应的业务功能.

时间: 2024-11-09 00:10:47

基于nginx_http_push_module模块让nginx变成Comet Server的相关文章

nginx_http_push_module模块使用详解

关于 nginx_http_push_module模块致力成为一个成熟的http推送和comet服务,它能够处理好全部链接,并且仅通过http请求,可以完成广播消息到所有客户端,这让你写异步web应用程序时得心应手,并且在代码中完全不必理会延时请求.该模块完整的实现了Basic HTTP Push Relay Protocol 为什么选择此模块 当你要写一个实时更新的模块时,例如某些聊天室.多人在线flash游戏等.无论哪种方式,我们都要避免更新请求时刷新页面或者每隔几秒轮训服务器,这样的代码丑

基于Centos7.2的nginx部署

基于Centos7.2的nginx部署 部署背景:使用Nginx作为Tomcat的负载平衡器. 部署步骤: 安装zlib-devel.pcre-devel等依赖包 [[email protected] ~]#  yum install -y gcc gcc-c++ make libtool zlib zlib-devel pcre pcre-devel openssl openssl-devel 注:结合proxy和upstream模块实现后端web负载均衡 结合nginx默认自带的ngx_ht

nginx学习笔记之二:nginx作为web server

一.nginx的配置文件:nginx.conf 1.nginx配置文件的结构: main(全局配置段) events {...} http { ... server { location ... {...} location ... {...} ... } server { ... } } 2.配置参数需要以分号结尾,语法格式: 参数名  值1 [值2 ...]; 3.配置文件中还可使用变量: 模块内置变量 用户自定义变量:set var_name value 4.配置文件检查:nginx -t

apache基于mod_jk模块实现代理及负载均衡Tomcat Cluster

一.基于mod_jk模块实现apache代理tomcat 上篇博文已经学习了nginx代理和负载均衡tomcat及apache基于mod_proxy模块代理tomcat; 现在来学习下apache基于mod_jk模块实现代理及负载均衡Tomcat Cluster 1.基于httpd代理tomcat时可以使用httpd的两个模块 1)mod_jk:第三方模块 mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议

基于Nginx-rtmp模块的视频点播

开发环境 centos7.5 nginx-1.8.1 nginx-rtmp-module 安装步骤 一.安装环境依赖 yum -y install pcre-devel.x86_64 yum -y install openssl-devel.x86_64 二.解压 下载完成后,将nginx-1.8.1.tar.gz和nginx-rtmp-module处于同一目录下,再解压nginx-1.8.1.tar.gz tar -xzvf nginx-1.8.1.tar.gz cd nginx-1.8.1

NGINX 加载动态模块(NGINX 1.9.11开始增加加载动态模块支持)

NGINX 1.9.11开始增加加载动态模块支持,从此不再需要替换nginx文件即可增加第三方扩展.目前官方只有几个模块支持动态加载,第三方模块需要升级支持才可编译成模块. [email protected]:~/nginx-1.12.0$ ./configure --help | grep dynamic --with-http_xslt_module=dynamic enable dynamic ngx_http_xslt_module --with-http_image_filter_mo

PHP基于HTTPD模块的方式跟MYSQL连接

实验环境: 1.VMware 2.两台linux子机 3.桥接,本机当客户机 实验目的: 1.编译HTTPD和编译PHP.编译MYSQL,熟悉编译过程和原理 2.HTTPD和PHP在同一台服务器上,PHP作为HTTPD的模块来与MYSQL建立连接 实验拓扑: 二进制格式安装mysql 1.安装包组和依赖所用到的包 #yum install pcre-devel #yum groupinstall 'development tools' #yum groupinstall 'desktop pla

zabbix 通过status模块监控nginx

1.编辑nginx的配置文件,在server下添加如下内容: location /status {stub_status on;access_log off;allow 127.0.0.1;deny all;} 保存退出并重启nginx 2.创建监控nginx的脚本目录 mkdir /usr/local/zabbix/libexec 3.vim /usr/local/zabbix/libexec/nginx.sh && chmod +x /usr/local/zabbix/libexec/

Setup a private http/nginx based GIT server

原文:http://aaba.me/blog/2014/03/setup-a-private-http-nginx-based-git-server.html https://doomzhou.github.io/git/linux/2016/03/30/git-over-http-by-nginx.html 参考:http://beginor.github.io/2016/03/12/http-git-server-on-nginx.html ? Downgrade Lightroom 5 c