nginx 的 include 指令是单机多实例部署中实现配置复用与解耦的关键,需将公共配置(如 proxy-params、security-headers 等)统一存于独立目录,按作用域正确引入,避免值覆盖,并每次修改后全局语法校验。

在单机多实例部署中,Nginx 的 include 指令是实现配置复用与解耦的关键手段。它让多个站点或服务实例共享同一套安全策略、日志格式、代理参数等公共组件,避免重复定义和维护不一致。
明确公共组件的存放位置
把可复用的配置片段统一放在独立目录(如 /etc/nginx/snippets/ 或 /www/server/nginx/conf/include/),确保路径为绝对路径,且所有实例配置都能稳定访问。
- 推荐目录结构示例:
/etc/nginx/snippets/proxy-params.conf(反向代理通用 header)/etc/nginx/snippets/security-headers.conf(CSP、HSTS、X-Frame-Options)/etc/nginx/snippets/log-format.conf(自定义 access_log 格式)/etc/nginx/snippets/ssl-common.conf(TLS 版本、密钥交换、OCSP stapling 等) - 每个文件只包含该类功能的指令,不嵌套 server 或 location 块,保持上下文兼容性
在各实例配置中按需引入
每个站点或服务的 server 块内,用 include 显式加载所需公共片段,顺序很重要——例如 proxy_params 应在 location 内引入,而 log_format 必须在 http 块顶层引入。
- 正确写法(在 server 块中):
location / {<br> include snippets/proxy-params.conf;<br> proxy_pass http://backend;<br>} - 错误写法:
在location中include snippets/log-format.conf—— 因为log_format只能在http级生效,会报错
避免冲突与覆盖
多个实例共用同一份公共配置时,要防止隐式覆盖。比如 SSL 证书路径若写死在 ssl-common.conf,就无法适配不同实例;应改用变量占位或由实例层覆盖。
- 推荐做法:公共文件中只定义通用行为,不写具体值
ssl_protocols TLSv1.2 TLSv1.3;<br>ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:...;
- 具体值(如
ssl_certificate)保留在各server块中,由实例自行指定 - 若必须复用证书路径,可用
env+set配合,但注意 Nginx 不支持运行时变量展开,仅限启动前环境注入
验证与上线流程不可跳过
每次修改公共片段后,必须对所有依赖它的实例配置做全局语法检查,否则一个 snippets/ 文件里的分号遗漏,会导致整个 Nginx 启动失败。
- 执行:
nginx -t—— 它会递归校验所有被 include 的文件 - 建议搭配脚本自动扫描:
find /etc/nginx/snippets/ -name "*.conf" -exec nginx -t -c /dev/stdin {} \;(配合临时加载测试) - 生产环境建议加一层轻量 CI:提交前 lint 公共配置,禁止未验证的变更合并











