Nginx下用C语言写HTTP测试模块

1.创建模块目录

mkdir /work/nginx/modules/mytest

2.在该目录下创建两个文件 config和 ngx_http_mytest_module.c

touch config ngx_http_mytest_module.c

3.代码如下

(1)config文件代码

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

(2) ngx_http_mytest_module.c代码

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

static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r);
static char * ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);

//定义模块配置文件的处理
static ngx_command_t ngx_http_mytest_commands[] = {
{ //配置项名称
ngx_string("mytest"),
//配置项类型,即定义他可以出现的位置
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_NOARGS,
//处理配置项参数的函数,函数在下面定义
ngx_http_mytest,
//在配置文件中的偏移量
NGX_HTTP_LOC_CONF_OFFSET,
//预设的解析方法配置项
0,
//配置项读取后的处理方法
NULL
},
//command数组要以ngx_null_command结束
//#define ngx_null_command {ngx_null_string,0,NULL,0,0,NULL}
ngx_null_command
};

//mytest模块上下文,都为NULL即是说在http框架初始化时没有什么要做
static ngx_http_module_t ngx_http_mytest_module_ctx = {
NULL, //preconfiguration
NULL, //postconfiguration
NULL, //create main configuration
NULL, //init main configuration
NULL, //create server configuration
NULL, //merge server configuration
NULL, //create location configuration
NULL //merge location configuration
};
//对自己mytest模块的定义,在编译时加入到全局的ngx_modules数组中,这样在Nginx初始化时会调用模块的所有初始化方法,(上面的ngx_http_module_t类型的ngx_http_mytest_module_ctx)

ngx_module_t ngx_http_mytest_module = {
NGX_MODULE_V1, //由Nginx定义的宏来初始化前七个成员
&ngx_http_mytest_module_ctx, //模块的上下文结构体,指向特定模块的公共方法
ngx_http_mytest_commands, //处理配置项的结构体数组
NGX_HTTP_MODULE, //模块类型
//Nginx在启动停止过程中七个执行点的函数指针
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,

NGX_MODULE_V1_PADDING //由Nginx定义的宏定义剩下的8个保留字段
};

//配置项对应的回调函数,当配置项中出现mytest配置项时将调用这个函数
static char * ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{ //ckcf并不是指特定的location块内的数据结构,他可以是mian、srv、loc级别的配置项
//每个http{},sever{},location{}都有一个ngx_http_core_loc_conf_t类型的数据结构
ngx_http_core_loc_conf_t *clcf;

//找到mytest配置项所在的配置块
clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);

//http框架在处理用户请求进行到NGX_HTTP_CONTENT_PHASE阶段是,如果请求的主机名,URI与配置项所在的配置块相匹配时,就调用
//clcf中的handle方法处理这个请求
//NGX_HTTP_CONTENT_PHASE用于处理http请求内容的阶段,这是大部分http模块通常介入的阶段
clcf->handler = ngx_http_mytest_handler;

return NGX_CONF_OK;
}

//实际完成处理的回调函数
static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r)
{
//请求方法
if (!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD))) {
return NGX_HTTP_NOT_ALLOWED;
}
//不处理请求的包体,直接丢弃。但这一步也是不可省略的,他是接受包体的一种方法,只不过是简单的丢弃,
//如果不接受,客户端可能会再次试图发送包体,而服务器不接受就会造成客户端发送超时
ngx_int_t rc = ngx_http_discard_request_body(r);
if (rc != NGX_OK) {
return rc;
}
//构造响应头部
ngx_str_t type = ngx_string("text/plain");
ngx_str_t response = ngx_string("hello world ! \n\rthis is my first Nginx module test ! ");
r->headers_out.status = NGX_HTTP_OK;
r->headers_out.content_length_n = response.len;
r->headers_out.content_type = type;
//发送http头部,其中也包括响应行
rc = ngx_http_send_header(r);
if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
return rc;
}

ngx_buf_t *b;
//根据请求中传来的内存池对象,创建内存buf
b = ngx_create_temp_buf(r->pool, response.len);
if (b == NULL) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
//有效内容从pos位置开始,复制respon的内容
ngx_memcpy(b->pos, response.data, response.len);
//有效内容到last结束
b->last = b->pos + response.len;
//因为ngx_buf_t可以由ngx_chain_t链表链起来,last_buf可以标记这是最后一块待处理的缓冲区,简化处理
b->last_buf = 1;
//将内存buf用链表链起来,作为ngx_http_output_filter的跌入个参数
ngx_chain_t out;
out.buf = b;
//标记这是最后一个ngx_chain_t
out.next = NULL;

return ngx_http_output_filter(r, &out);
}

4.在Nginx目录下进行操作

(1)首先configure

./configure --add-module=/work/nginx/modules/mytest

(2)make && make install

(3)在/usr/local/nginx/conf/nginx.conf配置文件中添加需要的配置项

location=/nestle {

  mytest;

}

(3)接下来启动浏览器

172.15.26.12/nestle

时间: 2024-10-30 04:33:05

Nginx下用C语言写HTTP测试模块的相关文章

在windows下用C语言写socket通讯实例

原文:在windows下用C语言写socket通讯实例 From:Microsoft Dev Center #undef UNICODE #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <stdlib.h> #include <stdio.h> // Need to link with Ws2

go语言如何书写测试模块

如何在go语言中使用原生的testing模块书写测试模块 1.首先对于test模块如何去命名 按照官方的规定在书写test包的时候,应该以源文件名加上_test.go的结尾来书写测试包.如原文件名为`main.go`则测试包按照规定应该写为`main_test.go`.当然假如你的这两个文件在同一个文件夹内是没有问题的,而且只要保证是_test结尾即可. 2.测试包的举例 源文件 main.go package main import "fmt" func gotest(num int

UNIX环境下用C语言写静态库与动态库

静态库,动态库用UNIX 的术语来说,或者叫做归档文件(archive 常以.a 结尾)和共享对象(share object 常以lib 开头.so 结尾)更为准确.静态库,动态库可能是WINDOWS 下的术语,但两者的概念是一样的.下面统一说静态库和动态库. 静态库,就是一大堆object (CC ,CC 在LINUX 下其实是软件链接到GCC 的,编译后默认为.o 结尾的)的集合.静态库就是用ar 等工具集合在一起.在编译的时候,连接器就会将这部分代码嵌入到目标代码里. 动态库,也是一大堆o

Nginx源码分析1--------编写Nginx扩展模块

近日来申请通过CSDN准专家,为了顺利在六个月后升级为认证专家,并对得起这个勋章,我感觉 不能松懈博客的更新频率以及质量了.C/C++ windows下的开发是我相对来说做的比较多的地方,对于Linux下的服务器开发 等等也算是半路出家,恰逢近来在研究分布式存储,涉及到了 Nginx 扩展开发以及配置,查阅了好多的资料发现Nginx配置部署起来相当的容易,但是源代码是真的晦涩难懂,经常会看的我们百思不得其解,所以扩展开发Nginx模块也不是一个轻松的事情,那我就从Nginx扩展模块开始,一步一步

在有状态机下,写自动测试需要注意的问题

在没有状态机的情况下,可以完全仿照客户的使用习惯进行UI线程上的模拟,比如click(), drag(), drop()等等,这样可以不用写另外的函数,而只需要直接拿来 一些现成的UI表现来进行模拟. 但如果你的项目的全局状态下由状态机驱动的时候,这个时候就要注意了,如果你模拟UI的动作可能会出现一些状态机不能模拟到的事件----比如状态跳转,假设A->B->C,这样的状态流,你在A状态下,但由于你用了UI的函数,可能直接由A进入了C. 再比如如果你在A状态,使用了UI函数,但这个时候你并没有

空闲时间用C语言写了下2048游戏

本身这个游戏逻辑挺简单的,所以,不多说了,直接上代码吧 #include <climits> #include <cstdio> #include <cstring> #include <stack> #include <string> #include <map> #include <vector> #include <cmath> using namespace std; const int MAXX =

ThinkPHP3.2.3 Nginx 下 URL_MODEL 的配置

ThinkPHP3.2.3 的 URL_MODEL 包括普通模式(0).PATHINFO 模式(1).REWRITE 模式(2).兼容模式(3)等 4 种 URL 模式.在 Apache 下只要在配置文件 config.php 中配置 URL_MODEL 配合 .htaccess 就可以很容易地支持 REWRITE 模式. 在 Nginx 下设置项目的 URL 模式可以参考 老朱亲自写的,最完美ThinkPHP Nginx 配置文件,支持以上 4 种 URL 模式. 我测试的环境是 CentOS

写可测试的代码

任何一个软件都是可以测试.在某种意义上,用户的使用过程也就是一个软件测试的过程.可是这并不是我们今天要讲的可测试性.我们讲的可测试性指的是代码的可测试性,通俗点儿说就是是一串代码里包含的逻辑是不是可以被单元测试所覆盖.在这篇文章里我会从单元测试的基本概念开始引伸到如何写单元测试,如何写可单元测试的代码.文章里所有的例子都是C#写的,一来它是我职业生涯的主力语言.二来C#广为人知,相信对广大职业的或是业余的程序员来说读懂C#的代码不会是什么特别困难的事情.实际上我描述的方法和概念并不会局限于C#或

Windows下搭建go语言开发环境 以及 开发IDE (附下载链接)

1.下载 并且 安装 Go安装包 =========================================================== 在CSDN上传了我的版本,供大家下载: =========================================================== go1.2.windows-386.msi : http://download.csdn.net/detail/shuideyidi/7718563 go1.2.1.windows-am