Nginx的include指令用于配置模块化,支持在http、server、location等上下文中按路径或通配符引入外部配置文件,提升可读性与复用性;需注意语法正确性、作用域限制、避免循环引用,并可用nginx -T调试。

Nginx 的 include 指令是实现配置模块化的核心手段,它允许你把大而复杂的配置拆分成多个小文件,按功能或环境归类管理,提升可读性、复用性和协作效率。
include 的基本用法和作用范围
include 不是预处理器指令,而是 Nginx 在加载配置阶段实时读取并内联合并的机制。它可以在 http、server、location、upstream 等任意上下文中使用,但不能出现在条件判断(如 if)内部。
- 支持通配符:例如
include /etc/nginx/conf.d/*.conf;会按字母序加载所有 .conf 文件 - 路径可以是绝对路径,也可以是相对于
nginx.conf所在目录的相对路径(推荐用绝对路径避免歧义) - 被 include 的文件内容会被原样插入到当前上下文,等效于直接写在那里
典型模块化目录结构设计
一个清晰的分层结构能显著降低维护成本。常见实践如下:
-
/etc/nginx/nginx.conf:主配置,只保留全局设置(user、worker_processes、events)和顶层http块,末尾用include引入模块 -
/etc/nginx/conf.d/:存放各虚拟主机配置(如blog.conf、api.conf),每个文件定义一个server块 -
/etc/nginx/sites-enabled/+sites-available/:类似 Debian/Ubuntu 风格,用软链接启用或禁用站点 -
/etc/nginx/snippets/:存放可复用的片段,比如 SSL 配置(ssl-params.conf)、通用 header(security-headers.conf)、反向代理模板(proxy-common.conf)
实际配置示例:复用 SSL 和代理逻辑
比如你在多个 server 中都需要标准 TLS 设置和反向代理行为,可以这样组织:
先写一个通用片段:/etc/nginx/snippets/ssl-common.conf
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m;
再写一个代理基础配置:/etc/nginx/snippets/proxy-backend.conf
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off;
然后在某个站点配置中引用:/etc/nginx/conf.d/app.conf
server {
listen 443 ssl http2;
server_name app.example.com;
include /etc/nginx/snippets/ssl-common.conf;
ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
location / {
include /etc/nginx/snippets/proxy-backend.conf;
proxy_pass http://127.0.0.1:8000;
}
}
注意事项与排错技巧
- 确保被 include 的文件语法正确:Nginx 不会跳过错误文件,任一 included 文件有语法错误都会导致
nginx -t失败 - 注意作用域:在
location内 include 的内容必须是该上下文允许的指令(如不能在里面写server_name) - 避免循环引用:Nginx 不检测 include 循环,但会导致不可预期的行为甚至启动失败
- 调试时可用
nginx -T(大写 T)查看最终展开后的完整配置,确认 include 是否生效、顺序是否符合预期 - 权限问题:Nginx 主进程需有读取所有 included 文件的权限,尤其注意 SELinux 或 AppArmor 限制


















