ngx_http_add_server

复制代码
/* add the server core module configuration to the address:port */

static ngx_int_t
ngx_http_add_server(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
    ngx_http_conf_addr_t *addr)
{
    ngx_uint_t                  i;
    ngx_http_core_srv_conf_t  **server;

    if (addr->servers.elts == NULL) {
        if (ngx_array_init(&addr->servers, cf->temp_pool, 4,
                           sizeof(ngx_http_core_srv_conf_t *))
            != NGX_OK)
        {
            return NGX_ERROR;
        }

    } else {
        server = addr->servers.elts;
        for (i = 0; i < addr->servers.nelts; i++) {
            if (server[i] == cscf) {
                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
                                   "a duplicate listen %V",
                                   &addr->opt.addr_text);
                return NGX_ERROR;
            }
        }
    }

    server = ngx_array_push(&addr->servers);
    if (server == NULL) {
        return NGX_ERROR;
    }

    *server = cscf;

    return NGX_OK;
}

ngx_http_add_server 函数的作用是将一个 HTTP 服务器配置 (ngx_http_core_srv_conf_t) 添加到指定的监听地址配置 (ngx_http_conf_addr_t) 的服务器列表中,并确保同一配置不会被重复添加


复制代码
if (addr->servers.elts == NULL) {
        if (ngx_array_init(&addr->servers, cf->temp_pool, 4,
                           sizeof(ngx_http_core_srv_conf_t *))
            != NGX_OK)
        {
            return NGX_ERROR;
        }

    }

初始化存储服务器配置的动态数组 ,确保后续可以安全地将新的服务器配置 (cscf) 添加到监听地址 (addr) 的服务器列表中

检查数组是否已初始化

通过判断 addr->servers.elts 是否为 NULL,确定该地址的服务器列表是否已经初始化

addr->servers 是 Nginx 中用于 关联监听地址与虚拟主机配置 的核心数据结构,其本质是一个动态数组(ngx_array_t),存储了指向 ngx_http_core_srv_conf_t 类型(虚拟主机配置)的指针

ngx_http_core_srv_conf_t-CSDN博客

此时 addr->servers.elts 是 NULL

复制代码
    server = ngx_array_push(&addr->servers);
    if (server == NULL) {
        return NGX_ERROR;
    }

    *server = cscf;

将当前的 HTTP 服务器配置(cscf)添加到监听地址(addr)的服务器列表(addr->servers)中

复制代码
return NGX_OK;

返回 NGX_OK

相关推荐
懂点Tech31 分钟前
ctfshow MISC入门图片篇(信息附加):misc21解题思路
网络
CS_Zero1 小时前
计算机网络通信基础2:带宽和吞吐量、客户端和服务器、网络基础设施
网络·计算机网络
盛世宏博智慧档案1 小时前
算力机房多协议融合:Modbus TCP 温湿度变送器与 SNMP 设备混合组网方案
网络·网络协议·tcp/ip·传感器·温湿度
严谨的麻辣烫2 小时前
静态代理 IP 的出口一致性如何验证?Python 请求检测与异常排查
开发语言·python·http·网络安全
知识分享小能手2 小时前
C学习教程,从入门到精通,C语言文件 — 完整知识点详解(14)
c语言·网络·学习
zhuhai_xigedian2 小时前
源网荷储一体化柜通信层:网络架构与协议矩阵设计
网络·矩阵·架构
shiyi.十一2 小时前
【CISP教材】第9知识域:计算环境安全
网络·安全·cisp
物联网软硬件开发-轨物科技2 小时前
【轨物方案】深度解读开关柜智能感知及一键顺控专家系统
大数据·运维·网络·人工智能·算法·机器人
小小、码农2 小时前
[特殊字符]【C++11】类的新功能全面解析:移动构造、移动赋值、default、delete、final 与 override
linux·开发语言·网络·c++
库玛西3 小时前
计算机网络第三章:数据链路层
服务器·网络·计算机网络·考研·算法·面试