安装nginx并配置geoip2

时间:2024-10-21 17:33:22

目录

    • 概述
      • GeoIP 模块的作用
      • GeoIP 数据库
    • 配置环境
    • 安装nginx及GeoIP2 模块
    • 编辑配置文件,实现地区查询
    • 执行验证
      • 正常访问测试
      • 查看日志
    • CDN配置
    • **总结**

概述

Nginx 使用 GeoIP 模块 以及 GeoIP 数据库 的主要作用是基于访问者的 IP 地址,确定他们的地理位置信息,并根据这个信息进行各种操作。它能为 Nginx 提供访问者的国家、地区、城市、经纬度等信息,方便你根据地理位置定制化响应策略,比如内容分发、访问限制或负载均衡等。

GeoIP 模块的作用

Nginx 的 GeoIP 模块通过读取 MaxMind 提供的 GeoIP 数据库,将客户端的 IP 地址映射为地理位置数据,然后可以在 Nginx 配置中使用这些数据。常见的使用场景包括:

1.根据国家/地区定制内容

你可以基于用户的地理位置来定制化显示内容。例如,向来自不同国家的用户展示不同语言的页面、不同的广告,或不同的货币单位。

2.访问控制

可以基于用户的地理位置来允许或拒绝访问。例如,屏蔽某些国家的用户访问某个特定站点,或者限制某些地区的用户访问敏感内容。

3.性能优化

你可以根据用户的地理位置,将他们的请求定向到距离最近的服务器,以减少延迟并提升性能。这在全球范围内的内容分发网络(CDN)中非常有用。

4.日志记录与分析

通过 GeoIP,你可以将用户的地理位置信息记录到日志中,用于后续分析。例如,了解用户的来源分布,优化市场投放策略。

GeoIP 数据库

GeoIP 数据库是 MaxMind 提供的 IP 地址到地理位置的映射文件。Nginx 常用的是以下两种数据库:

  1. GeoLite2 数据库(免费版本)

​ • 适合一般需求,提供基本的国家、城市信息。

  1. GeoIP2 商业数据库(收费版本)

​ • 提供更精确和详细的地理信息,包括国家、城市、时区、ISP 等。

这两个数据库都是以二进制文件形式提供的,通常使用 .mmdb 文件格式。

配置环境

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

yum clean all && yum makecache

yum install epel-release -y

yum install -y gcc make pcre-devel zlib-devel openssl-devel openssl gcc-c++ wget git libmaxminddb-devel

安装nginx及GeoIP2 模块

cd /opt/ && wget https://nginx.org/download/nginx-1.27.2.tar.gz && tar -zxvf nginx-1.27.2.tar.gz && cd nginx-1.27.2

git clone https://github.com/leev/ngx_http_geoip2_module

./configure --prefix=/usr/local/nginx --add-module=./ngx_http_geoip2_module --with-http_ssl_module --with-http_v2_module --with-stream

make && make install

/usr/local/nginx/sbin/nginx -v

vi /etc/systemd/system/nginx.service

systemctl daemon-reload && systemctl start nginx

编辑配置文件,实现地区查询

下载GeoLite2 数据库,需注册账号

https://dev.maxmind.com/geoip/geolite2-free-geolocation-data/

登录账号后,点击右上角My Account—My Account—左侧Download Files—点击GeoLite2 City和GeoLite2 Country的Download GZIP下载最新版GeoLite2 数据库

将下载的压缩包放在/usr/local/nginx并执行tar zxvf进行解压

vi /usr/local/nginx/conf/nginx.conf
.....
http {
......
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;
    # 将用户的地理位置信息写入 Nginx 的日志中,方便后续的日志分析
    log_format geoip '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$geoip2_data_country_code" '
                       '"$geoip2_data_city_name" "$geoip2_data_latitude" "$geoip2_data_longitude"';

    access_log logs/access.log geoip;
    # 加载 GeoLite2 *数据库
    geoip2 /usr/local/nginx/GeoLite2-Country_20241018/GeoLite2-Country.mmdb {
        $geoip2_data_country_code default=CN country iso_code;
        $geoip2_data_country_name country names en;
    }
    # 加载 GeoLite2 城市级数据库
    geoip2 /usr/local/nginx/GeoLite2-City_20241018/GeoLite2-City.mmdb {
        $geoip2_data_city_name city names en;
        $geoip2_data_latitude location latitude;
        $geoip2_data_longitude location longitude;
    }
......
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            # 基于国家的访问控制,CN测试
            if ($geoip2_data_country_code = "CN") {
                return 403;
            }
            # 添加头信息,显示地理位置相关信息
            add_header X-Country-Code $geoip2_data_country_code;
            add_header X-Country-Name $geoip2_data_country_name;
            add_header X-City-Name $geoip2_data_city_name;
            add_header X-Latitude $geoip2_data_latitude;
            add_header X-Longitude $geoip2_data_longitude;
        }
......

执行验证

正常访问测试

注释nginx配置文件中如下配置
#            if ($geoip2_data_country_code = "CN") {
#                return 403;
#            }

# 进行访问测试,ip替换为自身nginx服务器ip
curl -v 10.10.1.174
* About to connect() to 10.10.1.174 port 80 (#0)
*   Trying 10.10.1.174...
* Connected to 10.10.1.174 (10.10.1.174) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.10.1.174
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: nginx/1.27.2
< Date: Mon, 21 Oct 2024 06:33:14 GMT
< Content-Type: text/html
< Content-Length: 615
< Last-Modified: Mon, 21 Oct 2024 05:56:04 GMT
< Connection: keep-alive
< ETag: "6715ecf4-267"
< X-Country-Code: CN    //此处附加请求头成功
< Accept-Ranges: bytes
< 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
* Connection #0 to host 10.10.1.174 left intact

CN拒绝访问测试

取消刚刚添加的注释:
            if ($geoip2_data_country_code = "CN") {
                return 403;
            }

# 进行访问测试,ip替换为自身nginx服务器ip
curl -v 10.10.1.174
* About to connect() to 10.10.1.174 port 80 (#0)
*   Trying 10.10.1.174...
* Connected to 10.10.1.174 (10.10.1.174) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 10.10.1.174
> Accept: */*
> 
< HTTP/1.1 403 Forbidden
< Server: nginx/1.27.2
< Date: Mon, 21 Oct 2024 06:40:52 GMT
< Content-Type: text/html
< Content-Length: 153
< Connection: keep-alive
< 
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.27.2</center>
</body>
</html>
* Connection #0 to host 10.10.1.174 left intact
//CN访问403生效

查看日志

10.10.1.174 - - [21/Oct/2024:14:34:09 +0800] "GET / HTTP/1.1" 200 615 "-" "curl/7.29.0" "CN" "-" "-" "-"
10.10.1.174 - - [21/Oct/2024:14:40:52 +0800] "GET / HTTP/1.1" 403 153 "-" "curl/7.29.0" "CN" "-" "-" "-"

CDN配置

使用map函数实现针对国家进行负载均衡
map $geoip2_data_country_code $backend {
    default backend_us;
    RU      backend_ru;  # 俄罗斯用户定向到俄罗斯服务器
    CN      backend_cn;  # 中国用户定向到中国服务器
}

proxy_pass http://$backend;
# 该功能只做简要说明

总结

通过在开源 Nginx 中使用 GeoIP2 模块,结合 GeoIP 数据库,你可以实现以下功能:

• 基于地理位置定制化内容

• 访问控制

• 全球负载均衡

• 日志分析