省略 nginx 配置中针对同一域中的网站子文件夹的重复配置

省略 nginx 配置中针对同一域中的网站子文件夹的重复配置

我有一个 Debian 网络服务器,其主要/var/www/mymainwebsite在 URL 上提供服务http(s)://mydomain.com,并且还有许多独立的网络项目/var/www/var/www/mywebsite1/var/www/website2等),这些项目必须在 URL http(s)://mydomain.com/mywebsite1http(s)://mydomain.com/mywebsite2等上提供服务。

因此,mydomain.com 的虚拟主机上的服务器指令包含许多location针对子网站的指令,其功能几乎相同root其中包含几乎相同的指令(因为nginx 文档说,当位置与别名指令值的最后一部分匹配时,最好使用 root 指令而不是别名指令)。其中一些包含一些PHP和重写规则,但大多数没有。

它看起来像这样:

server {

    server_name mydomain.com;
    listen 443 quic;
    listen 443 ssl;

    root /var/www/mymainwebsite;

    index index.html index.htm index.php;

    try_files $uri $uri/ =404;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }

    location /mywebsite1 {
        root /var/www/;
    }

    location /mywebsite2 {
        root /var/www/;
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        }
        rewrite ^/mywebsite2/(.*)\.html$        /mywebsite2/index.php?hash=$1 last;
    }

    location /mywebsite3 {
        root /var/www/;
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        }
        rewrite ^/mywebsite3/(.*)\.html$        /mywebsite3/index.php?id=$1 last;
    }

    location /mywebsite4 {
        root /var/www/;
    }

    ...

    location /mywebsite19 {
        root /var/www/;
    }

    error_log /var/www/mydomain.log warn;
}

由于大多数指令都很相似,有没有什么方法可以优化和/或避免在这个虚拟主机中重复?

答案1

避免无休止重复相同指令的典型方法是将它们存储在单独的文件中,并使用include指令在需要时加载它们,例如你已经在使用的include snippets/fastcgi-php.conf;

此外location 还接受正则表达式来匹配多个精确字符串,就像rewrite指令,当每个或多个 /website1-99 位置遵循相同模式时,可以将其合并为一个部分。

另一方面,为了简单起见,不要让事情过于复杂,有很多话要说。我宁愿有 20 个部分,而不是三个不明显的正则表达式来匹配需要有一个配置的站点 1、9、13,第二个正则表达式用于需要在另一个配置上的站点 2、3、4、10、11、15、19,其余的则需要第三个配置。

答案2

看起来您正在尝试使用 Nginx 的配置来解决由您自己的目录结构引起的问题。

  • 如果主站点直接在 上/var/www,则不需要更改root子目录中所有站点的指令,因为它对于所有站点来说已经是相同的。

  • 如果您坚持要/var/www/main,您可以让根目录和单独的根目录重定向到该站点。

    server {
        root /var/www;
    
        location = / {
            return 301 https://example.com/main/
        }
    }
    

答案3

经过进一步研究,我发现几个 URL 可以使用独特的正则表达式位置指令,如下所示。

另外,感谢艾萨·约基宁的回答是,可以使用根目录作为 root 指令,并将主网站目录放在 location/ 指令中。

总而言之,下面的内容看起来更简短、更易读,同时仍然在同一个文件中,避免了更多include

server {

    server_name mydomain.com;
    listen 443 quic;
    listen 443 ssl;

    root /var/www;

    index index.html index.htm index.php;

    try_files $uri $uri/ =404;

    location ~ ^/(mywebsite1|mywebsite2|...|mywebsite19) {
    }

    location ~ ^/(mywebsite3|mywebsite4|...) {
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        }
       rewrite ^/(.*)\.html$        /index.php?hash=$1 last;
    }

    location / {
        root /home/www/mymainwebsite;
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        }
    }

    error_log /var/www/mydomain.log warn;
}

相关内容