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

Настройка модуля геолокации nginx с использованием базы данных гео?

Я установил nginx в качестве обратного прокси для пары backend / upstream серверов apache.

Используя База данных GeoLite из MaxMind я пытаюсь выполнить запросы балансировки нагрузки между двумя серверами в зависимости от кода страны клиента.

Конфигурация Nginx:

geo $geo {
        default default;
        include geo.conf;
    }
    upstream default.backend {
        server 192.168.0.1:8080; #Server A
        server 192.168.0.2:8080; #Server B
    }
    upstream DE.backend {
        server 192.168.0.1:8080; #Server A
    }
    upstream US.backend {
        server 192.168.0.2:8080; #Server B
    }
server {
        listen 80;
        server_name myserver.com;
        location / {
            proxy_pass http://$geo.backend;
            proxy_set_header        Host            $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }

Поэтому я пытаюсь отправить любых клиентов из Германии на сервер A и клиентов из США на сервер B, а также любых других клиентов, не соответствующих кодам стран Германии или США, для балансировки нагрузки между серверами A и B.

Однако, поскольку geo.conf содержит коды стран для многих (всех) других стран, эти значения устанавливаются для переменной $geo, в отличие от 'default' стоимость.

В моей текущей конфигурации это вызывает ошибку «502 Bad Gateway» со всеми запросами, не относящимися к Германии или США.

Журнал ошибок Nginx:

2013/10/11 08:18:50 [error] 25017#0: *1 no resolver defined to resolve NL.backend, client: 85.17.131.209, server: myserver.com, request: "GET / HTTP/1.1", host: "myserver.com"

Журнал доступа Nginx:

85.17.131.209 - - [11/Oct/2013:08:18:50 -0700] "GET / HTTP/1.1" 502 574 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31" "-"

Как мне настроить nginx.conf интерпретировать любое значение кода страны IP из geo.conf это не Германия или США, как default, и сбалансируйте его в соответствии с upstream default.backend?

default указано внутри geo указывает только значение по умолчанию для IP-адресов, которых вообще нет в базе данных. Так $geo всегда будет иметь коды стран для всего, что присутствует в базе данных. Так default здесь ничего не делает для вас.

Чтобы справиться с этим, используйте map к тому же.

map $geo $backend {
    default default;
    US US;
    DE DE;
}