我有一个 Debian 网络服务器,其主要/var/www/mymainwebsite
在 URL 上提供服务http(s)://mydomain.com
,并且还有许多独立的网络项目/var/www
(/var/www/mywebsite1
、/var/www/website2
等),这些项目必须在 URL http(s)://mydomain.com/mywebsite1
、http(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;
}