Nginx不支持运行时动态管理Virtual Host,必须通过外部机制实现CRUD。主流方案有三类:脚本+模板(中小规模)、Ansible+GitOps(团队协作)、API化服务(大规模平台),均需配置校验、平滑reload与快照回滚。
Nginx 本身不支持运行时直接增删改查 Virtual Host(即 server 块),必须通过外部机制驱动配置变更与服务重载。在自动化运维系统中,实现站点的动态 CRUD,关键在于解耦配置生成、语法校验、平滑生效与状态回溯,而非手动编辑 conf 文件。
以下为生产可用的三类主流实现路径,按复杂度与适用场景递进:
适合几十个站点以内、无强一致性要求的环境,依赖 Shell/Python + Jinja2/Templates。
site-blog.yaml):domain: blog.example.comroot: /var/www/blogssl_enabled: truewww_redirect: true
/etc/nginx/conf.d/blog.example.com.conf
nginx -t 校验 → systemctl reload nginx
注意:server_name 必须格式合法(不能含空格、特殊字符),且需提前确保 DNS 解析就绪;建议加权限检查(如 chown -R nginx:nginx $root)
将所有站点定义纳入 Git 仓库,每次提交触发 CI 流水线自动部署。
sites/ 目录存放各站点变量(YAML/JSON)template 模块渲染 vhost.j2 模板,支持条件逻辑(如是否启用 HTTPS、是否跳转 www)notify: reload nginx,配合 handlers 确保 reload 仅在配置变更后执行ansible-pull 或 Webhook,实现“Git 提交即上线”优势在于幂等性、回滚快(git checkout <commit> && ansible-playbook)、权限与审核留痕
适用于 SaaS 平台、多租户环境或 DevOps 平台集成场景,需自建轻量控制面。
POST /vhosts → 创建新站点(校验域名唯一性、路径合法性)PUT /vhosts/{domain} → 修改 root、SSL 状态、重定向规则DELETE /vhosts/{domain} → 下线站点(保留日志与备份可选)/etc/nginx/sites-enabled/)nginx -t,成功则 mv 新配置并 nginx -s reload,失败则记录错误并告警此模式天然支持多集群分发(如推送至不同机房 Nginx 节点)、灰度发布(按标签匹配 target group)、操作审计日志
不复杂但容易忽略的是:所有方案都应内置 配置快照与自动回滚机制——每次 reload 前备份旧 conf,失败时一键还原,避免因单个站点配置错误导致全站不可用。