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

  • 相关阅读:
    asp.net 遍历xml 及 Repeater 绑定xml
    通过NetworkIsolationEnumAppContainers查看安装的UWP应用
    修复 Outlook 数据文件(.pst 和 .ost)
    c# 学习笔记 抓包解析器开发
    c++ 结构体位域操作 进制转换
    《C++ Footprint and Performance Optimization》读书笔记
    SQL SERVER 2000 函数一点小注意
    一个B/S结构MIS的登录日志的问题。
    jmeter连接mysql提示Cannot create PoolableConnectionFactory(查看jmeter日志,提示SSL)如何解决
    List、Map、Set之间的联系与区别:
  • 原文地址:https://www.cnblogs.com/lidabo/p/4177054.html
Copyright © 2020-2023  润新知