nginx-如何将自己的HTTP模块编译进nginx

上一篇博客讲解了nginx相关的数据结构。

这一篇主要交接如何将自己的模块编译进nginx;

  1. 一种常用的简单方法:

    1)首先把源代码文件全部放大一个目录下,然后在改目录中编写一个config用于通知Nginx如何编译本模块,这个文件名必须为config。

  2. 在configure脚本执行时加入参数--add-module=PATH(上面源码,config的保存目录)
  3. 执行正常安装流程是完成Nginx的编译工作。

ps:还有一种复杂方式,就是修改configure脚本执行后生成的obj/Makefile和obj/ngx_module.c文件。

以后进行讲解

-------------------------------------------------------------------------------------------

2.config的写法:

其实config就是一个shell脚本,若是只想开发一个HTTP模块,需要定义3个变量

1.ngx_addon_name:仅在configure执行时使用,一般设置为模块名称。

2.HTTP_MODULES:保存所有HTTP模块名称,空格符相连。重新设置时不要覆盖,只需要添加

例:&HTTP_MODULES ngx_http_my_test_module

3.NGC_ADDON_SRCS:用于指定模块的源代码,空格符相连。

ps:设置时可以使用&ngx_addon_dir变量,等价于configure执行时的--add-module=PATH.

例:

ngx_addon_name=ngx_http_mytest_module

HTTP_MODULES="$HTTP_MODULES ngx_http_mytest_modue"

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

下面声明一个重点:

以上的3个变量并不是唯一可以再config中自定义的部分,如果开发一个HTTP过滤模块,则需要用HTTP_FILTER_MODULES替代HTTP_MODULES

$CORE_MODULES:核心模块。

$EVENT_MODULES:事件模块

$HTTP_MODULES:HTTP模块

$HTTP_FILTER_MODULES:HTTP过滤模块

$HTTP_HEADERS_FILTER_MODULES:HTTP头部过滤模块.

等。$NGX_ADDON_DEPS:指定模块依赖路径。

-------------------------------------------------------------------------------------------

3.利用configure脚本将制定的模块加入nginx中

首先nginx是通过configure生成程序的

在configure中。

.auto/modules

.auto/make

这2行代码是讲第三方模块加入到nginx中

1)configure如何利用config文件加入nginx中

--add-module=*)    NGX_ADDONS="$NGX_ADDONS $value" ;;

在configure命令执行到auto/modules脚本时,将生成ngx_modules.c文件中加入制定的第三方模块。

下面是部分源码:

if test -n "$NGX_ADDONS";then
    
    echo configuring addtional  modules
    
    for ngx_addon_dir in $NGX_ADDONS
    do
        echo "adding module in $ngx_addon_dir"
        
        if test -f $ngx_addon_dir/config; then
            .$ngx_addon_dir/config
            
            echo "+ $nginx_addon_name was configured"
        
        else
            echo "错误信息"
            exit 1
         fi
    done
fi

当遍历config文件后。就会在ngx_modules.c中定义一个ngx_module_t *ngx_modules[]数组,通过处理请求时的循环访问数组确定该用哪一个模块来处理。

最后就是auto/make把相关模块编译进nginx。

-------------------------------------------------------------------------------------------

4.直接修改Makefile文件

适用于我们需要重新决定ngx_module* ngx_modules[]数组中各模块的顺序,或者在编译源代码时需要加入一些独特的编译选项,那么可以再执行完configure后,对objs/ngx_modules.c和objs/Makefile文件直接进行修改

首先,当我们要修改ngx_modules.c时候,需要加上一行代码

extern ngx_module_t ngx_http_mytypes_module;

然后主动加上ngx_modules数组中

ngx_modules_t *ngx_modules[] = {
    ...
    &ngx_http_upstream_ip_hash_module,
    &ngx_http_mytest_module,
    $ngx_http_write_filter_module,
    ...
    NULL
};

注意我么模块加入的顺序十分重要,因为nginx中模块调用顺序是正序所需

最后就是修改Makefile.

obj/addon/httpmodule/ngx_http_mytest_modules.0:$(ADDON_DEPS)    ../sample/httpmodule/ngx_http_mytest_modules.c
    $(CC) -c $(CFLAGS) $(ALL_INCS)            -o objs/addon/httpmdoule/ngx_http_mytest_module.o           ../sample/httpmodule//ngx_http_mytest_module.c

然后把目标文件链接到Nginx中

objs/nginx:   objs/src/core/nginx.o
...
    objs/addon/httpmodule/ngx_http_mytest_module.o    objs/ngx_modules.o
    
    $(LINK) -o objs/nginx    objs/src/core/nginx.o    ...
    objs/addon/httpmodule/ngx_http_mytest_module.o    objs/ngx_modules.o    -lpthread -lcrypt -lpcre -lcrypto -lcrypto -lz

这个是修改文件,所以不正确的修改可能导致nginx出错,所以慎用

时间: 2024-10-10 08:38:55

nginx-如何将自己的HTTP模块编译进nginx的相关文章

将ImageMagic库编译进nginx

1.首先要将ImageMagick库的相应头文件加到环境变量中 export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/ImageMagick/include/ImageMagick/ 后面的路径依每个人的情况不同 不然会出现以下错误 wand/MagickWand.h: No such file or directory 2.链接时加上相应的库 在obj/Makefile文件中,找到以下行, objs/nginx:     objs/src/core/

【Nginx】开发一个HTTP过滤模块

与HTTP处理模块不同.HTTP过滤模块的工作是对发送给用户的HTTP响应做一些加工. server返回的一个响应能够被随意多个HTTP过滤模块以流水线的方式依次处理.HTTP响应分为头部和包体,ngx_http_send_header和ngx_http_output_filter函数分别负责发送头部和包体.它们会依次调用各个过滤模块对待发送的响应进行处理. HTTP过滤模块能够单独处理响应的头部或者包体或同一时候处理二者.处理头部和包体的方法原型分别例如以下,它们在HTTP框架模块ngx_ht

基于Nginx实现一个自己的HTTP模块

/usr/local/nginx/conf/nginx.conf文件例如以下: #worker工作进程的用户及用户组 user weijl; #Nginx worker进程个数 worker_processes 1; #error日志的设置,默认logs/error.log error #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid文件的路径 #pi

转载:编译安装Nginx(1.5.1)《深入理解Nginx》(陶辉)

原文:https://book.2cto.com/201304/19618.html 1.5 configure详解 可以看出,configure命令至关重要,下文将详细介绍如何使用configure命令,并分析configure到底是如何工作的,从中我们也可以看出Nginx的一些设计思想. 1.5.1 configure的命令参数 使用help命令可以查看configure包含的参数. ./configure --help 这里不一一列出help的结果,只是把它的参数分为了四大类型,下面将会详

ansible-playbook 手工编译安装nginx

虽然nginx也可以通过yum安装,但是如何使用源码包安装并自定义开启一些nginx功能模块,并且通过ansible下发到被管理集群呢?下面给给位看官提供一个具体实例以供参考.首先我们需要手工编译好一台nginx服务器作为模板,再采用roles角色管理的方式将其解耦,并下发到被管理集群,具体步骤如下:实验环境:ansibleserver,nginx模板:(IP:192.168.252.130 centos7)Mysqlserver: (IP:192.168.252.173 centos7)Web

在Ubuntu下编译安装nginx

一.安装nginx 1.安装前提 a)epoll,linux内核版本为2.6或者以上 b)gcc编译器,g++编译器 c)pcre库,函数库,支持解析正则表达式 d)zlib库:压缩解压功能 e)openssl库:ssl功能相关库,用于网站加密通讯 2.nginx源码下载以及目录结构简单认识 nginx官网:http:www.nginx.org nginx的几种版本: (1)mianline版本,版本号中间数字一般为奇数,更新快,一个月就会发布一个新版本,最新功能,bug修复等,稳定性差点. (

编译安装nginx后service nginx start 启动不了

平时都是yum安装nginx的,今天没事就在虚拟机上编译安装了一回.安装过程很简单,就不一一赘述了. 当我习惯性的用service nginx start启动时,却启动不了.怎么办了,网上看了看,得写脚本.我去,对于 初入门的新手,最怕的就是写脚本了.有什么简单办法没?脚本必须写啊,不写启动不了啊.那怎么办,直接 复制网上的,没意思.思来想去最后决定改造nginx启动脚本.具体思路是这样的,现在另一台虚拟机上yum 安装nginx,安装好后把/etc/init.d/nginx脚本拷贝到另一台编译

详解将驱动程序编译进linux内核

1.进入目录linux-kernel-samsung-dev\drivers\char 2.新建目标目录01.led,将驱动相关文件复制到此目录 注:需确保复制的驱动文件是能正常运行的驱动 3.在目录01.led里编写Kconfig文件 menu "xxx" config XXX_LED tristate "xxx_ggg210_led" default n help The led water made by xxx which was used by platf

【转】Linux驱动模块编译进内核中

原文网址:http://blog.chinaunix.net/uid-29287950-id-4573481.html BQ27501驱动编译进内核 一.       驱动程序编译进内核的步骤 在 linux 内核中增加程序需要完成以下三项工作: 1. 将编写的源代码复制到 Linux 内核源代码的相应目录: 2. 在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项: 3. 在目录的 Makefile 文件中增加对新源代码的编译条目. bq27501驱动编译到内核中具体步骤如下: