不同的模块流程不同这是一个直接从从配置中读取信息,并返回给客户端的例子。
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>
static char* ngx_echo_readconf(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
static void* ngx_echo_create_loc_conf(ngx_conf_t *cf);
static char* ngx_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child);
typedef struct {
ngx_str_t ecdata;
ngx_flag_t enable;
} ngx_echo_loc_conf_t;
// 读取配置文件内容 echo -> ecdata
// 1、ngx_echo_readconf是程序第一步
static ngx_command_t ngx_echo_commands[] = {
{ ngx_string("echo"),
NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
ngx_echo_readconf,
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_echo_loc_conf_t, ecdata),
NULL },
ngx_null_command
};
static ngx_http_module_t ngx_echo_module_ctx = {
NULL, /* preconfiguration */
NULL, /* postconfiguration */
NULL, /* create main configuration */
NULL, /* init main configuration */
NULL, /* create server configuration */
NULL, /* merge server configuration */
ngx_echo_create_loc_conf, /* create location configuration */
ngx_echo_merge_loc_conf /* merge location configuration */
};
// 定义模块 ngx_http_hi_module 就是模块的名字
ngx_module_t ngx_http_hi_module = {
NGX_MODULE_V1,
&ngx_echo_module_ctx, /* module context */
ngx_echo_commands, /* module directives */
NGX_HTTP_MODULE, /* module type */
NULL, /* init master */
NULL, /* init module */
NULL, /* init process */
NULL, /* init thread */
NULL, /* exit thread */
NULL, /* exit process */
NULL, /* exit master */
NGX_MODULE_V1_PADDING
};
// 主要的功能在这里
static ngx_int_t
ngx_echo_handler(ngx_http_request_t *r)
{
printf("called:ngx_echo_handler\n");
ngx_int_t rc;
ngx_buf_t *b;
ngx_chain_t out;
ngx_echo_loc_conf_t *cglcf;
cglcf = ngx_http_get_module_loc_conf(r, ngx_http_hi_module); // 这个和上面是对应的。
if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
return NGX_HTTP_NOT_ALLOWED;
}
if (r->headers_in.if_modified_since) {
return NGX_HTTP_NOT_MODIFIED;
}
r->headers_out.content_type.len = sizeof("text/html") - 1;
r->headers_out.content_type.data = (u_char *) "text/html";
r->headers_out.status = NGX_HTTP_OK;
r->headers_out.content_length_n = cglcf->ecdata.len;
if (r->method == NGX_HTTP_HEAD) {
rc = ngx_http_send_header(r);
if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
return rc;
}
}
b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
if (b == NULL) {
ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate response buffer.");
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
out.buf = b;
out.next = NULL;
b->pos = cglcf->ecdata.data;
b->last = cglcf->ecdata.data+(cglcf->ecdata.len);
b->memory = 1;
b->last_buf = 1;
rc = ngx_http_send_header(r);
if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
return rc;
}
return ngx_http_output_filter(r, &out); // 交给过滤器
}
static char *
ngx_echo_readconf(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
printf("called:ngx_echo_readconf\n");
ngx_http_core_loc_conf_t *clcf;
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
clcf->handler = ngx_echo_handler; // 2、ngx_echo_handler是程序第二步
ngx_conf_set_str_slot(cf,cmd,conf);
return NGX_CONF_OK;
}
static void *
ngx_echo_create_loc_conf(ngx_conf_t *cf)
{
printf("called:ngx_echo_create_loc_conf\n");
ngx_echo_loc_conf_t *conf;
conf = ngx_pcalloc(cf->pool, sizeof(ngx_echo_loc_conf_t));
if (conf == NULL) {
return NGX_CONF_ERROR;
}
conf->ecdata.len=0;
conf->ecdata.data=NULL;
conf->enable = NGX_CONF_UNSET;
return conf;
}
static char *
ngx_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)
{
printf("called:ngx_echo_merge_loc_conf\n");
ngx_echo_loc_conf_t *prev = parent;
ngx_echo_loc_conf_t *conf = child;
ngx_conf_merge_str_value(conf->ecdata, prev->ecdata, 10);
ngx_conf_merge_value(conf->enable, prev->enable, 0);
/**
if(conf->enable)
ngx_echo_init(conf);
*/
return NGX_CONF_OK;
return NGX_CONF_OK;
}
分享到:
相关推荐
通过阅读《Nginx模块开发与架构解析》这本书,无论是对Nginx有初步了解还是希望深入研究的开发者,都能从中受益匪浅,掌握Nginx的高级特性,提升自己在Web服务器领域的能力。如果你对Nginx的模块开发、架构设计、...
总之,《深入理解Nginx模块开发与架构解析》第二版是一本全面、深入的技术书籍,对于那些希望优化Web服务性能、从事Nginx二次开发或者对服务器架构有深入研究的Java开发者来说,是一份宝贵的参考资料。通过阅读此书...
《深入理解Nginx模块开发与架构解析第2版》是一本专为IT专业人士准备的深度学习教程,尤其适合那些想要深入研究Nginx服务器及其模块开发的工程师。这本书全面覆盖了Nginx的核心概念、架构设计以及模块开发技术,旨在...
### Nginx模块开发指南(中文) #### 非常不错的Nginx源码分析文档 欢迎参考:[http://blog.csdn.net/yankai0219/article/details/8005721](http://blog.csdn.net/yankai0219/article/details/8005721),此文档...
总的来说,《深入理解Nginx模块开发与架构解析》第二版是一本全面、实用的Nginx指南,不仅适合初学者了解Nginx的基础知识,也适合经验丰富的开发者深入研究和优化Nginx的性能。通过这本书的学习,读者可以掌握Nginx...
《深入理解Nginx模块开发与架构解析(第二版)》是一本专为对Nginx有深入研究和技术追求的IT专业人士编写的书籍。Nginx作为一款轻量级、高性能的Web服务器,广泛应用于互联网服务,其核心在于其独特的事件驱动、异步...
这本书全面地介绍了Nginx的核心原理、模块开发以及系统架构,对于想要深入研究Nginx技术的IT从业者来说,是一本不可多得的参考资料。 Nginx是一款高性能、轻量级的Web服务器/反向代理服务器,因其高效的性能和丰富...
6. **Nginx模块开发**:理解Nginx的模块化体系结构是关键。这个模块可能实现了Nginx的HTTP上下文处理函数,以处理与Consul的交互。 7. **构建和部署**:在实际应用中,需要了解如何编译这个模块,将其整合到Nginx...
本资料包包含了《Nginx模块开发指南》和《深入理解Nginx》等资源,旨在帮助初学者逐步探索Nginx的设计思想和内部机制。 **1. Nginx的设计理念** Nginx采用事件驱动的异步非阻塞模型,这种模型使得它在处理大量并发...
为了更好地理解和使用`mod_strip`,我们需要熟悉C语言(Nginx的开发语言)和Nginx模块开发接口,同时了解HTML解析的基本原理。通过阅读源码,我们可以了解到如何编写Nginx模块,以及如何在HTTP响应中进行内容操作,...
本书旨在满足广大开发者和运维人员对Nginx模块开发及内部工作原理的学习需求。 Nginx是一款高性能的反向代理服务器,其事件驱动的非阻塞I/O模型使得它在处理高并发请求时表现出色。在深入讲解Nginx开发之前,我们...
1. **安装与配置**:首先,你需要在已安装的Nginx环境中编译并安装ngx_ruby模块。这通常需要下载ngx_ruby源码,将其与Nginx源码一起编译,并在Nginx配置文件中启用该模块。 2. **Ruby环境**:确保系统中已经安装了...
对于想要深入学习Nginx模块开发的开发者来说,掌握以下几个知识点是非常重要的: - Nginx模块架构和模块编程接口(MAI) - Nginx配置解析机制,包括如何定义新的配置指令 - Nginx事件驱动架构和网络IO模型 - 如何在...
2. **Nginx模块开发**:理解Nginx的工作原理和模块结构,包括如何处理HTTP请求、响应,以及如何注册模块到Nginx的事件模型中。 3. **MongoDB C++驱动程序**:开发者需要使用MongoDB提供的C++驱动程序来与数据库通信...
Emiller的Nginx模块开发指南.docx Nginx(en).pdf nginx@taobao.pdf nginx_internals.pdf nginx核心讲解(0.2).doc nginx核心讲解(0.4).doc Nginx模块开发指南中文版.txt nginx与lighttpd+实现分析比较.pdf Nginx源...