LINUX.ORG.RU
решено ФорумAdmin

Nginx geoip

 , ,


1

1

Суть : есть сервак который редиректит запросы по типу 'если клиент ближе к серверу X, отправить туда'

map $geoip_city_continent_code $closest_server {
    default www.xxx.eee.zz;
    EU      eu2.xxx.eee.zz;
    AS      as2.xxx.eee.zz;
server {
        listen 80;
         server_name xxx.eee.zz;
              www.xxx.eee.zz;
              eu2.xxx.eee.zz;
              as2.xxx.eee.zz;


location / {   if ($geoip_city_continent_code = "EU") { proxy_pass http://eu2; } }

if ($geoip_city_continent_code = "AS") { rewrite ^ $scheme://as2.xxx.eee.zz;$request_uri break; }

нужно: если запрос с азии, балансер редиректил его в азию обратно.

если с EU > proxypass в локальный сервер

только вот смысл в том что я сделал что то не так и оно не работает.

при

if ($closest_server != $host) {
    rewrite ^ $scheme://$closest_server$request_uri break;
  }

все работает ок. ЧЯДНТ ?


Ответ на: комментарий от travka

Зачем if ($geoip_city_continent_code = "EU") { proxy_pass http://eu2; } в location запихнул?

У тебя получается, что одна проверка внутри location, а другая на уровне сервера. Нет ли в этом проблемы?

«rewrite_log on;error_log error.log debug; » не поможет понять причину ?

vel ★★★★★
()

Сначала раскидай всё по отдельным location на входе и в каждом делай что тебе нужно.

location / {
    if ($geoip_city_continent_code = "AS") { rewrite (.*) /redir$1; }
    if ($geoip_city_continent_code = "EU") { rewrite (.*) /local$1; }
    rewrite (.*) /default$1;
}


location /redir {
    internal;
    rewrite ^ $scheme://as2.xxx.eee.zz/$request_uri break;
}


location /local {
    internal;
    proxy_pass http://eu2;
}


location /default {
    internal;
    proxy_pass http://www.xxx.eee.zz;
}
anonymous
()
Ответ на: комментарий от vel

Неа. Т.к. я какую то неведомую чушь сделал xD

travka
() автор топика
map $geoip_city_continent_code $closest_server {
    default www.xxx.eee.zz;
    EU      eu2.xxx.eee.zz;
    AS      as2.xxx.eee.zz;
server {
        listen 80;
         server_name xxx.eee.zz;
              www.xxx.eee.zz;
              eu2.xxx.eee.zz;
              as2.xxx.eee.zz;


location / {
    if ($geoip_city_continent_code = "EU") {
        proxy_pass http://eu2;
    }
}

if ($geoip_city_continent_code = "AS") {
    rewrite ^ $scheme://as2.xxx.eee.zz;$request_uri break;
}

Как это вообще должно работать?
Нужно как-то так:

map $geoip_city_continent_code $closest_server {
    default www.xxx.eee.zz;
    EU      eu2.xxx.eee.zz;
    AS      as2.xxx.eee.zz;
}

server {
    listen 80;
    server_name xxx.eee.zz www.xxx.eee.zz eu2.xxx.eee.zz as2.xxx.eee.zz;

    location / {
        if ($geoip_city_continent_code = "AS") {
            rewrite ^(.*) $scheme://$closest_server$request_uri redirect;
        }

        proxy_pass http://$closest_server;
    }
}

expelled ★★
()
Ответ на: комментарий от travka

В урну или обратно производителю
Пейте мин. воды, соки, кисломолочку..

expelled ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.