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后停止.

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

  1. nginx 学习笔记(2) nginx新手入门

    这篇手册简单介绍了nginx,并提供了一些可以操作的简单的工作.前提是nginx已经被安装到你的服务器上.如果没有安装,请阅读上篇:nginx 学习笔记(1) nginx安装.这篇手册主要内容:1. ...

  2. nginx 学习笔记(1) nginx安装

    1.nginx安装 根据操作系统的不同,nginx的安装方式也不相同. 1.1 对linux系统来说,nginx.org提供了nginx安装包.http://nginx.org/en/linux_pa ...

  3. 七、Nginx学习笔记七Nginx的Web缓存服务

    user www; worker_processes 1; error_log /usr/local/nginx/logs/error.log crit; pid /usr/local/nginx/l ...

  4. nginx学习笔记(7)Nginx如何处理一个请求---转载

    如何防止处理未定义主机名的请求基于域名和IP混合的虚拟主机一个简单PHP站点配置 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口 ...

  5. nginx 学习笔记(5) nginx调试日志

    为启动一个调试日志,nginx需要在构建时配置城支持调试模式. ./configure --with-debug ... 而且调试级别应该使用err_log指令来设置: err_log /path/t ...

  6. nginx 学习笔记(3) nginx管理

    nginx可以通过向其发送信号来进行管理.默认情况下主进程的进程ID写到文件/usr/local/nginx/logs/nginx.pid中.当然也可以在配置文件中自定义该pid文件,自定义使用pid ...

  7. nginx 学习笔记(6) nginx配置文件中的度量单位

    容量大小可以用比特(byte),千比特(kilobyte,后缀k或者K)或者兆(megabytes,后缀m或者M),例如:“1024”,“8k”,“1m”. 时间间隔可以用毫秒(millisecond ...

  8. Nginx学习笔记4 源码分析

    Nginx学习笔记(四) 源码分析 源码分析 在茫茫的源码中,看到了几个好像挺熟悉的名字(socket/UDP/shmem).那就来看看这个文件吧!从简单的开始~~~ src/os/unix/Ngx_ ...

  9. Nginx学习笔记~目录索引

    回到占占推荐博客索引 前几天整理了<Docker的学习笔记索引>,受到了很多朋友的关注,今天把Nginx的文章也整理一下,以后将永久更新,像大叔之前的<EF文章系列>,< ...

随机推荐

  1. 为编写网络爬虫程序安装Python3.5

    1. 下载Python3.5.1安装包1.1 进入python官网,点击menu->downloads,网址:https://www.python.org/downloads/ 1.2 根据系统 ...

  2. python笔记之subprocess模块

    python笔记之subprocess模块 [TOC] 从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spaw ...

  3. 梯田(dfs)

    梯田 Time Limit: 2000 ms   Memory Limit: 256 MBTotal Submission: 26   Submission Accepted: 5   Descrip ...

  4. Keil C51 与 ARM 并存的方法

    很多朋友都在想,怎么让keil C51与ARM能够并存使用.有安装经验的朋友都知道,安好C51后再安ARm,C51不能正常工作:安好ARM后再安C51,ARM不能正常工作. 网上也有相关解决办法,不过 ...

  5. undefined reference to `png_set_longjmp_fn'

    这个是在Linux上编译项目的时候,一个动态库层用到的一个函数实现未找到,即使我链接了libpng2也没有找到,原因是这个库老了一些,没有这个函数定义,需要链接更高版本的png库,CentOS上有了在 ...

  6. 贝塞尔曲线:原理、自定义贝塞尔曲线View、使用!!!

    一.原理 转自:http://www.2cto.com/kf/201401/275838.html Android动画学习Demo(3) 沿着贝塞尔曲线移动的Property Animation Pr ...

  7. cf471A MUH and Sticks

    A. MUH and Sticks time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  8. IP、路由配置

    IP地址组成: 网络地址主机地址32位二进制 A类: 255.0.0.0, 8:    0 000 0001 - 0 111 1111     127个A类,127用于回环,1-126    2^7- ...

  9. 格而知之4:寻找EXC_BAD_ACCESS

    EXC_BAD_ACCESS算是一个比较常见的错误,大部分情况下,它出现在某个对象还未初始化或已被释放后,还去试图访问这个对象的时候,即是在出现悬挂指针的时候(当然也有非悬挂指针导致的EXC_BAD_ ...

  10. 基于angularJS和requireJS的前端架构

    1.概要描述 1.1.angularJS描述:angularJS是可以用来构建WEB应用的,WEB应用中的一种端对端的完整解决方案.通过开发者呈现一个更高层次的抽象来简化应用的开发.最适合的就是用它来 ...