Имеется WebApp в Azure. В нему подключены 85 доменов.
Задача — для каждого из подключенных доменов сгенерировать файлы настроек для NGINX, который будет проксировать запросы к этмоу WebApp.
Список подключенных доменов получется с помощью Azure CLI — azure webapp show.
Задача усложняется тем, что некоторые домены подключены к WebApp с www, а некоторые — без. Соответственно — в настройках NGINX надо определить направление переадресации с-www => без-www или наоборот.
Для этого — используется два файла шаблонов для NGINX.
Для доменов, которые подключены к WebApp напрямую, без www — устанавливается переадресация с www-имени на имя без него:
upstream jm_live_X_RAND {
server 65.***.***.88;
}
...
server {
server_name www.SERVER_NAME;
return 301 http://SERVER_NAME$request_uri;
}
server {
server_name SERVER_NAME;
...
}
И для тех доменов, которые подключены с www — переадресация наоборот:
...
server {
server_name SERVER_NAME;
return 301 http://www.SERVER_NAME$request_uri;
}
server {
server_name www.SERVER_NAME;
...
Сам скрипт:
#!/usr/bin/env bash
# include /etc/nginx/migrate.d/*.conf;
resource_group="Default-Web-WestEurope"
webapp_name="jm"
confdir="configs"
# non-www redirects to www
www_template="www_nginx_conf.tmpl"
# www redirects to non-www
n_w_template="n_w_nginx_conf.tmpl"
# for testing
# att=0
# max=20
is_www () {
local domain=$1
[[ $domain =~ "www" ]]
}
get_domains () {
domains=$(azure webapp show $resource_group $webapp_name | grep -A100 "Host Name" | grep "." | grep -v "-" | grep -v "Host Name" | grep -v "azurewebsites" | tac | sed "1,2d" | cut -d":" -f 2 | xargs)
echo $domains
}
remove_www () {
local domain=$1
is_www $domain && domain=$(sed 's/www.//' <<< $domain)
echo $domain
}
copy_template () {
local domain=$1
[[ ! -e $confdir/$domain.conf ]] && cp -v $template $confdir/$domain.conf || echo "$domain.conf already added, skip"
}
update_config () {
local domain=$1
local config=$2
local x_rand=$(shuf -i 1000-9000 -n 1)
sed -i 's/X_RAND/'"$x_rand"'/g' $config
sed -i 's/SERVER_NAME/'"$domain"'/g' $config
}
main () {
for domain in $(get_domains); do
# depending on how domain was added to the WebApp - with or without WWW
# select template to use
is_www $domain && local template=$www_template || local template=$n_w_template
# remove www
domain=$(remove_www $domain)
# copy template
copy_template $domain
# update configs
update_config $domain $confdir/$domain.conf
# for testing - create 4 config only
# ((att++)) && [[ $att == $max ]] && { echo "Max."; exit 0; }
done
}
main