`
tcspecial
  • 浏览: 914366 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

nginx 扩展模块开发

    博客分类:
  • web
阅读更多

apache的插件以动态库方式存在,通过配置动态加载;nginx插件则需要编译至nginx可执行程序中,openresty也是如此,直接将lua解释器嵌入至nginx,使其具备解析lua脚本能力。nginx 内置插件目录在 src/http/modules 下。

编写nginx插件过程比较麻复杂,需要对nginx源码及数据结构有一定的了解。nginx实现了字符串,定时器,容器(HashTable,Queue,红黑树),内存池,日志,网络处理,线程等常用函数,学习价值非常高。

本文是来自淘宝Tengine文档,根据自己理解做了一些注释。

 

 一. hello world模块

#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>


// hello 配置结构
typedef struct 
{
	ngx_int_t hello_counter;	// 计数配置
} ngx_http_hello_loc_conf_t;


// 上下文回调函数
static ngx_int_t ngx_http_hello_init( ngx_conf_t *cf );
static void *ngx_http_hello_create_loc_conf( ngx_conf_t *cf );

// 配置处理函数
static char *ngx_hello_set( ngx_conf_t *, ngx_command_t *, void * );
// 回调函数
static ngx_int_t ngx_http_hello_handler( ngx_http_request_t * );


// 配置项
static ngx_command_t ngx_http_hello_commands[] = {
	{
		ngx_string("hello_counter"),		// 配置名称hello_counter
		NGX_HTTP_LOC_CONF | NGX_CONF_FLAG,	// 配置为bool类型,取值为on/off
		ngx_hello_set,						// 配置处理函数
		NGX_HTTP_LOC_CONF_OFFSET,
		0,
		NULL
	},
	ngx_null_command	// 以null结尾 
};

// 模块上下文
static ngx_http_module_t ngx_hello_ctx = {
	NULL, 
	ngx_http_hello_init, 				// 读取该模块配置后调用 
	NULL, 
	NULL, 
	NULL, 
	NULL, 
	ngx_http_hello_create_loc_conf,		// 读取到location配置后调用(每个location创建一个)
	NULL
};

// 模块定义
ngx_module_t ngx_http_hello_module = {
	NGX_MODULE_V1,
	&ngx_hello_ctx,
	ngx_http_hello_commands,
	NGX_HTTP_MODULE,
	NULL, NULL, NULL, NULL, NULL, NULL, NULL,
	NGX_MODULE_V1_PADDING
};



static char *ngx_hello_set( ngx_conf_t *cf, ngx_command_t *cmd, void *conf ) {
	ngx_http_hello_loc_conf_t *local_conf;
	local_conf = conf;
	char *rv = NULL;

	// 读取NGX_CONF_FLAG类型参数
	rv = ngx_conf_set_flag_slot(cf, cmd, conf);

	ngx_conf_log_error( NGX_LOG_INFO, cf, 0, "hello_counter:%d", local_conf->hello_counter );
	return rv;
}


static void *ngx_http_hello_create_loc_conf(ngx_conf_t *cf)
{
	ngx_http_hello_loc_conf_t* local_conf = NULL;
	local_conf = ngx_pcalloc( cf->pool, sizeof(ngx_http_hello_loc_conf_t) );
	if ( local_conf == NULL )
	{
		return NULL;
	}

	// 初始设置默认值
	local_conf->hello_counter = NGX_CONF_UNSET;
	return local_conf;
}

static ngx_int_t ngx_http_hello_init(ngx_conf_t *cf)
{
	ngx_http_handler_pt *h;
	ngx_http_core_main_conf_t *cmcf;

	cmcf = ngx_http_conf_get_module_main_conf( cf, ngx_http_core_module );

	h = ngx_array_push( &cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers );
	if (h == NULL) {
		return NGX_ERROR;
	}

	// 在 NGX_HTTP_CONTENT_PHASE 阶段设置回调函数
	*h = ngx_http_hello_handler;
	return NGX_OK;
}


static int ngx_hello_visited_times = 0;	// 访问次数

static ngx_int_t ngx_http_hello_handler( ngx_http_request_t *r ) {
	ngx_int_t rc;
	ngx_buf_t *b;
	ngx_chain_t out;
	ngx_http_hello_loc_conf_t *my_conf;
	ngx_uint_t content_length = 0;
	u_char ngx_hello_string[1024] = {0};
	
	ngx_log_error( NGX_LOG_EMERG, r->connection->log, 0, "ngx_http_hello_handler is called!" );
	
	// 获取配置值 
	my_conf = ngx_http_get_module_loc_conf( r, ngx_http_hello_module );
	if ( my_conf->hello_counter == NGX_CONF_UNSET || my_conf->hello_counter == 0 )
	{
		ngx_sprintf( ngx_hello_string, "<h1>Non counter</h1>" );
	}
	else
	{
		ngx_sprintf( ngx_hello_string, 
					"<h1>Visited Times:%d</h1>", 
					++ngx_hello_visited_times );
	}
	
	ngx_log_error( NGX_LOG_EMERG, r->connection->log, 0, "hello_string:%s", ngx_hello_string );
	content_length = ngx_strlen( ngx_hello_string );
	
	// 分配响应缓冲区
	b = ngx_pcalloc( r->pool, sizeof(ngx_buf_t) );
	out.buf = b;	// attach 
	out.next = NULL;
	
	b->pos = ngx_hello_string;
	b->last = ngx_hello_string + content_length;
	b->memory = 1;
	b->last_buf = 1;

	// 设置响应
	ngx_str_set( &r->headers_out.content_type, "text/html" );
	r->headers_out.status = NGX_HTTP_OK;
	r->headers_out.content_length_n = content_length;
	
	// 发送响应
	rc = ngx_http_send_header( r );

	// 传递至其它过滤器处理
	return ngx_http_output_filter( r, &out );
}

 

 二. 编译

插件目录:

~/hlmodule

-- config

-- ngx_http_hello_module.c

 

准备config文件,内容如下:

ngx_addon_name=ngx_http_hello_module
HTTP_MODULES="$HTTP_MODULES ngx_http_hello_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_module.c"

 

编译:

./configure --prefix=~/nginx --add-module=~/hlmodule
make && make install 

 

三. 配置启用hello_counter 

vi conf/nginx.conf 

location /hello {
	hello_counter on;		// 启用计数
}

 

四. 测试 

hello_counter设置on:

hello counter

 

hello_counter设置off:

off counter

 

 

 参考链接:

淘宝nginx模块开发  

http://tengine.taobao.org/book/chapter_03.html#hello-handler

官方reference

http://nginx.org/en/docs/dev/development_guide.html#core_modules

 

 

 

 

 

 

 

  • 大小: 15.6 KB
  • 大小: 14.4 KB
分享到:
评论

相关推荐

    深入理解Nginx:模块开发与架构解析(第2版)+(Linux_Unix技术丛书)+-+陶辉+著

    4. 模块开发:讲解如何开发自定义Nginx模块,包括模块结构、编译构建、API接口使用等,为有意向进行Nginx扩展的开发者提供实践指导。 5. 架构设计:深入探讨Nginx的架构设计,如模块化设计、事件驱动模型、内存管理...

    深入理解Nginx模块开发与架构解析(第2版)

    《深入理解Nginx模块开发与架构解析(第2版)》是一本专注于Nginx技术的专业书籍,针对Nginx的内部工作机制和模块开发进行了深入的探讨。本书旨在帮助读者掌握Nginx的核心概念、架构设计以及如何进行模块开发,从而...

    Nginx模块开发指南

    《Nginx模块开发指南》是一本专注于讲解如何利用C++11和Boost库进行Nginx模块开发的专业书籍。Nginx作为一个高性能的HTTP和反向代理服务器,其强大的可扩展性使得开发者可以通过编写模块来实现特定的功能,以满足...

    Nginx模块开发入门

    ### Nginx模块开发入门详解 #### Nginx概述与市场地位 Nginx作为一款高性能的HTTP服务器和反向代理服务器,在全球范围内享有极高的声誉。根据权威机构W3Techs的数据,截至某一时间点,全球排名前100万的网站中,...

    Nginx深入理解Nginx模块开发与架构解析(第2版)

    《Nginx深入理解Nginx模块开发与架构解析(第2版)》是一本针对Nginx技术的深入解析书籍,旨在帮助读者理解和掌握Nginx的核心设计理念以及如何进行高效的模块开发。这本书是该领域经典著作的更新版本,不仅延续了前一...

    Nginx模块开发OpenResty简单使用笔记整理.zip

    Nginx模块开发OpenResty简单使用笔记整理 ### Nginx简介 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中。与Apache相比。 同时,大量的第三方扩展模块也令...

    cpp-实战开发一个Nginx扩展NginxModule

    在本文中,我们将深入探讨如何使用C++进行实战开发,以创建一个名为NginxModule的自定义Nginx扩展。这个扩展是一个简单的Nginx echo模块,它将客户端发送的请求体数据回显到响应中。这为开发者提供了一个学习Nginx...

    Emiller的Nginx模块开发心得(doc)

    Emiller的Nginx模块开发心得是一篇针对Nginx模块开发者的实用指南,由Evan Miller撰写,并由YaoWeibin翻译成中文。本文档主要介绍了如何为Nginx构建自定义模块,这对于扩展Nginx的功能至关重要。以下是详细的知识点...

    FastDFS nginx扩展模块

    能够支持高达 50,000 个并发连接数的响应,感谢Nginx为大家选择了 epoll and kqueue作为开发模型。 服务器 Nginx作为负载均衡服务:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP...

    第一个Nginx模块的例子

    通过这个例子,开发者可以学习到Nginx模块开发的基本流程,从而能够根据实际需求创建自己的模块,增强Nginx的功能。这个过程涉及到了C语言编程、Nginx API理解和配置文件解析等多个方面,对提升Nginx的使用和开发...

    深入理解Nginx:模块开发与架构解析(第2版)

    《深入理解Nginx:模块开发与架构解析(第2版)》这本书是关于Nginx服务器的一个深度探讨,旨在帮助读者深入掌握Nginx的内部工作机制和模块开发技术。Nginx是一款高性能、轻量级的Web服务器/反向代理服务器,广泛应用...

    深入理解Nginx模块开发与架构解析.mobi

    3. **模块开发入门**:Nginx的扩展性主要体现在模块开发上。读者将学习如何创建自定义模块,包括模块的基本结构、初始化过程、请求处理流程、HTTP和HTTP子请求模块的区别等。 4. **模块高级技术**:深入到Nginx模块...

    《Nginx模块开发指南:使用C++11和Boost程序库》罗剑锋 azw3

    Nginx 是由俄罗斯工程师Igor Sysoev 开发的一个高性能Web ...《Nginx 模块开发指南:使用C++11 和Boost 程序库》结构严谨、脉络清晰、论述精确、详略得当,值得广大软件开发工程师、系统运维工程师和编程爱好者拥有。

    《深入理解Nginx:模块开发与架构解析》陶辉PDF

    《深入理解Nginx:模块开发与架构解析》是由陶辉编著的一本关于Nginx Web服务器的专业书籍。这本书全面地介绍了Nginx的核心原理、模块开发以及系统架构,对于想要深入研究Nginx技术的IT从业者来说,是一本不可多得的...

    Nginx模块开发指南.使用C++11和Boost程序库.罗剑锋

    《Nginx模块开发指南:使用C++11和Boost程序库》是由罗剑锋编著的一本专业书籍,主要面向对Nginx有深入兴趣并希望通过编程扩展其功能的技术人员。这本书详细介绍了如何利用现代C++11特性和Boost库来开发高效的Nginx...

    深入理解Nginx 模块开发与架构解析-完美排版

    《深入理解Nginx模块开发与架构解析》是一本针对Nginx技术的深度解析书籍,专注于探讨Nginx的内部机制、模块开发以及整体架构。Nginx是一款高性能的Web服务器,因其反向代理、负载均衡和静态文件处理能力而广受欢迎...

Global site tag (gtag.js) - Google Analytics