Lighttpd 安装 mod_geoip 进行国家/城市级别地理定位
地理定位软件用于使用 IP 地址获取访问者的地理位置。您可以确定国家、组织并猜测访问者的位置。这对于
a]欺诈检测
b] 地理营销和广告投放
c]目标内容
d] 打击垃圾邮件
e] 还有更多。
mod_geoip 是一个 Lighttpd 模块,用于快速查找 IP/位置。在本教程中,您将了解 mod_geoip 安装和 php 服务器端示例,以确定访问者的国家/地区。
mod_geoip 使用 MaxMind GeoIP / GeoCity 数据库,有两个版本:
- 免费版本:国家和城市数据库免费,准确率为 99.5%。
- 付费版本:如果您需要 99.8% 的准确度以及有关 IP 地址的其他详细信息,请使用付费版本。
请参阅此页面了解免费版与付费版的详细信息。
关于 CentOS / RHEL / Fedora Linux 用户的说明
如果您使用第三方 repo(请参阅RPMforge和EPEL repo 安装常见问题解答),您可以按如下方式安装二进制 mod_geoip 包并直接跳到配置部分:
# yum install lighttpd-mod_geoip
步骤 1:安装 mod_geoip 的 C API
输入以下命令下载并解压MaxMind C API:
安装所需的开发包,输入:
配置、编译和安装C API:
# cd /tmp
# wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
# tar -zxvf GeoIP.tar.gz
# yum install zlib-devel
# cd GeoIP-1.4.6
# ./configure
# make
# make install
配置 GNU ld
您需要使用 C API 链接 mod_geoip。您需要按如下方式配置动态链接器运行时绑定:
附加以下配置:
# cd /etc/ld.so.conf.d/
# vi geoip.conf
/usr/local/lib
保存并关闭文件。运行 ldconfig 以激活配置:
# ldconfig
验证是否扫描了包括 /usr/local/lib 在内的每个目录的名称,以及创建的任何链接:
# ldconfig -v | less
示例输出:
/usr/local/lib: libGeoIPUpdate.so.0 -> libGeoIPUpdate.so.0.0.0 libGeoIP.so.1 -> libGeoIP.so.1.4.6 /usr/lib/mysql: libmysqlclient_r.so.15 -> libmysqlclient_r.so.15.0.0 libmysqlclient.so.15 -> libmysqlclient.so.15.0.0 /usr/lib64/mysql: libmysqlclient_r.so.15 -> libmysqlclient_r.so.15.0.0 libmysqlclient.so.15 -> libmysqlclient.so.15.0.0 /lib: libsepol.so.1 -> libsepol.so.1 libtermcap.so.2 -> libtermcap.so.2.0.8 .... ..... [Output truncated]
步骤#2:下载 lighttpd 最新版本
键入以下命令:
# cd /tmp
# wget http://www.lighttpd.net/download/lighttpd-1.4.22.tar.gz
# tar -zxvf lighttpd-1.4.22.tar.gz
# cd lighttpd-1.4.22
步骤#3:下载 mod_geoip 补丁
键入以下命令:
# cd lighttpd-1.4.22/src
# wget http://redmine.lighttpd.net/attachments/download/716/mod_geoip_for_1.4.c -O mod_geoip.c
使用 mod_geoip 补丁编译 lighttpd
编辑 Makefile.am,在最后一个模块后添加以下内容:
lib_LTLIBRARIES += mod_geoip.la mod_geoip_la_SOURCES = mod_geoip.c mod_geoip_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined mod_geoip_la_LIBADD = $(common_libadd) -lGeoIP
保存并关闭文件。现在编译 lighttpd 如下:
现在必须使用 –enable-maintainer-mode 选项:
# cd ..
# aclocal
# automake -a
# autoconf
# make clean
# ./configure --program-prefix= --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/usr/com --mandir=/usr/share/man --infodir=/usr/share/info --with-openssl --enable-maintainer-mode
# make
# make install
步骤#4:下载 GeoLite 数据库(免费版)
键入以下命令:
示例输出:
# wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
# gunzip GeoIP.dat.gz
# ls -lh GeoIP.dat
-rw-r--r-- 1 root root 1.1M Mar 9 21:13 GeoIP.dat
安装 GeoIP.dat 文件:
# mkdir /usr/local/GeoIP
# cp -v GeoIP.dat /usr/local/GeoIP
步骤#5:配置Lighttpd
打开 lighttpd.conf 文件并附加以下配置。首先,启用 mod_geoip:
server.modules += "mod_geoip"
最后,设置 GeoIP.dat 文件的路径并打开内存缓存以便更快地进行查找:
geoip.db-filename = "/usr/local/GeoIP/GeoIP.dat" geoip.memory-cache = "enable"
保存并关闭文件。最后,重新启动lighttpd:
# /etc/init.d/lighttpd restart
步骤#6:测试你的设置
mod_geoip 将设置环境变量,如下所示:
GEOIP_COUNTRY_CODE GEOIP_COUNTRY_CODE3 GEOIP_COUNTRY_NAME GEOIP_CITY_NAME GEOIP_CITY_POSTAL_CODE GEOIP_CITY_LATITUDE GEOIP_CITY_LONG_LATITUDE GEOIP_CITY_DMA_CODE GEOIP_CITY_AREA_CODE
您可以使用任何服务器端编程语言来确定访问者的 GEO 位置。以下是示例 php 代码:
<html> <head> <title>What is my IP address - determine or retrieve my IP address</title> </head> <body> <? if (getenv(HTTP_X_FORWARDED_FOR)) { $pipaddress = getenv(HTTP_X_FORWARDED_FOR); $ipaddress = getenv(REMOTE_ADDR); echo "Your Proxy IP address is : ".$pipaddress. " (via $ipaddress) " ; } else { $ipaddress = getenv(REMOTE_ADDR); echo "Your IP address is : $ipaddress"; } $country = getenv(GEOIP_COUNTRY_NAME); echo "<br />Your country : $country"; ?> </body> </html>
另一个示例:将用户重定向到特定国家/地区的 URL
<?php // get country .. set default to INDIA // www.example.com/country/us/ - USA customer website // www.example.com/country/in/ - INDIA customer website and so on... $country_code = ( !empty( $_SERVER['GEOIP_COUNTRY_CODE'] ) ) ? $_SERVER['GEOIP_COUNTRY_CODE'] : 'IN'; header( 'Location: http://www.example.com/country/'.strtolower( $country_code ).'/' ); exit; ?>
参考:
- mod_geoip 补丁(适用于 Lighttpd 版本 1.4)
- Lighttpd Web 服务器
- Maxmind 数据库
- 用于更新 MaxMind GeoIP 数据库的 Shell 脚本