好吧,这个标题我可能有点标题党了( 手动狗头… ),但是在我多次接触 Nginx 配置环境的时候发现我公司有很多网站,然后在本地配置 Nginx 的时候就需要很多conf 配置文件?于是在一次去上班的路上我就在想 nginx 应该能用正则匹配去匹配一个统一规则的本地调试环境域名然后取到其中的关键域拼接文件路径达到以后只需要一个配置文件就好了?本地需要添加网站也不需要去麻烦的添加一个新的 conf 文件也不要麻烦的重新启动 Nginx 了,只需要拉取代码按照本地调试网站的匹配规则改动一行 host 文件即可?( 对新手和纯前端工程师是绝对友好的,同时也可以减少部分配置时间和很多乱七八糟的文件以及奇怪的 Bug )讲了这么多,估计很多小伙伴都已经看晕了,好了我们下面就实际看看这样做的好处吧…

首先我们以前在本地搭建一个后端环境是不是,先用 Git 拉取代码至 /data/www/ 目录,然后要添加一个 Nginx 配置,然后重启 Nginx ,再配置 Hosts

好了,我们首先看看上面这 3 步对于没接触过 Nginx 的小伙伴来说配置 Nginx 这一步无疑是最麻烦的,好的我今天提出这个优化就是想直接将中间这一步给优化掉,当然我也只是初步接触,所以我下面说的都是基于我现在已有的技术上来改进,我自己都能找到几处不是很好的点,当然欢迎小伙伴们帮助我改进这个方案

我们先来看看现在的配置文件

# 配置文件 1
server
{
    listen 80;
    server_name l.demo1.com;
    root /data/www/demo1.com/public;
    index index.php;
    include enable-php.conf;
    error_log  /home/wwwlogs/demo1_error.log  crit;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}

# 配置文件 2
server
{
    listen 80;
    server_name l.demo2.com;
    root /data/www/demo2.com/public;
    index index.php;
    include enable-php.conf;
    error_log  /home/wwwlogs/demo2_error.log  crit;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}

# 配置文件 ...x
server
{
    listen 80;
    server_name l.demoX.com;
    root /data/www/demoX.com/public;
    index index.php;
    include enable-php.conf;
    error_log  /home/wwwlogs/demoX_error.log  crit;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}

上面配置了几个网站,l.demo1.com,l.demo2.com,...,l.demoX.com,

我们仔细看看其实大部分都是重复的( 我们项目大部分是 laravel 项目,所以其实入口路径也都是 Public ,如果是其他项目入口路径不同的话就不太好实现这个了… ),也就是说其实大部分都是 “ 冗余 ”的…

如果我们通过正则表达式去匹配取到这个域名,如:l.demo1.com 中的 demo1.com 将其拼接文件路径 /data/www/demo1.com/public ,以及 log 文件名 /home/wwwlogs/demo1_error.log 这样我们直接一个配置文件就可以匹配 l.demo2.com 甚至更多网站,那我们该怎么实现呢?

server
{
    listen 80;
    server_name  ~^(l\.)?(.+)$;
    set $files_root "/data/www/$2/public";
    root $files_root;

    index index.php;
    include enable-php.conf;
    error_log  "/home/wwwlogs/web_error.log"  crit;


    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}

其实也就是利用 Nginx 支持正则表达式来匹配 ~^(l.)?(.+)$ 匹配 l.dmeo.com 相关的域名并取出 demo.com 赋值到 $2 变量

其实还可以 A 解析二级域名 l.demo.com 至 127.0.0.1 这样我们就连 Host 都可以不用配置了,建议只使用在本地环境,我这个是站在一个前端的角度去优化这个东西的,所以说可能还有很多问题我并没有看到欢迎各位小伙伴指出