配置指令-server
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 { ... } 内部,但不在 server 或 location 中
→ 对应标志: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_CONF:HTTP 模块内部的主上下文(如server,upstream,gzip)
2. NGX_CONF_BLOCK
含义:
该指令必须带一个配置块(即后跟 { ... } 花括号)。
server 是一个容器指令(block directive),
用于包含子指令(如 listen, server_name, location 等)。
语法必须是:
server {
listen 80;
server_name example.com;
location / { ... }
}
- Nginx 在解析到
server {时,会:- 调用回调函数
ngx_http_core_server; - 创建一个新的 server 级配置上下文;
- 递归解析
{}内的所有子指令。
- 调用回调函数
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
更多推荐

所有评论(0)