详细资料:<深入理解Nginx>

1.编写第三方模块

建立文件夹hello,里面有两个文件:

ngx_http_mytest_module.c

 #include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h> static char *
ngx_http_mytest(ngx_conf_t *cf,ngx_command_t *cmd,void *conf);
static ngx_int_t
ngx_http_mytest_handler(ngx_http_request_t *r); 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,
//出现了name中指定的配置项后,将会调用该方法处理配置项的参数
ngx_http_mytest,
NGX_HTTP_LOC_CONF_OFFSET,
,
NULL
},
ngx_null_command
}; static char *
ngx_http_mytest(ngx_conf_t *cf,ngx_command_t *cmd,void *conf)
{
//找到mytest配置项所属的配置块
ngx_http_core_loc_conf_t *clcf;
clcf=ngx_http_conf_get_module_loc_conf(cf,ngx_http_core_module);
/*
HTTP框架在处理用户请求进行到NGX_HTTP_CONTENT_PHASE阶段时
如果请求的主机域名、URI与mytest配置项所在的配置块相匹配,
就将调用我们事先的ngx_http_mytest_handler方法处理这个请求
*/
clcf->handler=ngx_http_mytest_handler;
return NGX_CONF_OK;
} static ngx_http_module_t ngx_http_mytest_module_ctx={
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL
}; ngx_module_t ngx_http_mytest_module={
NGX_MODULE_V1,
//指向ngx_http_module_t结构体
&ngx_http_mytest_module_ctx,
//用来处理nginx.conf中的配置项
ngx_http_mytest_commands,
//表示该模块的类型
NGX_HTTP_MODULE,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NGX_MODULE_V1_PADDING
}; static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r)
{
//判断请求方法是否为GET或者HEAD,否则返回405 Not Allowed
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!");
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结构体准备发送包体
ngx_buf_t *b;
b=ngx_create_temp_buf(r->pool,response.len);
if(b==NULL){
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
ngx_memcpy(b->pos,response.data,response.len);
b->last=b->pos+response.len;
b->last_buf=; //构造发送时的ngx_chain_t结构体
ngx_chain_t out;
out.buf=b;
out.next=NULL;
return ngx_http_output_filter(r,&out);
}

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.编译第三方模块(nginx源码目录下)

在未安装nginx的情况下安装第三方模块

# ./configure --prefix=/usr/local/nginx \
--add-module=/第三方模块目录

在已安装nginx情况下安装第三方模块

# ./configure --prefix=/usr/local/nginx \
--add-module=/第三方模块目录
# make
# /usr/local/nginx/sbin/nginx -s stop
# cp objs/nginx /usr/local/nginx/sbin/nginx
# /usr/local/nginx/sbin/nginx

3.使用第三方模块

使用一个模块需要根据这个模块定义的配置指令来做。比如我们这个简单的hello handler module的时候就很简单。

在nginx.conf文件中在http里面的默认的server里面加入如下配置

location /test {
mytest;
}

4.使用telnet查看结果

Nigix加入Hello World模块的更多相关文章

  1. Nginx - upstream 模块及参数测试

    目录 - 1. 前言- 2. 配置示例及指令说明    - 2.1 配置示例    - 2.2 指令    - 2.3 upstream相关变量- 3. 参数配置及测试    - 3.1 max_fa ...

  2. Python学习之==>常用模块

    一.string模块 import string print(string.ascii_letters) # 所有大小写字母 print(string.ascii_lowercase) # 所有小写字 ...

  3. Vue+Axios+Nigix+SpringCloud前端和后端搭建及其碰到的问题

    一.Axios.Router的安装和使用 1.如何安装Axios和Router 1).进入到工程所在的文件夹,通过cmd指令,进入到window的dos界面 2).输入:npm install axi ...

  4. npm 私有模块的管理使用

    你可以使用 NPM 命令行工具来管理你在 NPM 仓库的私有模块代码,这使得在项目中使用公共模块变的更加方便. 开始前的工作 你需要一个 2.7.0 以上版本的 npm ,并且需要有一个可以登陆 np ...

  5. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  6. ES6模块import细节

    写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...

  7. Python标准模块--ContextManager

    1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...

  8. Python标准模块--Unicode

    1 模块简介 Python 3中最大的变化之一就是删除了Unicode类型.在Python 2中,有str类型和unicode类型,例如, Python 2.7.6 (default, Oct 26 ...

  9. Python标准模块--Iterators和Generators

    1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到.在本篇博文中,我们将会学习迭代器和生成器是什么.当然 ...

随机推荐

  1. 玩具谜题(NOIP2016)(纯模拟)

    原题传送门 神奇的题目.. 朝左朝右异或一下就好了 细节处理一下,输出now的字符串 下面贴代码 #include<iostream> #include<cstdio> #in ...

  2. 【一】ODB - C++ 访问数据库的利器--Hello World On Windows(Version-24)

    本文以MySQL数据库为例,其他数据类似. 官方文档和下载 ODB官方首页    官方开发者说明书(开发教程) 安装下载首页(下载与安装教程Windows/Linux) Windows安装步骤(都是英 ...

  3. react this.props.form异步执行问题

    最近在做一个选择器联动时,碰到this.props.form的异步执行问题,导致选择器一直没有办法联动 如图,选择公司名称后,应该同步刷新门店选择默认值, 但同时又要清空门店选择的上一次记录 就用到了 ...

  4. redis代替kafka做缓存队列

    前言:刚上线elk一个月左右,使用的kafka作为缓存队列,但是不知道为何,中间发生过好几次,elk突然没数据了,长达好几天都没有,      折腾了好久,好了,过几天又发生同样的状况.经查找,数据是 ...

  5. Flash3D学习计划(二)——理解世界,取景,投影变换,并理解投影坐标系

    各种坐标系都是有用的,因为某些信息只能在特定场景中才有意义. 一. 世界坐标系 世界坐标系是一个特殊的坐标系,它建立了描述其他坐标系所需要的参考框架.这就意味着,能够用世界坐标系描述其他坐标系的位置, ...

  6. android xml 布局文件中 android:ems="10"

    宽度为10个字符的宽度 xml中 android:ems属性 ,作为EditText 默认生成 的属性,其含义是需要编辑的 字符串长度 .设置为10时,最多编辑 10个em ,一个em单位是 两个in ...

  7. linux之ls指令的关键字过滤显示

    假设~/admin的文件夹下面有几个文件: a.pm b.pm c.pl d.pl e.pml 想只显示.pm结尾的可以用: ls *.pm 或者 ls | grep .pm,两者等价. 想显示b.开 ...

  8. UBI - Unsorted Block Images

    参考:http://www.linux-mtd.infradead.org/doc/ubi.html UBI - Unsorted Block Images Table of contents Big ...

  9. Proxy server got bad address from remote server

    在ArcMap中,在GIS Servrvers中,打开已经设置好的服务器时,出现下面的弹窗问题. Proxy server got bad address from remote server(ver ...

  10. ASIHTTPRequest框架使用总结系列之阿堂教程3(异步请求)

    在上一节中,阿堂和网友们分享了ASIHTTPRequest框架对于get,post的同步请求方式.很显然,如果网速比较慢,查询的时候会一直很黑屏,直到请求结束界面才出现结果,这样用户体验肯定很不好了. ...