如何让NGINX支持判断访问国家,地区,并设置是否许可访问

更新于: 2025-05-10 10:25:44 查看: 126

发布于: 2025-5-9 16:36 发布者: 大米

先要给NGINX安装ngx_http_geoip2_module模块安装方法:大米/ngx_http_geoip2_module使用HLusECS可以一键安装并设置好GeoLite2-Country.mmdb,这里不再介绍安装过程。要限制访问需要 ... ... ... ... ... ... ... ... ...

先要给NGINX安装ngx_http_geoip2_module模块
安装方法见:大米/ngx_http_geoip2_module
使用HLusECS可以一键安装并设置好GeoLite2-Country.mmdb,这里不再介绍安装过程。

要限制访问需要修改文件
/usr/local/nginx/conf/nginx.conf
    # geoip2 配置
    geoip2 /usr/local/nginx/geoip/GeoLite2-Country.mmdb {
        $geoip2_data_country_code country iso_code;
        $geoip2_data_country_name country names zh-CN;
    }
下面添加
map $geoip2_data_country_code $allowed_country {
 default 0;
 CN 1;
 }

站点的server段里面加一下代码拒绝所有不是国内ip:

if ($allowed_country = 0) {      return 403;    }  #  这里显示的是允许国内的ip访问,国外直接返回403
相反,如果要禁止国内访问(我们访问不了某些国外网站,或许并不是我们墙了他们,而是他们这样墙了我们):
if ($allowed_country = 1) {      return 403;    } 
如果要支持地区城市级别的,需要自己下载支持地区级别的数据库文件比如:GeoLite2-City.mmdb
免费版的不够完善,建议收费版。
在nginx.conf文件中添加
    geoip2 /usr/local/nginx/geoip/GeoLite2-City.mmdb {
        $geoip2_data_city_continent_code continent code;
        $geoip2_data_city_continent_name continent names zh-CN;
        $geoip2_data_city_country_code country iso_code;
        $geoip2_data_city_country_name country names zh-CN;
        $geoip2_data_city_region_code subdivisions 0 iso_code;
        $geoip2_data_city_region_name subdivisions 0 names zh-CN;
        $geoip2_data_city_location_latitude location latitude;
        $geoip2_data_city_location_longitude location longitude;
        $geoip2_data_city_postal postal code;
        $geoip2_data_city_city_name city names en;		
    }

表示通过ngx_http_geoip2_module根据访问这个ip获得相应的geo信息。

接下来打开fastcgi.conf文件,在文件末尾添加以下代码:
fastcgi_param MM_CONTINENT_CODE $geoip2_data_city_continent_code;
fastcgi_param MM_CONTINENT_NAME $geoip2_data_city_continent_name;
fastcgi_param MM_COUNTRY_CODE $geoip2_data_city_country_code;
fastcgi_param MM_COUNTRY_NAME $geoip2_data_city_country_name;
fastcgi_param MM_REGION_CODE $geoip2_data_city_region_code;
fastcgi_param MM_REGION_NAME $geoip2_data_city_region_name;
fastcgi_param MM_LATITUDE $geoip2_data_city_location_latitude;
fastcgi_param MM_LONGITUDE $geoip2_data_city_location_longitude;
fastcgi_param MM_POSTAL_CODE $geoip2_data_city_postal;
fastcgi_param MM_CITY_NAME $geoip2_data_city_city_name;

这样就可以将geo信息传递到php上了。

配置好以后重载一下nginx
sudo service nginx reload

如果不报错就没啥问题了,去phpinfo查看$_SERVER有无地理位置信息吧
要检测GeoLite2-City.mmdb文件还可以
使用mmdblookup命令在库中搜索试试:
mmdblookup -f /usr/local/nginx/geoip/GeoLite2-City.mmdb -i 121.196.11.151



支持

反对
扫描二维码,手机查看
声明:部分数据/图片来源互联网,不代表欢乐你我,真实性请妥善甄别。