3 votes

Comment configurer le module de géolocalisation de nginx en utilisant une base de données géolocalisée ?

J'ai configuré nginx comme proxy inverse pour quelques serveurs apache backend/upstream.

L'utilisation de la Base de données GeoLite de MaxMind, j'essaie de répartir les demandes entre les deux serveurs en fonction du code pays des clients.

Configuration de 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;
        }

J'essaie donc d'envoyer les clients allemands sur le serveur A, les clients américains sur le serveur B, et tous les autres clients qui ne correspondent pas aux codes de pays allemand ou américain sont répartis entre les serveurs A et B.

Toutefois, étant donné que les geo.conf contient des codes pays pour de nombreux (tous les) autres pays, ces valeurs sont affectées à la variable $geo par opposition à default '.

Avec ma configuration actuelle, cela provoque des erreurs "502 Bad Gateway" pour toutes les requêtes qui ne sont pas DE ou US.

Journal des erreurs de 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"

Journal d'accès 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" "-"

Comment puis-je configurer nginx.conf pour interpréter n'importe quelle valeur de code de pays IP à partir de geo.conf qui n'est pas DE ou US comme default et l'équilibrer en conséquence pour upstream default.backend ?

3voto

Michael Hampton Points 232226

default spécifié à l'intérieur geo ne spécifie qu'une valeur par défaut pour les adresses IP qui ne figurent pas du tout dans la base de données. Ainsi, le $geo aura toujours des codes de pays pour tout ce qui est présent dans la base de données. Ainsi, les default ne vous apporte rien.

Pour remédier à ce problème, il convient d'utiliser un map en plus.

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X