我有一个 Debian Web 服务器,其主要/var/www/mymainwebsite
服务在 URL 上http(s)://mydomain.com
,并且许多独立的 Web 项目也在/var/www
( /var/www/mywebsite1
、/var/www/website2
等) 中,必须在 URL http(s)://mydomain.com/mywebsite1
、http(s)://mydomain.com/mywebsite2
等上提供服务。
因此,mydomain.com 的 vhost 上的服务器指令包含许多针对子网站的指令,其中的指令location
几乎相同(因为nginx 文档表示,当 location 与别名指令值的最后部分匹配时,最好使用 root 指令而不是别名指令)。其中一些包含一些 PHP 和重写规则,但大多数不包含。root
看起来像这样:
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;
}
由于大多数指令都是相似的,有什么方法可以优化和/或避免在此虚拟主机中重复?
避免无休止地重复相同指令的典型方法是将它们存储在单独的文件中,并使用指令
include
在需要时加载它们,例如您已经使用的指令include snippets/fastcgi-php.conf;
此外
location
,还接受正则表达式来匹配多个精确字符串,指令 也是如此rewrite
,当每个或多个 /website1-99 位置遵循相同的模式时,可以将其放入单个部分中。另一方面,为了简单而不是让事情过于复杂,有很多话要说。我宁愿有 20 个部分,而不是三个不立即明显的正则表达式来匹配需要一个配置的站点 1,9,13,第二个正则表达式用于需要有一个配置的站点 2,3,4,10,11,15,19放在另一个上,其余的需要放在第三个上。
看来您正在尝试使用 Nginx 的配置来解决由您自己的目录结构引起的问题。
如果主站点直接位于 上
/var/www
,则无需更改root
子目录中所有站点的指令,因为所有站点的指令都已相同。如果您坚持拥有
/var/www/main
,您可以将根目录和单独的根目录重定向到该站点。经过更多研究,我发现多个 URL 可以使用独特的正则表达式位置指令,如下所示。
另外,感谢Esa Jokinen的回答,我们可以使用根目录作为 root 指令,并将主网站目录放在 location / 指令中。
总而言之,以下内容看起来更加简短和可读,同时仍然在同一个文件中,避免了更多
include
: