根据全局变量在 Nginx 中设置 server_name

根据全局变量在 Nginx 中设置 server_name

我有一台装有 nginx 的服务器,它运行着一个生产网站,不久的将来它应该会被一个新网站取代。

为了迎接那一天的到来,我正在准备运行新网站所需的所有配置。

我想要的是一个在主域中nginx.conf保存字符串的全局变量(例如'old'或表示当另一个站点处于活动状态时'new'应该在主域上处于活动状态的站点)。example.comother.example.com

我试过:

nginx.conf

http{
    ...
    set $site_in_production 'new';
    ...
    include /etc/nginx/conf.c/*.conf;
}

/etc/nginx/conf.d/example.com.conf

server{
    ...
    if($site_in_production='new'){
         server_name other.example.com;
    } else {
         server_name example.com www.example.com;
    }
    ...
}

/etc/nginx/conf.d/new.example.com.conf

server{
    ...
    if($site_in_production='new'){
         server_name example.com www.example.com;
    } else {
         server_name other.example.com;
    }
    ...
}

但是,运行 configtest 时出现此错误:

 nginx: [emerg] "set" directive is not allowed here in /etc/nginx/nginx.conf:XX

所以我猜测该set指令不允许出现在server块之外

有没有办法通过所有 nginx 配置文件中的单个变量实现此功能?

非常感谢!

答案1

只需编写一个脚本。当然,内置于 nginx 中的优雅解决方案会很好……但我们不要忘记 *nix 为我们提供的工具:

#!/bin/bash
for i in /etc/nginx/conf.d/*;
do
    sed -i 's/server_name example.com www.example.com;/server_name other.example.com;/g' "$i";
done

...您可能必须逃避这些分号..不确定...

相关内容