Nginx通过地理位置限制访问
Nginx通过地理位置限制访问
- 介绍
- 先决条件
- 获取数据库
- 了解数据库结构
- 在NGINX Plus中配置GeoIP2
- 方案:选择最近的服务器
介绍
NGINX Plus可以根据用户的地理位置来区分用户。例如,您可以为不同的国家/地区提供不同的网站内容,或者可以将内容分发限制为特定的国家或城市。
NGINX Plus使用第三方MaxMind数据库来匹配用户的IP地址及其位置。知道地理位置后,便可以在map
或split_clients
模块中使用基于Geoip的变量。
注意: MaxMind GeoLite传统数据库目前已停产,应改用MaxMind GeoIP2或GeoLite2数据库和NGINX Plus GeoIP2模块。
地理位置限制适用于HTTP和TCP / UDP协议。
先决条件
- NGINX Plus GeoIP2动态模块
- MaxMind的GeoIP2或GeoLite2数据库
- (可选)mmdblookup实用程序,用于在MaxMind数据库文件中查找IP地址
获取数据库
可以从MaxMind下载页面获得GeoIP2或GeoLite2数据库。在此示例中,使用了免费的GeoLite2可下载数据库。
要获取和解压缩GeoLite2国家数据库:
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
$ gunzip GeoLite2-Country.mmdb.gz
要获取和解压缩GeoLite2 City数据库:
$ wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
$ gunzip GeoLite2-City.mmdb.gz
了解数据库结构
要查看可用的地理数据,可以使用mmdblookup
实用程序查询GeoLite2-Country和GeoLite2-City数据库。地理数据表示为JSON树。
安装libmaxminddb
数据库实用程序:
对于Amazon Linux,CentOS,Oracle Linux和RHEL:
$ yum install libmaxminddb-devel
对于Debian和Ubuntu:
$ apt-get install libmaxminddb-dev
对于SLES:
$ zypper install libmaxminddb-devel
对数据库的查询可以以下格式发送:
mmdblookup –file [FILE PATH] –ip [IP ADDRESS] [DATA PATH]
例如,要获取8.8.8.8
IP地址的所有可用地理数据,请发送以下命令:
$ mmdblookup --file /usr/local/etc/geoip2/GeoLite2-Country.mmdb --ip 8.8.8.8
输出将是:
{"continent":{"code":"NA" <utf8_string>"geoname_id":6255149 <uint32>"names":{"de":"Nordamerika" <utf8_string>"en":"North America" <utf8_string>"es":"Norteamérica" <utf8_string>"fr":"Amérique du Nord" <utf8_string>"ja":"北アメリカ" <utf8_string>"pt-BR":"América do Norte" <utf8_string>"ru":"Северная Америка" <utf8_string>"zh-CN":"北美洲" <utf8_string>}}"country":{"geoname_id":6252001 <uint32>"iso_code":"US" <utf8_string>"names":{"de":"USA" <utf8_string>"en":"United States" <utf8_string>"es":"Estados Unidos" <utf8_string>"fr":"États-Unis" <utf8_string>"ja":"アメリカ合衆国" <utf8_string>"pt-BR":"Estados Unidos" <utf8_string>"ru":"США" <utf8_string>"zh-CN":"美国" <utf8_string>}}"registered_country":{"geoname_id":6252001 <uint32>"iso_code":"US" <utf8_string>"names":{"de":"USA" <utf8_string>"en":"United States" <utf8_string>"es":"Estados Unidos" <utf8_string>"fr":"États-Unis" <utf8_string>"ja":"アメリカ合衆国" <utf8_string>"pt-BR":"Estados Unidos" <utf8_string>"ru":"США" <utf8_string>"zh-CN":"美国" <utf8_string>}}}
例如,要获取特定的地理数据,例如仅获取特定国家/地区的ISO代码,请在命令末尾添加参数:country iso_code
$ mmdblookup --file /usr/local/etc/geoip2/GeoLite2-Country.mmdb --ip 8.8.8.8 country iso_code
在用于NGINX的GeoIP2模块中创建变量时,也会使用这些参数。
在NGINX Plus中配置GeoIP2
为NGINX Plus安装GeoIP2动态模块:
对于Amazon Linux,CentOS,Oracle Linux和RHEL:
$ yum install nginx-plus-module-geoip2
对于Debian和Ubuntu:
$ apt-get install nginx-plus-module-geoip2
对于SLES:
$ zypper install nginx-plus-module-geoip2
load_module
使用main
配置级别中指定的指令在NGINX Plus配置文件中启用GeoIP2动态模块:load_module modules/ngx_http_geoip2_module.so; load_module modules/ngx_stream_geoip2_module.so;http {# ... }
路径的国家和城市数据库添加到NGINX配置与块,或两者:
geoip2 {}
http {}
stream {}
http { #... geoip2 GeoIP2/GeoLite2-Country.mmdb { #... } geoip2 GeoIP2/GeoLite2-City.mmdb { #... } } stream { #... geoip2 GeoIP2/GeoLite2-Country.mmdb { #... } geoip2 GeoIP2/GeoLite2-City.mmdb { #... } }
根据GeoIP数据库结构,创建自定义变量,该变量将保留GeoIP2数据库中的数据,然后将数据传递给
map
或split_clients
指令(可以在和上下文中应用):http {}
stream {}
geoip2 GeoIP2/GeoLite2-City.mmdb {$geoip2_data_city_name city names en;$geoip2_data_postal_code postal code;$geoip2_data_latitude location latitude;$geoip2_data_longitude location longitude;$geoip2_data_state_name subdivisions 0 names en;$geoip2_data_state_code subdivisions 0 iso_code;
}geoip2 GeoIP2/GeoLite2-Country.mmdb {$geoip2_data_continent_code continent code;$geoip2_data_country_iso_code country iso_code;
}#...
方案:选择最近的服务器
使用来自创建的变量的地理位置数据,可以将客户端连接重定向到最近的服务器,从而减少网络延迟并提高连接速度。
这可以通过在变量中使用来自GeoIP2数据库的大洲代码和map
将创建另一个变量的模块来实现,该变量的值将是基于大洲位置的最接近的服务器。基于此值,NGINX将请求传递给相应的上游服务器组。
对于IP地址无法与GeoIP数据库匹配的情况,请确保已为每个大陆(例如欧洲,北美)配置了服务器或上游服务器组:
eu
na
all
upstream all {server all1.example.com:12345;server all2.example.com:12345; }upstream eu {server eu1.example.com:12345;server eu2.example.com:12345; }upstream na {server na1.example.com:12345;server na2.example.com:12345; }
添加具有任何名称(例如)的变量的块,以获取GeoIP2数据库的洲代码:
geoip2 {}
$geoip2_data_continent_code
geoip2 GeoIP2/GeoLite2-Country.mmdb { $geoip2_data_continent_code continent code; } #...
创建
map
将创建$nearest_server
变量的块:#... map $geoip2_data_continent_code $nearest_server {default all;EU eu;NA na;AS as;AF af; } #...
创建一个块,该块将根据变量中传递的值将请求传递给上游服务器组之一:
server {}
$nearest_server
server {listen 12346;proxy_pass http://$nearest_server; }
如果大陆是欧洲,则$nearest_server
will 的值将是eu
,并且连接将eu
通过proxy_pass
伪指令传递给上游:
#...
server {listen 12346;proxy_pass http://$nearest_server;
}upstream all {server all1.example.com:12345;server all2.example.com:12345;upstream eu {server eu1.example.com:12345;server eu2.example.com:12345;
}
upstream na {server na1.example.com:12345;server na2.example.com:12345;
}
#...
例
此示例可以在http
和stream
上下文中应用。
# can be either "http {}" or "stream {}"
#...
geoip2 GeoIP2/GeoLite2-Country.mmdb {$geoip2_data_continent_code continent code;
}map $geoip2_data_continent_code $nearest_server {default all;EU eu;NA na;AS as;AF af;
}server {listen 12346;proxy_pass http://$nearest_server;}upstream all {server all1.example.com:12345;server all2.example.com:12345;
}upstream eu {server eu1.example.com:12345;server eu2.example.com:12345;
}upstream na {server na1.example.com:12345;server na2.example.com:12345;
}
在此示例中,将在GeoLite2-Country.mmdb
数据库中检查IP地址,结果将被写入$geoip2_data_continent_code
变量。map
在我们的示例中,NGINX Plus会将变量的值与指令中的值进行匹配,并将结果写入自定义变量中$nearest_server
。根据的值$nearest_server
,proxy_pass
伪指令将选择相应的上游服务器。
更多信息
- GeoIP2动态模块安装说明
- MaxMind GeoIP2数据库
- MaxMind Geolite2免费可下载数据库
Nginx通过地理位置限制访问相关推荐
- 阿里云服务器ECS Linux系统分析nginx或apache当天访问最多的IP
Linux 系统查询 nginx 或 apache 当天访问最多的 IP 方法,以一键安装包为例可以执行如下命令: cat /alidata/log/nginx/access/testweb.log ...
- Nginx 禁止某 IP 访问
导语 总有一些不怀好意的人来访问我的网站,而且频率还很高,所以就用简单的方式禁止访问,就用 Nginx 来实现. 创建黑名单 在 /usr/local/nginx/conf 目录下创建 blocksi ...
- nginx之静态资源访问和负载均衡的使用!
一.前言 最近空闲时间稍微少了点,晚上下班一般会看会书,所以更新也就没有那么快了!这不最近在看之前买的书籍(今年真的要多看点书籍): 还有音视频接口和解封装框架,我差不多快捋顺了,其实之前很多人问的接 ...
- 通过Nginx配置多域名访问
通过Nginx配置多域名访问 一.下载Nginx 访问Nginx官网选择对应版本和安装包:http://nginx.org/ 以下讲述为在Windows环境下配置Nginx进行多域名访问 二.Ngin ...
- nginx配置 vue打包后的项目 解决刷新页面404问题|nginx配置多端访问
访问vue页面时,/# 使url看着不美观,使用 H5 history模式可以完美解决这个问题,但需要后端nginx帮助.接下来我们自己配置一下. 使用前端路由,但切换新路由时,想要滚动到页面顶部,或 ...
- 全网最详细的docker配置nginx http2 优化高速访问
Nginx 从 1.13.9 版本开始加入了 HTTP/2 的 Server Push 功能,本文将介绍如何在 Nginx 下实现 HTTP/2 服务器推送 (Server Push) .这里我们首先 ...
- docker 启动成功但无法访问_docker nginx 运行后无法访问的问题解决
## 1 最近在学docker部署,一开始打算将nginx先docker化的. 对照官方的docker镜像介绍说明,进行自定义配置 将官方的nginx.conf复制出来后,修改添加了一些自定义,主要是 ...
- nginx 防止恶意域名解析_配置nginx只允许域名访问,禁止ip访问【图文教程】
平凡也就两个字: 懒和惰;成功也就两个字: 苦和勤;优秀也就两个字: 你和我.跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!每一篇文章都是心 ...
- docker安装nginx,配置nginx,并成功访问
[Nginx那些事]系列 [Nginx那些事]nginx 安装及常用指令 [Nginx那些事]Nginx 配置文件说明 [Nginx那些事]nginx原理解析 [Nginx那些事]nginx配置实例( ...
最新文章
- 一张图追踪测序的大历史背景
- Direct2D教程(三)简单几何图形
- SpringBoot开发第一个Web入门级应用(超详细)
- arcgis 坐标系 2000坐标系_干货 | 关于投影和坐标系那些事,你是否都已还给了老师?...
- [react] 你有用过React的插槽(Portals)吗?怎么用?
- 那些年我们踩过的坑-NSTimer
- 【ROS学习笔记】(五)话题消息的定义与使用
- 使用spss做各种相关性分析的方法和步骤
- idea配置svn地址
- 使用Python写登录京东商城购物,加入购物车的脚本
- 物联网可靠连接——PLC-IOT电力线载波通讯
- Boobooke (播布客) 是个好网站
- IT之家精华:苹果iOS系统发布/固件下载/升级更新大全表~
- 【转载】如何统计分析网站的访问量
- 堆内存和栈内存的区别
- html行内样式选择器怎么写,巧用CSS伪类选择器实现九种样式的九宫格
- 武林传奇之七剑下天山java游戏开发商_武林传奇2之七剑下天山的配方
- 树以及二叉树的常用性质以及遍历
- PM常用语看这篇就够了
- 机器视觉定位入门三步走-第二步