Конфигурация модуля геолокации nginx с использованием базы геоданных?
Я настроил nginx в качестве обратного прокси-сервера для пары серверов Apache backend/upstream.
Используя базу данных 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" со всеми запросами, которые не являются DE или US.
Журнал ошибок 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
это не DE или США, как default
и нагрузить его соответственно upstream default.backend
?
1 ответ
default
указано внутри geo
задает только значение по умолчанию для IP-адресов, которых вообще нет в базе данных. Так $geo
всегда будет иметь коды стран для всего, что присутствует в базе данных. Так default
здесь ничего не делает для вас.
Чтобы справиться с этим, используйте map
к тому же.
map $geo $backend {
default default;
US US;
DE DE;
}