Имеется upstream в NGINX-е:
...
upstream jm-website-test {
server jm-website-test.trafficmanager.net;
}
...
Проблема заключается в имени — jm-website-test.trafficmanager.net, значение которого меняется во время деплоя в зависимости от активного ендпоинта на Azure Traffic Manager:
[simterm]
$ dig +short jm-website-test.trafficmanager.net google.com. 172.217.20.174
[/simterm]
Сейчас оно является алиасом на условную blue-ноду — google.com (на деле что-то вроде preview-blue.jm-website-sw-staging.domain.tld), а во время деплоя — blue-ендпоинт Traffic Manager-а будет отключен, а green — включен, и jm-website-test.trafficmanager.net будет указывать на green-ноду — yahoo.com. Такой себе blue/green деплой, только в Azure.
upstream передаётся в proxy_pass в виде имени upstream:
...
location / {
...
proxy_pass http://jm-website-test$request_uri;
}
...
При таком подходе — NGINX выполняет разрешение имени в server апстрима только при рестарте или перезагрзуке конфигурации, и далее использует только его, т.е. трафик будет направляться на blue-ноду, пока NIGNX не будет перезапущен с restart или reload.
Сейчас — NGINX отдаёт содержимое blue-ноды:
[simterm]
# curl jm-website-test.domain.tld ... <title>Error 404 (Not Found)!!1</title> <style> ... </style> <a href=//www.google.com/><span id=logo aria-label=Google></span></a> <p><b>404.</b> <ins>That’s an error.</ins>
[/simterm]
Меняем ендпоинты на Traffic Manager, ждём пару минут — проверяем:
[simterm]
# dig +short jm-website-test.trafficmanager.net yahoo.com.
[/simterm]
DNS уже обновились, а NGINX продолжает отдавать старый контент:
[simterm]
# curl jm-website-test.domain.tld ... <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
[/simterm]
Для того, что бы NGINX проверял значение по заданному TTL — задаём NGINX явное указание на resolver и через valid указываем TTL равным 10 секундам:
server {
resolver 8.8.8.8 valid=10s;
...
А имя jm-website-test.trafficmanager.net — вынесем в переменную, которую будем передавать в proxy_pass:
...
# proxy_pass http://jm-website-test$request_uri;
set $jm_test_tm jm-website-test.trafficmanager.net;
proxy_pass http://$jm_test_tm;
}
...
Сохраняем, проверяем, перезагружаем:
[simterm]
root@jgr-gw:~# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful root@jgr-gw:~# service nginx reload * Reloading nginx configuration nginx
[/simterm]
Проверяем.
С активной blue-нодой (google):
[simterm]
# curl -L jm-website-test.domain.tld ... <a href=//www.google.com/><span id=logo aria-label=Google></span></a> <p><b>404.</b> <ins>That’s an error.</ins>
[/simterm]
OK, Google.
Через Portal переключаем ендпоинт Traffic Manager на «green-ноду» — yahoo:
Ждём пару минут, проверяем:
[simterm]
# dig +short jm-website-test.trafficmanager.net yahoo.com.
[/simterm]
[simterm]
# curl -L jm-website-test.domain.tld
... body {
background: #fafafc url(https://s.yimg.com/nn/img/sad-panda-201402200631.png) 50% 50%;
...
[/simterm]
Готово — ответ от Yahoo — нашей «green-ноды».
Больше деталей — в блоге NGINX.
