https://www.scalescale.com/tips/nginx/how-to-install-nginx-geoip-module/
Nginx GeoIP module for country and city geo targeting can be installed in a few easy steps. It brings you a geo targeting layer allowing you to show some parts of your websites, or even split traffic according to the geographical location of the end users.
Requirements for CentOS/Fedora/RHEL
yum install zlib-devel -y
Install MaxMind C API
cd /tmp wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz tar -zxvf GeoIP.tar.gz cd GeoIP-1.4.8 ./configure make make install
Index the library into the system with ldconfig
echo '/usr/local/lib' > /etc/ld.so.conf.d/geoip.conf ldconfig
Check that the library is loaded ok:
ldconfig -v | grep GeoIP
if you see something like this:
libGeoIPUpdate.so.0 -> libGeoIPUpdate.so.0.0.0 libGeoIP.so.1 -> libGeoIP.so.1.4.8
That means the library was installed sucessfully.
Compile Nginx GeoIP module
Download Nginx latest stable version and add –with-http_geoip_module to your ./configure options, example:
./configure --with-http_geoip_module
Output:
wget http://nginx.org/download/nginx-1.4.3.tar.gz tar -xvpzf nginx-1.4.3.tar.gz cd nginx-1.4.3/ ./configure --with-http_geoip_module --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6
Install MaxMind GeoCity and GeoCountry Databases
mkdir -p /usr/local/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz -O /usr/local/share/GeoIP/GeoLiteCity.dat.gz gzip -d /usr/local/share/GeoIP/GeoLiteCity.dat.gz
Get the free database of geo_country:
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz -O /usr/local/share/GeoIP/GeoIP.dat.gz gzip -d /usr/local/share/GeoIP/GeoIP.dat.gz
Add this to nginx.conf file:
# SET the path to the .dat file used for determining the visitor's country from the IP-address ### geoip_country /usr/local/share/GeoIP/GeoIP.dat; # SET the path to the .dat file used for determining the visitor's country from the IP-address ### geoip_city /usr/local/share/GeoIP/GeoLiteCity.dat;
Configuring GeoIP variables
If you are using nginx with php-fpm, place this variables inside http block:
# Set php-fpm geoip variables fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code; fastcgi_param GEOIP_COUNTRY_CODE3 $geoip_country_code3; fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name; 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;
If you use nginx as proxy for apache, use this block:
# Set proxy geoip variables proxy_set_header GEOIP_COUNTRY_CODE $geoip_country_code; proxy_set_header GEOIP_COUNTRY_CODE3 $geoip_country_code3; proxy_set_header GEOIP_COUNTRY_NAME $geoip_country_name; proxy_set_header GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code; proxy_set_header GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3; proxy_set_header GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name; proxy_set_header GEOIP_REGION $geoip_region; proxy_set_header GEOIP_CITY $geoip_city; proxy_set_header GEOIP_POSTAL_CODE $geoip_postal_code; proxy_set_header GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code; proxy_set_header GEOIP_LATITUDE $geoip_latitude; proxy_set_header GEOIP_LONGITUDE $geoip_longitude;
Testing GeoIP module
Let’s create a simple PHP test to find out the output of the variables:
<html> <body> <?php $geoip_country_code = getenv(GEOIP_COUNTRY_CODE); /* $geoip_country_code = $_SERVER['GEOIP_COUNTRY_CODE']; // works as well */ $geoip_country_code3 = getenv(GEOIP_COUNTRY_CODE3); $geoip_country_name = getenv(GEOIP_COUNTRY_NAME); $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 'country_code: '.$geoip_country_code.'<br>'; echo 'country_code3: '.$geoip_country_code3.'<br>'; echo 'country_name: '.$geoip_country_name.'<br>'; echo 'city_country_code: '.$geoip_city_country_code.'<br>'; echo 'city_country_code3: '.$geoip_city_country_code3.'<br>'; echo 'city_country_name: '.$geoip_city_country_name.'<br>'; echo 'region: '.$geoip_region.'<br>'; echo 'city: '.$geoip_city.'<br>'; echo 'postal_code: '.$geoip_postal_code.'<br>'; echo 'city_continent_code: '.$geoip_city_continent_code.'<br>'; echo 'latitude: '.$geoip_latitude.'<br>'; echo 'longitude: '.$geoip_longitude.'<br>'; ?> </body> </html>
Apply the changes:
service nginx restart
Read more about Nginx GeoIP module: http://wiki.nginx.org/HttpGeoipModule