nginx批量生成virtual host应通过脚本驱动模板动态注入变量,结合语法检查、权限设置与安全重载;超百站点宜用map泛域名路由;大规模场景需升级为gitops配置即代码模式。

用 Shell 脚本 + 配置模板动态生成
这是最直接、依赖最少的方式:准备一个通用 server 模板(如 template.conf),用变量占位,再用 sed 或 envsubst 替换域名、根目录、日志路径等。
- 模板示例(
/opt/nginx-templates/site.conf.tpl):server {<br> listen 80;<br> server_name ${DOMAIN};<br> root ${ROOT_DIR};<br> access_log /var/log/nginx/${DOMAIN}.access.log;<br> error_log /var/log/nginx/${DOMAIN}.error.log;<br> location / { try_files $uri $uri/ =404; }<br>} - 脚本调用方式:
DOMAIN=site123.example.com ROOT_DIR=/var/www/site123 envsubst /etc/nginx/conf.d/site123.conf - 批量执行时,可从 CSV 或 JSON 文件读取站点列表,循环生成,避免硬编码
统一入口 + map 指令实现泛域名自动路由
当站点数超百且大量为子域名(如 userA.example.com、storeB.example.com),手动建文件不可持续。改用“一个 server 块 + map 动态解析”更高效。
- 主配置中启用泛匹配:
map $host $site_root {<br> hostnames;<br> default /var/www/default;<br> ~^(?<sub>.+)\.example\.com$ /var/www/sites/$sub;<br>}</sub> - 共用 server 块(放在
/etc/nginx/conf.d/_wildcard.conf):server {<br> listen 80;<br> server_name _;<br> root $site_root;<br> index index.html;<br> try_files $uri $uri/ =404;<br>} - 新增站点只需创建对应目录(如
/var/www/sites/userA),无需改 Nginx 配置,reload 也不需要
生成后必须做的三件事
脚本跑完不等于站点就通了,漏掉任一环节都可能导致 502、404 或服务中断。
-
语法检查:每次生成后执行
nginx -t,失败则中止后续操作并报错 -
权限与归属:生成的 conf 文件需属主
root:root,权限644;网站目录需属主www-data:www-data(Ubuntu/Debian)或nginx:nginx(CentOS/RHEL) -
重载策略:用
systemctl reload nginx替代 restart;若并发生成多个配置,建议加锁或串行 reload,避免瞬时抖动
进阶:对接配置中心或 GitOps 流水线
超过 500 站点或需灰度发布时,脚本应升级为“配置即代码”模式:
- 把所有站点定义写成 YAML(如
sites.yaml),用 Python 脚本解析并渲染 Nginx 配置 - 将配置提交至 Git 仓库,配合 CI 工具(如 GitHub Actions)自动校验 + 部署到目标服务器
- 生产环境建议禁用用户直写
/etc/nginx/conf.d/,改由配置中心下发,脚本只负责本地渲染和预检











