当前位置:首页 > 服务器技术 > 正文

Nginx地理位置限制(手把手教你用Nginx根据用户所在国家限制网站访问)

在当今互联网环境中,出于安全、合规或业务策略等原因,我们有时需要限制某些国家或地区的用户访问我们的网站。Nginx 提供了强大的 geo 模块,配合 MaxMind 的 IP 地理位置数据库,可以轻松实现Nginx地理位置限制功能。

本教程将从零开始,一步步教你如何配置 Nginx,实现基于用户 IP 所在国家的访问控制。即使你是刚接触服务器配置的小白,也能轻松上手!

Nginx地理位置限制(手把手教你用Nginx根据用户所在国家限制网站访问) Nginx地理位置限制 IP地理位置过滤 Nginx geo模块 基于国家的访问控制 第1张

一、准备工作

在开始之前,请确保你已满足以下条件:

  • 一台运行 Linux 系统的服务器(如 Ubuntu、CentOS)
  • 已安装 Nginx(建议版本 ≥ 1.18)
  • 具备 root 或 sudo 权限

二、安装 GeoIP2 模块(可选但推荐)

现代 Nginx 推荐使用 GeoIP2 模块(基于 MaxMind 的新数据库格式),但如果你使用的是旧版 Nginx,也可以使用传统的 geoip 模块。本文以主流的 ngx_http_geoip2_module 为例。

如果你是从源码编译 Nginx,需在编译时加入该模块。但大多数用户使用包管理器安装,可直接安装预编译模块:

Ubuntu/Debian 示例:

sudo apt updatesudo apt install nginx nginx-module-geoip2  

CentOS/RHEL 示例:

sudo yum install epel-releasesudo yum install nginx nginx-mod-http-geoip2  

三、下载 MaxMind GeoIP2 数据库

MaxMind 提供免费的 GeoLite2 数据库,可用于 IP 地理位置查询。

  1. 访问 MaxMind 官网 注册账号并获取 License Key。
  2. 在服务器上安装 geoipupdate 工具:
# Ubuntu/Debiansudo apt install geoipupdate# CentOS/RHELsudo yum install geoipupdate  

配置 License Key(编辑 /etc/GeoIP.conf):

AccountID 0LicenseKey YOUR_LICENSE_KEY_HEREEditionIDs GeoLite2-Country  

然后运行更新命令下载数据库:

sudo geoipupdate  

数据库默认保存在 /usr/share/GeoIP/GeoLite2-Country.mmdb

四、配置 Nginx 启用地理位置限制

编辑 Nginx 主配置文件(通常为 /etc/nginx/nginx.conf),在 http 块中添加以下内容:

load_module modules/ngx_http_geoip2_module.so;http {    geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {        $geoip2_data_country_code source=$remote_addr country iso_code;    }    map $geoip2_data_country_code $allowed_country {        default no;        CN yes;   # 允许中国        US yes;   # 允许美国        JP yes;   # 允许日本        # 可根据需要添加更多国家代码    }    server {        listen 80;        server_name example.com;        if ($allowed_country = no) {            return 403;        }        location / {            root /var/www/html;            index index.html;        }    }}  

上述配置表示:只允许来自中国(CN)、美国(US)、日本(JP)的用户访问,其他国家一律返回 403 禁止访问错误。

国家代码采用 ISO 3166-1 alpha-2 标准,例如:DE(德国)、FR(法国)、RU(俄罗斯)等。

五、测试与验证

完成配置后,执行以下步骤:

  1. 检查 Nginx 配置是否正确:
sudo nginx -t  
  1. 重新加载 Nginx:
sudo systemctl reload nginx  

你可以使用在线代理工具或不同国家的 VPS 测试访问效果,确认 IP地理位置过滤 是否生效。

六、常见问题与优化

  • Q:能否记录被拒绝的请求?
    A:可以,在 if 块中添加日志记录,或使用 access_log 配合条件判断。
  • Q:数据库多久更新一次?
    A:建议设置 cron 定期运行 geoipupdate,例如每周一次。
  • Q:是否影响性能?
    A:GeoIP2 查询非常快,对性能影响极小,适合高并发场景。

七、总结

通过本教程,你已经学会了如何利用 Nginx 的 geo 模块和 MaxMind 数据库实现基于国家的访问控制。这项技术广泛应用于内容合规、防爬虫、DDoS 防护等场景。

记住,合理使用 Nginx地理位置限制 能有效提升网站安全性与合规性。如果你有更多需求(如按城市限制),GeoIP2 也支持更细粒度的数据。

现在,就去试试吧!你的网站安全防线又加固了一层 🔒