Назад | Перейти на главную страницу

установить server_name в Nginx на основе глобальной переменной

У меня есть сервер с nginx, на котором работает сайт, который в ближайшем будущем должен быть заменен новым.

Чтобы быть готовым к этому дню - я готовлю все конфигурации, необходимые для запуска нового сайта.

Я бы хотел иметь глобальную переменную в главном nginx.conf которые содержат строку (например, 'old' или 'new' представляющий сайт, который должен быть активен в основном домене example.com пока другой сайт включен other.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?

Большое спасибо!

Просто сделайте сценарий. Конечно, элегантное решение, встроенное в 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

... Возможно, вам придется избегать этих точек с запятой .. Не уверен ...