nginx支持动态模块

之前一直以为nginx只支持静态模块,每次添加新模块的时候只能重新编译,最近在看nginx的源码,发现新版nginx已经支持进行动态加载模块。

通过模块动态加载指令load_module,我们可以在运行中修改nginx的配置,指定要加载的第三方模块,然后reload,是不是方便了很多。


core模块已经添加了相关的command

    { ngx_string("load_module"),

      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,

      ngx_load_module,

      0,

      0,

      NULL },


对应的command handler如下:

static char *

ngx_load_module(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)

{

#if (NGX_HAVE_DLOPEN)

    void                *handle;

    char               **names, **order;

    ngx_str_t           *value, file;

    ngx_uint_t           i;

    ngx_module_t        *module, **modules;

    ngx_pool_cleanup_t  *cln;


    if (cf->cycle->modules_used) {

        return "is specified too late";

    }


    value = cf->args->elts;


    file = value[1];


    if (ngx_conf_full_name(cf->cycle, &file, 0) != NGX_OK) {

        return NGX_CONF_ERROR;

    }


    cln = ngx_pool_cleanup_add(cf->cycle->pool, 0);

    if (cln == NULL) {

        return NGX_CONF_ERROR;

    }


    handle = ngx_dlopen(file.data);

    if (handle == NULL) {

        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,

                           ngx_dlopen_n " \"%s\" failed (%s)",

                           file.data, ngx_dlerror());

        return NGX_CONF_ERROR;

    }


    cln->handler = ngx_unload_module;

    cln->data = handle;


    modules = ngx_dlsym(handle, "ngx_modules");

    if (modules == NULL) {

        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,

                           ngx_dlsym_n " \"%V\", \"%s\" failed (%s)",

                           &value[1], "ngx_modules", ngx_dlerror());

        return NGX_CONF_ERROR;

    }


    names = ngx_dlsym(handle, "ngx_module_names");

    if (names == NULL) {

        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,

                           ngx_dlsym_n " \"%V\", \"%s\" failed (%s)",

                           &value[1], "ngx_module_names", ngx_dlerror());

        return NGX_CONF_ERROR;

    }


    order = ngx_dlsym(handle, "ngx_module_order");


    for (i = 0; modules[i]; i++) {

        module = modules[i];

        module->name = names[i];


        if (ngx_add_module(cf, &file, module, order) != NGX_OK) {

            return NGX_CONF_ERROR;

        }


        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cf->log, 0, "module: %s i:%ui",

                       module->name, module->index);

    }


    return NGX_CONF_OK;


#else


    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,

                       "\"load_module\" is not supported "

                       "on this platform");

    return NGX_CONF_ERROR;


#endif

}

### Nginx 动态模块的使用与配置 Nginx动态模块功能允许用户在不重新编译 Nginx 的情况下加载额外的功能模块,这极大地提高了灵活性和可维护性。以下是关于如何使用和配置 Nginx 动态模块的相关说明。 #### 加载动态模块 要使动态模块生效,需通过 `load_module` 指令显式加载它们。此指令通常位于全局配置部分(即不在任何上下文中)。例如: ```nginx load_module modules/ngx_http_echo_module.so; ``` 上述语句表示加载名为 `ngx_http_echo_module.so` 的动态模块[^2]。需要注意的是,动态模块文件的位置取决于安装路径以及模块的具体存储位置。 #### 配置动态模块 一旦动态模块被成功加载,其行为可以通过标准的 Nginx 配置语法来定义。不同模块可能提供不同的配置选项。例如,假设已加载了一个用于日志记录增强的自定义模块,则可以在配置文件中指定如下参数: ```nginx http { log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; } ``` 这里展示的日志格式设置属于核心 HTTP 模块的一部分,但它可以与其他扩展模块协同工作以实现更复杂的需求[^1]。 #### 添加新的动态模块 如果需要新增未预先包含在内的第三方或者自制动态模块,按照以下流程操作即可: - **获取目标模块源码**:从官方站点或其他可信资源处下载所需模块版本。 - **准备环境**:进入服务器根目录并建立专门存放工具或组件的工作区,比如执行命令 `mkdir /app/tools/` 创建相应子目录结构。 - **复制模块至指定区域**:将解压后的模块放置于前述新建好的文件夹里以便后续引用。 - **重新构建支持动态加载特性的 Nginx 实例**:利用特定标志位完成新实例生成过程中的必要调整,确保最终产物兼容所期望加入的新特性集。 #### 示例代码片段 下面给出一段简单的例子用来演示整个流程的一个环节——修改现有服务配置使之能够接纳外部传入的数据流处理请求: ```nginx server { listen 8080; server_name localhost; location /process_data/ { proxy_pass http://backend_server/; include conf.d/proxy_params.conf; # 自定义代理参数集合 } } ``` 以上脚本段落展示了如何借助内置的 `proxy_pass` 和外延式的 `.conf` 文件引入机制达成数据转发目的的同时保留高度定制化的空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值