Server块必须直接定义在http块内,不可嵌套于其他server块中;每个server代表一个虚拟主机,内部可嵌套location、if、limit_conn等指令,但多server间为并列关系。

Server 块不能嵌套在另一个 server 块里,它只能直接定义在 http 块内部,是 http 块的同级子块,不是嵌套关系。
准确来说:
- http 块可以包含多个 server 块;
- 每个 server 块代表一个独立的虚拟主机(如不同域名、端口或 IP 的站点);
- server 块本身不支持被其他 server 块包裹,也不允许层级嵌套。
但 server 块内部可以合法嵌套以下内容:
- location 块:用于匹配 URL 路径,处理具体请求(如 /api、/static);
- if 指令(需谨慎使用,不推荐在 location 外滥用);
- limit_conn、limit_req 等限流指令;
- include 指令:引入外部配置片段(如 include conf.d/*.conf);
- 其他支持出现在 server 上下文(Context)中的指令,比如 root、index、error_page、rewrite 等。
常见误区提醒:
- 把多个 server 写成父子结构(如在 server 里再写一个 server)会导致 nginx -t 校验失败,报错 “invalid number of arguments in "server" directive”;
- 若需复用配置,应通过 include 引入公共片段,而不是靠嵌套 server;
- 同一端口+同一 IP 下,多个 server 块靠 server_name 区分,Nginx 会根据 Host 请求头自动路由。
举个合规结构示例:
http {
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name example.com;
root /var/www/example;
location / {
index index.html;
}
location /api/ {
proxy_pass http://backend;
}
}
server {
listen 80;
server_name test.com;
root /var/www/test;
location / {
try_files $uri $uri/ =404;
}
}
}本质上,server 是并列单元,不是容器。它的“复用性”靠 include + 模块化拆分实现,而非嵌套。


















