Nginx学习笔记六Nginx的模块开发

1.Nginx配置文件主要组成:
main(全局配置)这部分的指令将影响其他所有部分.
server(虚拟主机配置)这部分指令主要用于指定虚拟主机域名,IP和端口.
upstream(主要为反向代理,负载均衡相关配置)这部分指令用于设置反向代理及后端服务

器的负载均衡.
location(目录匹配配置)这部分指令用于匹配网页位置(例如,根目录"/","/images",等

等).

location部分会继承server部分的指令,而server部分会继承main部分的指令.upstream

既不会继承指令也不会影响其他部分.它有自己的特殊指令,不需要在其他地方应用.

2.Nginx模块概述.
Nginx的模块不能够像Apache那样动态添加,所有的模块都要预先编译进Nginx的二进制可

执行文件中.Nginx模块有三种角色.
(1)Handlers(处理模块)——用于处理HTTP请求并输出内容.
(2)Filters(过滤模块)——用于过滤Handler输出的内容.
(3)Load-balancers(负载均衡模块)——当有多于一台的后端服务器供选择时,选择一台

后端服务器并将HTTP请求转发到该服务器.

3.Nginx模块的处理流程:
Nginx发送文件或请求到其他服务器时,可以用Handlers处理模块为其服务:当需要Nginx

把输出压缩或在服务端加一些东西时,可以用Filters过滤模块.Nginx的核心模块主要管

理网络层和应用层协议,以及启动针对特定应用的一系列候选模块.

客户端发送HTTP请求到Nginx服务器
        |
Nginx基于配置文件中的位置选择一个合适的处理模块        
        |
负载均衡模块选择一台后端服务器(反向代理情况下)
        |
处理模块进行处理并把输出缓冲放到第一个过滤模块上
        |
第一个过滤模块处理后输出给第二个过滤模块
        |
然后第二个过滤模块又到了第三个过滤模块
        |
    第N个过滤模块
        |
最后把处理结果发送给客户端

4.模块执行的位置
模块相当于钩子,可以挂在Nginx的以下位置,在某些时候执行某些功能.
(1)当服务读配置文件之前.
(2)当读取在location和server部分或其他任何部分的每一个配置指令时。
(3)当Nginx初始化全局部分的配置时.
(4)当Nginx初始化主机部分(比如主机/端口)的配置时.
(5)当Nginx将全局部分的配置与主机部分的配置合并时.
(6)当Nginx初始化匹配位置部分配置时.
(7)当Nginx将其上层主机配置与位置部分配置合并时.
(8)当Nginx的主进程(master)开始时.
(9)当一个新的工作进程(worker)开始时.
(10)当一个工作进程退出时.
(11)当主进程退出时.
(12)处理HTTP请求时.
(13)过滤HTTP回复的头部时.
(14)过滤HTTP回复的主体时.
(15)选择一台后端服务器时.
(16)初始化到后端服务器的请求时.
(17)重新初始化到后端服务器的请求时.
(18)处理来自后端服务器的回复时.
(19)完成与后端服务器的交互时.

5.Nginx模块编写例子
(1)执行以下命令创建一个目录,将在该目录内编写我们的Nginx模块:
mkdir -p /opt/nginx_hello_world
cd /opt/nginx_hello_world
(2)开始创建Nginx模块所需的配置文件(名称为config)
vi /opt/nginx_hello_world/config
输入以下内容并保存退出.
ngx_addon_name=ngx_http_hello_world_module
HTTP_MODULES="$HTTP_MODULES ngx_http_hello_world_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_world_module.c"
CORE_LIBS="$CORE_LIBS -lpcre"
(3)创建Nginx模块的c程序文件(名称格式为"ngx_http_模块名称_module.c",在本实例中

,文件名称为ngx_http_hello_world_module.c)
vi /opt/nginx_hello_world/ngx_http_hello_world_module.c
(4)下载Nginx源码包,并将hello world模块编译到其中.如下所示
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.9.tar.gz
tar zxvf pcre-7.9.tar.gz
cd pcre-7.9/
./configure
make && make install
cd ../

wget http://sysoev.ru/nginx/nginx-0.8.14.tar.gz
tar zxvf nginx-0.8.14.tar.gz
cd nginx-0.8.14/
./configure --prefix=/usr/local/nginx --add-module=/opt/nginx_hello_world
make
make install
(5)配置nginx.conf,在server部分增加以下内容:
location = /hello {
  hello_world ;
}
(6)启动Nginx,用浏览器访问http://localhost/hello,就可以看到编写的Nginx Hello

World 模块输出的文字"Hello World"

6.Hello World模块分析:
在ngx_http_hello_world_module.c代码中,ngx_command_t函数用于定义包含模块指令的

静态数组ngx_http_hello_world_commands,代码如下
static ngx_command_t ngx_http_hello_world_commands[] =
{
 {
  ngx_string ("hello_world"),
  NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
  ngx_http_hello_world,
  0,
  0,
  NULL
 },
 ngx_null_command
}

(1)在数组中,第一项参数ngx_string("hello_world")为指令名称字符串,不能含有空格,

数据类型是ngx_str_t,经常用来进行字符串实例化.ngx_str_t结构体由包含有字符串的

data成员和表示字符串长度的len成员组成.Nginx用这个数据类型来存放字符串.
(2)第二项参数用来设置指令在配置文件位置的哪一部分使用是合法的.可选值如下,多个

选项以"|"隔开:
NGX_HTTP_MAIN_CONF——指令出现在全局配置部分是合法的.
NGX_HTTP_SRV_CONF——指令出现在server主机配置部分是合法的.
NGX_HTTP_LOC_CONF——指令出现在location配置部分是合法的.
NGX_HTTP_UPS_CONF——指令出现在upstream配置部分是合法的.
(3)第三项参数ngx_http_hello_world是一个回调函数.
(4)第四项参数用于告诉Nginx是把要保持的值放在全局配置部分,server主机配置部分还

是location位置配置部分(使用NGX_HTTP_MAIN_CONF_OFFSET,

NGX_HTTP_SRV_CONF_OFFSET,NGX_HTTP_LOC_CONF_OFFSET)
(5)第五项参数用于设置指令的值保存在结构体的哪个位置
(6)第六项参数一般为NULL。
六个参数都设置完毕后,数组在读入ngx_null_command后停止.

时间: 2024-12-17 05:21:38

Nginx学习笔记六Nginx的模块开发的相关文章

Python学习笔记六(常用模块、面向对象基础)

一.random模块 import random print(random.random()) #0-1之间的小数 print(random.randint(1,5)) #1-5之间(包括1和5)的整数 print(random.randrange(1,5)) #1-5之间(包含1,不好包含5)的整数 print(random.choice(['a','b','c'])) #给定列表中任意元素 print(random.sample(['a','b','c','d'],2)) #给定列表中任意n

nginx学习笔记之基于端口的虚拟主机基于主机名的虚拟主机root、alias、index配置

nginx学习笔记之基于端口的虚拟主机基于主机名的虚拟主机root.alias.index配置 实验环境: centos 测试节点IP:172.16.3.101 基于端口的虚拟主机: vim /etc/nginx/nginx.conf # 向里面的http {}里面加入如下内容   server { # server定义一个虚拟主机         listen 8080; # 监听本机所有IP端口8080         server_name www.test.com; # 虚拟主机名为:w

[Pro Angular.JS]学习笔记1.1:设置开发环境

可以使用yeoman.io,很方便.我已经写了一篇随笔,介绍如何使用.这里也有一篇介绍的文章:http://www.cnblogs.com/JoannaQ/p/3756281.html 代码编辑器,在Mac下用了一下WebStorm,太恶心了.另外发现书的作者使用的开发环境是Windows + VS Express 2013,为了方便学习,我也使用VS Express 2013 Update2.VS2013用起来蛮舒服的,把WebStorm比得跟驼屎一样.也许是因为我没用习惯吧. 1.安装Nod

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 另外需要注意的: 引用计数仅仅作用于类实例上.结构和枚举是值类型,而非引用类型,所以不能被引用存储和传递. swift的ARC工作过程 每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息. 另外当实例不再被使用时,ARC会释放实例所占用的内存,这些

laravel3学习笔记(六)

原作者博客:ieqi.net ==================================================================================================== ORM Laravel3中MVC体系中Model里最重要的组成部分无疑是ORM了,ORM — object-relational mapper — 将数据操作面向对象化,使得整个web框架的核心风格统一,降低整体复杂度,为开发者提供便利. Laravel3中的ORM叫

python之raw_input()(学习笔记六)

python之raw_input()(学习笔记六) 我们经常使用raw_input()读取用户的输入,如下例子所示: >>> name = raw_input('please input your name:'),截图如下: 下面简单说下,raw_input()与if搭配使用,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- birth = raw_input('birth:') if birth < 2000: print '0

Linux 程序设计学习笔记----进程管理与程序开发(下)

转载请注明出处:http://blog.csdn.net/suool/article/details/38419983,谢谢! 进程管理及其控制 创建进程 fork()函数 函数说明具体参见:http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html 返回值:Upon successful completion, fork() shall return 0 to the child process and shall re

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这