1. 定义


./nginx-1.24.0/src/http/ngx_http_core_module.c
属于 ngx_http_core_module 模块

    { ngx_string("server"),
      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
      ngx_http_core_server,
      0,
      0,
      NULL },
在 Nginx 配置中,
server 是一个块级指令(block directive),
核心作用是 定义一个虚拟主机(Virtual Host)的完整配置单元,
实现单机多服务托管与请求精准路由


2. 指令类型

NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,

这是 ngx_command_t 结构体的 type 字段
用于精确描述 server 指令的作用域(context)、语法形式和参数要求


1. NGX_HTTP_MAIN_CONF

含义:
该指令只能出现在 HTTP 模块的“主配置上下文”中,即 http { } 块内部、server 块外部

Nginx 的 HTTP 配置体系分为三级上下文:

HTTP 主上下文(main)http { ... } 内部,但不在 serverlocation
→ 对应标志:NGX_HTTP_MAIN_CONF

Server 上下文(srv)server { ... } 内部
→ 对应标志:NGX_HTTP_SRV_CONF

Location 上下文(loc)location { ... } 内部
→ 对应标志:NGX_HTTP_LOC_CONF

因此,NGX_HTTP_MAIN_CONF 表示:

http {
    server { ... }   # ✅ 合法:在 http 块内(HTTP 主上下文)
}

而以下位置非法:

server { ... }       # ❌ 错误:在全局主上下文(非 HTTP 模块内)
http {
    server {
        server { ... }  # ❌ 错误:不能嵌套 server
    }
}
location / {
    server { ... }   # ❌ 错误:在 location 块内
}

为什么叫 “MAIN”?

  • 这里的 “MAIN” 不是 Nginx 全局主上下文(那是 NGX_MAIN_CONF),
  • 而是 HTTP 模块内部的“顶层”上下文,即 http { } 块内的顶层。

关键区别

  • NGX_MAIN_CONF:Nginx 全局主上下文(如 worker_processes
  • NGX_HTTP_MAIN_CONFHTTP 模块内部的主上下文(如 server, upstream, gzip

2. NGX_CONF_BLOCK

含义:
该指令必须带一个配置块(即后跟 { ... } 花括号)

server 是一个容器指令(block directive)
用于包含子指令(如 listen, server_name, location 等)。

语法必须是:

server {
    listen 80;
    server_name example.com;
    location / { ... }
}
  • Nginx 在解析到 server { 时,会:
    1. 调用回调函数 ngx_http_core_server
    2. 创建一个新的 server 级配置上下文
    3. 递归解析 {} 内的所有子指令

3. NGX_CONF_NOARGS

含义:
该指令不接受任何参数(除了后面的 {} 块)


  • server 指令名后必须直接跟 {,中间不能有任何 token。
  • 合法写法
    server {
        ...
    }
    
  • 非法写法
    server example.com { ... }  # ❌ 错误:多了参数 "example.com"
    server 80 { ... }           # ❌ 错误:多了参数 "80"
    server;                     # ❌ 错误:缺少 { } 块
    

4. 三者组合的完整语义

NGX_HTTP_MAIN_CONF | NGX_CONF_BLOCK | NGX_CONF_NOARGS

等价于向 Nginx 声明:

server 是一个不带任何参数的块指令,只能出现在 http { } 块内部(HTTP 模块的主上下文),其后必须紧跟一个 {} 配置块,用于定义一个虚拟主机(Virtual Host)的完整配置。


3. ngx_http_core_server

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐