nginx 地理位置模块配置使用地理数据库吗?

nginx 地理位置模块配置使用地理数据库吗?

我已将 nginx 设置为几个 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”值。

在我当前的配置下,这会导致所有非 DE 或 US 的请求都出现“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" "-"

我如何配置将任何非 DE 或 US 的nginx.confIP 国家代码值解释为,并相应地对其进行负载平衡?geo.confdefaultupstream default.backend

答案1

default里面指定的geo只是为数据库中根本不存在的 IP 地址指定一个默认值。因此,$geo数据库中存在的任何国家代码都将始终存在。所以default这里对你没有任何帮助。

为了解决这个问题,使用map此外。

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

相关内容