Nginx和GeoIP模块读取IP所在的地域信息方法

  • Post category:Linux

Nginx 是一个高性能的 Web 服务器和反向代理服务器,它的 GeoIP 模块可以与 MaxMind 公司的 GeoIP 数据库配合使用,提供读取 IP 所在的地域信息的功能。

以下是详细的步骤:

1. 下载 GeoIP 数据库

在使用 GeoIP 模块之前,需要先下载对应的 GeoIP 数据库。可以从 MaxMind 公司的网站上下载 https://dev.maxmind.com/geoip/geoip2/geolite2/

2. 安装 GeoIP 模块

在编译 Nginx 的时候,需要加入对 GeoIP 模块的支持。可以使用以下命令进行编译:

./configure --with-http_geoip_module --with-ld-opt="-Wl,-rpath,/usr/local/lib"
make
sudo make install

其中 --with-http_geoip_module 参数表示编译时启用 GeoIP 模块,--with-ld-opt="-Wl,-rpath,/usr/local/lib" 参数表示在编译时指定 GeoIP 库的路径。

3. 配置 GeoIP 模块

在 Nginx 的配置文件中,可以使用 GeoIP 模块提供的 geoip_countrygeoip_city 指令获取 IP 所在的国家和城市信息。以下是一个示例配置:

http {
    geoip_country /usr/local/share/GeoIP/GeoLite2-Country.mmdb;
    geoip_city /usr/local/share/GeoIP/GeoLite2-City.mmdb;

    server {
        listen 80;
        server_name example.com;

        location / {
            root /var/www;
            index index.html;

            set $country_code "-";
            set $city_name "-";

            if ($geoip_country_code != "") {
                set $country_code $geoip_country_code;
            }

            if ($geoip_city != "") {
                set $city_name $geoip_city_names_en;
            }

            add_header X-Country-Code $country_code;
            add_header X-City-Name $city_name;
        }
    }
}

在上面的示例配置中,geoip_countrygeoip_city 指令分别指定了 GeoIP 数据库的路径。if ($geoip_country_code != "") 判断是否获取到了国家代码,如果是则将其赋值给 $country_code 变量;同理,if ($geoip_city != "") 判断是否获取到了城市信息,如果是则将其赋值给 $city_name 变量。然后通过 add_header 指令将这些信息添加到响应头中。

4. 示例说明

下面是两个示例说明:

示例一:根据 IP 地址判断用户所在的国家

以下是一个示例配置:

http {
    geoip_country /usr/local/share/GeoIP/GeoLite2-Country.mmdb;

    server {
        listen 80;
        server_name example.com;

        location / {
            root /var/www;
            index index.html;

            set $country_code "-";

            if ($geoip_country_code != "") {
                set $country_code $geoip_country_code;
            }

            if ($country_code = "CN") {
                return 301 https://baidu.com;
            }

            if ($country_code = "US") {
                return 301 https://google.com;
            }
        }
    }
}

通过上述配置,当用户访问 example.com 时,Nginx 将获取到用户 IP 所在的国家代码并存放在 $country_code 变量中,然后根据不同的国家代码进行不同的跳转,例如:如果用户所在的国家是中国,则跳转到百度;如果用户所在的国家是美国,则跳转到 Google。

示例二:根据 IP 地址判断用户所在的城市

以下是一个示例配置:

http {
    geoip_city /usr/local/share/GeoIP/GeoLite2-City.mmdb;

    server {
        listen 80;
        server_name example.com;

        location / {
            root /var/www;
            index index.html;

            set $city_name "-";

            if ($geoip_city != "") {
                set $city_name $geoip_city_names_en;
            }

            if ($city_name = "Beijing") {
                return 301 https://baidu.com;
            }

            if ($city_name = "New York") {
                return 301 https://google.com;
            }
        }
    }
}

通过上述配置,当用户访问 example.com 时,Nginx 将获取到用户 IP 所在的城市并存放在 $city_name 变量中,然后根据不同的城市名称进行不同的跳转,例如:如果用户所在的城市是北京,则跳转到百度;如果用户所在的城市是纽约,则跳转到 Google。