В последнее время в моей работе возникла необходимость в этом аспекте: upstream полностью динамический, задаётся клиентом, в начале есть ошибки, и наконец DNS-сервис задаётся через резолвер, конкретный процесс такой.
1. Начинайте наступать на яму
Конфигурация nginx следующая:
Когда я отправляю такой запрос:
Была зафиксирована следующая ошибка:
access.log: 127.0.0.1 - - [14/Sep/2017:23:37:10 +0800] "GET / HTTP/1.1" 502 179 "-" "curl/7.29.0"
error.log: 2017/09/14 23:38:31 [ошибка] 25307#25307: *48 не определен резолвер для разрешенияwww.baidu.com, клиент: 127.0.0.1, сервер: localhost, запрос: "GET / HTTP/1.1", хост: "127.0.0.1:8001" Очевидно, что эта проблема гласит, что отсутствие указания резолвера вызывает кастомные upstreamwww.baidu.com.
2. Используйте резолвер для определения разрешения доменных имён
Модифицированная конфигурация nginx выглядит следующим образом:
Теперь обычные запросы — 200:
req: curl "127.0.0.1:8001/" -H "upstream-host:www.baidu.com" -voa curl "127.0.0.1:8001/" -H "upstream-host:www.qq.com" -voa
access.log: 127.0.0.1 - - [14/Sep/2017:23:44:01 +0800] "GET / HTTP/1.1" 200 2381 "-" "curl/7.29.0" 127.0.0.1 - - [14/Sep/2017:23:44:07 +0800] "GET / HTTP/1.1" 200 244182 "-" "curl/7.29.0" 3. Инструкции по резольверу
Синтаксис резольвера следующий:
Syntax: resolver address ... [valid=time] [ipv6=on|off];
Default: —
Context: http, server, location Вы можете настроить несколько DNS-сервисов, nginx будет использовать опрос для доступа к DNS-сервисам, nginx кэширует результаты разрешения доменных именей DNS, время кэша задаётся valid, а IPv6 используется для отображения IPv6 включённым или выключенным.
resolver_timeout используется для указания тайм-аута для разрешения DNS.
|