Ошибка с IP и Nginx в качестве обратного прокси

Я настроил свой Nginx как простой обратный прокси.

Я просто использую базовые настройки

location / {
    proxy_pass foo.dnsalias.net;
    proxy_pass_header Set-Cookie;
    proxy_pass_header P3P;
}

Проблема заключается в том, что через некоторое время (несколько дней) сайт за nginx становится недоступным. Indead nginx пытается вызвать плохой ip (сайт за nginx находится у меня дома за моей коробкой, и я использую dyn-dns, потому что мой ip не исправлен). Этот dyn-dns всегда действителен (я могу назвать свой сайт напрямую), но по неясной причине Nginx застрял с этим.

Итак, как сказал, nginx просто дал мне 504 Gateway Time-out через некоторое время. Похоже, ошибка пришла, когда мой ip изменился дома. Вот пример журнала ошибок:

[error] ... upstream timed out (110: Connection timed out) while connecting to upstream, client: my.current.ip, server: myreverse.server.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://my.old
.home.ip", host: "myreverse.server.com"

Знаете ли вы, почему nginx использует ip вместо DN?

Ответ 1

Если значение proxy_pass не содержит переменных, nginx будет разрешать имена доменов для IP-адресов при загрузке конфигурации и кешировать их до перезагрузки/перезагрузки. Это вполне понятно с точки зрения производительности.

Но в случае изменения динамической записи DNS это может быть нежелательно. Таким образом, два варианта доступны в зависимости от лицензии, которой вы владеете или нет.

Коммерческая версия (Nginx +)

В этом случае используйте восходящий блок и укажите, какое доменное имя необходимо разрешить периодически, используя определенный преобразователь. Записи TTL можно переопределить с помощью параметра valid=time. Параметр resolve директивы server заставит DN периодически разрешать.

http {    

    resolver X.X.X.X valid=5s;

    upstream dynamic {
        server foo.dnsalias.net resolve;
    }

    server {

        server_name www.example.com;

        location / {
            proxy_pass http://dynamic;
            ...
        }

    }

}

Эта функция была добавлена ​​в Nginx + 1.5.12.

Версия сообщества (Nginx)

В этом случае вам также понадобится настраиваемый преобразователь, как в предыдущем решении. Но для решения проблемы недоступного восходящего решения вам необходимо использовать переменную в вашей директиве proxy_pass. Таким образом, nginx также будет использовать резольвер, соблюдая время кэширования, указанное параметром valid. Например, имя домена можно использовать как переменную:

http {  

    resolver X.X.X.X valid=5s;

    server {

        server_name www.example.com;
        set $dn "foo.dnsalias.net"; 

        location / {
            proxy_pass http://$dn;
            ...
        }

    }

}

Затем вам, вероятно, потребуется добавить директиву proxy_redirect для обработки перенаправления.

Ответ 2

Возможно, проверьте это http://forum.nginx.org/read.php?2,215830,215832#msg-215832

resolver 127.0.0.1;
set $backend "foo.example.com";
proxy_pass http://$backend;

In such setup ip address of "foo.example.com" will be looked up
dynamically and result will be cached for 5 minutes.