技术存在的终级意义,是为了解决问题。

分割Nginx配置文件的server段至独立文件

目的概述

对于 Nginx 的默认配置文件 nginx.conf ,一般是不建议直接在里面添加 server 段的。尤其是当你的服务器上有很多很多不同站点的时候,全部 server 都丢在同一个配置文件中,会导致后期管理越来越冗杂。

碰巧我手下就有那么几台服务器是这种情况,加起来一共小两千个站点,几乎是不可能手动来分割配置文件的。所以这篇文章的目的就是记录一下我的解决方案。

工具

  • notepad++
  • Linux shell

准备工作:使用Notepad++处理配置文件

打开要处理的配置文件(比如 nginx.conf),把其中的所有 server 段都 剪切 到一个新文件保存为 server.txt,然后保存旧的 nginx.conf

打开 server.txt,按 Ctrl+h 打开替换功能,在 查找模式 中勾选 正则表达式

首先去除配置文件中的所有注释行:

查找目标: `^\s*#.*$` 
替换为空,不填写任何内容,然后点击全部替换。

然后在每个完整的server段之间添加一行 % 作为分割线:

查找目标:^\s*}\s+server
替换为
}\r\n%\r\nserver

最后调整一下第一行和最后一行的缩进即可。

分割文件

直接展示脚本 nginx_conf_one_to_all.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#/bin/bash
#执行前确保 server.txt 文件只包含 server 段,且每个 server 段之间由独立的一行“%”分割
#执行命令为 bash nginx_conf_one_to_all.sh [file_name]

awk 'NR%1==0{ print > "file_"++i }' RS='%' $1
#以 % 为分割线,将配置文件分为多个单独文件,文件名为 file_*

count=`ls -l|grep "file_*"| wc -l`
#统计文件总个数,赋值给变量 count

while :
#每次循环把对应 file_* 重命名为 [server_name].conf
#例如包含域名 www.example.com.cn 的文件会重命名为 example.conf
do
name=`find file_$count |xargs grep "server_name"|awk -F. '{print $2}'`
mv file_$count $name.conf
let count-=1;
if [ $count == 0 ]
then
break;
fi
done

替换文件

备份旧的 nginx.conf 文件,然后用第一步中保存的 nginx.conf 替换,并确保添加了相应的 include 目录。

把第二步中生成的所有 *.conf 文件移动到上面的 include 目录中。

然后执行 ./sbin/nginx -t 测试 Nginx 的配置是否报错,如无报错则重启或者重新加载 Nginx 即可。

打赏猫粮!!!