nginx 不支持自动扫描子目录加载配置,需通过 include 指令显式引入子目录下的 .conf 文件;推荐使用 sites-available/sites-enabled 结构,配合软链接和主配置中的 include /etc/nginx/sites-enabled/* 实现清晰管理。

Nginx 本身不支持“子目录”作为配置加载单位,但可以通过配置文件组织方式 + include 指令,在配置目录中用子目录逻辑分离不同虚拟主机的配置,实现清晰、可维护的管理。
关键不是 Nginx 自动扫描子目录,而是你主动用 include 引入子目录下的 .conf 文件。
✅ 推荐结构:用 sites-available 和 sites-enabled 管理
这是主流发行版(如 Ubuntu/Debian)的标准做法,也适用于源码编译或 CentOS/RHEL(稍作适配即可):
/etc/nginx/
├── nginx.conf ← 主配置,含全局设置和 include 指令
├── sites-available/ ← 存放所有虚拟主机配置(不生效)
│ ├── site1.example.com.conf
│ ├── site2.test.conf
│ └── default.conf ← 可选:默认站点模板
└── sites-enabled/ ← 仅存放软链接,指向 sites-available 中启用的配置
├── site1.example.com → ../sites-available/site1.example.com.conf
└── site2.test → ../sites-available/site2.test.conf
⚠️ 注意:
sites-enabled是软链接目录,不是子目录“自动加载”。Nginx 不会递归读取它里面的子目录——它只加载你显式include的文件路径。
✅ 在 nginx.conf 中启用该结构
确保主配置文件 /etc/nginx/nginx.conf 的 http { ... } 块内有这一行(通常已存在):
include /etc/nginx/sites-enabled/*;
如果没有,手动添加在 http 块末尾(} 之前)即可。
这样 Nginx 启动或重载时,就会加载 sites-enabled/ 下所有 .conf 文件。
✅ 实际操作步骤(以新增一个站点为例)
-
创建配置文件
sudo nano /etc/nginx/sites-available/myapp.local.conf
写入:
server { listen 80; server_name myapp.local; root /var/www/myapp; index index.html; location / { try_files $uri $uri/ =404; } } -
启用配置(创建软链接)
sudo ln -sf /etc/nginx/sites-available/myapp.local.conf /etc/nginx/sites-enabled/myapp.local.conf
-
检查语法 & 重载
sudo nginx -t # 确保无语法错误 sudo systemctl reload nginx
-
(可选)本地测试:修改
/etc/hosts127.0.0.1 myapp.local
✅ 进阶:用子目录进一步分类(如按客户/环境分组)
Nginx 不原生支持 include /etc/nginx/sites-enabled/*/,但你可以:
- 在
sites-available/下建子目录(如sites-available/customers/a/,sites-available/staging/), - 然后在
sites-enabled/中为每个需要启用的.conf文件单独建软链接, - 或者——更灵活的做法:统一
include一个汇总文件
例如,在 /etc/nginx/sites-enabled/ 下新建 all.conf:
include /etc/nginx/sites-available/customers/a/*.conf; include /etc/nginx/sites-available/staging/*.conf; include /etc/nginx/sites-available/production/*.conf;
再在 nginx.conf 中改为:
include /etc/nginx/sites-enabled/all.conf;
这样就实现了“子目录逻辑分离”,且完全由你控制加载范围。
❌ 常见误区提醒
-
include /etc/nginx/sites-enabled/**/*❌
Nginx 不支持 glob 通配符嵌套(**),只支持单层*,且不递归。 - 把配置文件放在
conf.d/下的子目录里却没include❌conf.d/默认只include conf.d/*.conf,不会读conf.d/vhosts/site1.conf。 - 忘记软链接权限或路径错误导致
nginx -t失败 ✅
用ls -l /etc/nginx/sites-enabled/确认链接目标真实存在且可读。
不复杂但容易忽略。











