地理位置数据在业务中有重要作用,这些数据可以用于向某些人群推广品牌、产品或服务,还有助于增强用户体验。
本文讲述仅通过配置Nginx加上GeoIP MaxMind数据库,就能获得用户IP地址的实际物理位置,而无需编写任何代码。
Nginx是一个开源的HTTP和IMAP/POP3代理服务器,主要用作Web服务器或反向代理服务器。Nginx的GeoIP模块(即ngx_http_geoip_module)使用了预编译的MaxMind数据库来设置变量,比如变量geoipcountryname、变量geoip_country_code、变量$geoip_city等等,而这些值则取决于用户客户端的访问地址。
Nginx可配合GeoIP模块定位IP所在物理位置并做相应处理,支持多个条件匹配:
#http://www.haiyun.me
$geoip_country_code #国家代码2位,如CN
$geoip_country_code3 #国家代码3位,如CHN
$geoip_country_name #国家完整名称,如China
$geoip_region #所在地区
$geoip_city #所在城市,如BeiJing
$geoip_postal_code #邮政编码
$geoip_city_continent_code #所在洲,如AS
$geoip_latitude #纬度
$geoip_longitude #经度
编译安装Nginx并添加GeoIP模块:
yum
install
geoip-devel
wget http:
//nginx
.org
/download/nginx-1
.0.15.
tar
.gz
tar
zxvf nginx-1.0.15.
tar
.gz
cd
nginx-1.0.15
.
/configure
--user=www --group=www --prefix=
/usr/local/nginx
--with-http_stub_status_module \
--with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-http_geoip_module
make
make
install
下载GeoIP城市国家数据库:
mkdir
-p
/usr/local/nginx/geoip
cd
/usr/local/nginx/geoip
wget http:
//www
.maxmind.com
/download/geoip/database/GeoLiteCountry/GeoIP
.dat.gz
wget http:
//geolite
.maxmind.com
/download/geoip/database/GeoLiteCity
.dat.gz
gunzip GeoIP.dat.gz
gunzip GeoLiteCity.dat.gz
编辑Nginx配置文件加载GeoIP数据库:
http
[...]
geoip_country /usr/local/nginx/geoip/GeoIP.dat; #国家数据库
geoip_city /usr/local/nginx/geoip/GeoLiteCity.dat; #城市数据库
[...]
如需Nginx传递变量给PHP,编辑fastcgi_params添加:
fastcgi_param GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;
fastcgi_param GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3;
fastcgi_param GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name;
fastcgi_param GEOIP_REGION $geoip_region;
fastcgi_param GEOIP_CITY $geoip_city;
fastcgi_param GEOIP_POSTAL_CODE $geoip_postal_code;
fastcgi_param GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;
fastcgi_param GEOIP_LATITUDE $geoip_latitude;
fastcgi_param GEOIP_LONGITUDE $geoip_longitude;
应用示例,Nginx判断如果访问者IP所在国家为美国或中国,返回404错误
server
[...]
if ($geoip_country_code ~* (US|CN)) {
#return 404;
}
[...]
新建PHP程序测试GeoIP:
<html>
<head>
<title>IP地址检测,我的IP地址是多少?</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
if (getenv(HTTP_X_FORWARDED_FOR)) {
$pipaddress = getenv(HTTP_X_FORWARDED_FOR);
$ipaddress = getenv(REMOTE_ADDR);
echo "<br>您的代理IP地址是: ".$pipaddress. " (via $ipaddress) " ;
} else {
$ipaddress = getenv(REMOTE_ADDR);
echo "<br>您的IP地址是 : $ipaddress";
}
$geoip_city_country_code = getenv(GEOIP_CITY_COUNTRY_CODE);
$geoip_city_country_code3 = getenv(GEOIP_CITY_COUNTRY_CODE3);
$geoip_city_country_name = getenv(GEOIP_CITY_COUNTRY_NAME);
$geoip_region = getenv(GEOIP_REGION);
$geoip_city = getenv(GEOIP_CITY);
$geoip_postal_code = getenv(GEOIP_POSTAL_CODE);
$geoip_city_continent_code = getenv(GEOIP_CITY_CONTINENT_CODE);
$geoip_latitude = getenv(GEOIP_LATITUDE);
$geoip_longitude = getenv(GEOIP_LONGITUDE);
echo "<br>国家 : $geoip_city_country_name ( $geoip_city_country_code3 , $geoip_city_country_code ) ";
echo "<br>地区 : $geoip_region";
echo "<br>城市 : $geoip_city ";
echo "<br>邮政编码 : $geoip_postal_code";
echo "<br>所在洲 : $geoip_city_continent_code";
echo "<br>纬度 : $geoip_latitude ";
echo "<br>经度 : $geoip_longitude ";
?>
</body>
</html>
如果要查询某个IP属于哪个国家地区。
http://pecl.php.net/get/geoip-1.1.1.tgz
php需要增加这个扩展。
tar -zxvf geoip-1.1.1.tgz
cd geoip-1.1.1
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config
make
make install
vi /usr/local/php/etc/php.ini
增加extension=geoip.so
详细使用geoip扩展参考
http://php.net/manual/zh/book.geoip.php