GeoIP

Dev/ETC 2009. 7. 23. 06:42
웹에서 접속자의 위치정보, 그중 국가/나라를 알아야 되는 경우가 있다. 이 방법은 접속자의 ip를 기준으로 국가를 알아내는 방법이다.
GeoIP는 해당 ip가 어느 국가에 속해있는지를 DB로 제공하고 있다. 이DB는 여러가지 형태로 제공되고 있는데 그중 csv포멧을 가져와서 사용하는 방법을 정리하였다.

Step 1.
http://www.maxmind.com/app/geoip_country
에서 csv파일 다운

Step 2.
CREATE DATABASE geoip;
USE geoip;

CREATE TABLE csv (
  start_ip CHAR(15) NOT NULL,
  end_ip CHAR(15) NOT NULL,
  start INT UNSIGNED NOT NULL,
  end INT UNSIGNED NOT NULL,
  cc CHAR(2) NOT NULL,
  cn VARCHAR(50) NOT NULL
);

CREATE TABLE cc (
  ci TINYINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
  cc CHAR(2) NOT NULL,
  cn VARCHAR(50) NOT NULL
);

CREATE TABLE ip (
  start INT UNSIGNED NOT NULL,
  end INT UNSIGNED NOT NULL,
  ci TINYINT UNSIGNED NOT NULL
);

Step 3.
다운 받은 csv파일을 csv.csv로 파일명 변경. csv.csv를 /var/lib/mysql/geoip/에 넣기.
MYSQLID, MYSQLPASS는 각각 id와 password로 바꿔서 적으면 된다.

mysqlimport --fields-terminated-by="," --fields-optionally-enclosed-by=""" --lines-terminated-by="n" --host=localhost --user=MYSQLID --password=MYSQLPASS geoip csv.csv

Step 4.
INSERT INTO cc SELECT DISTINCT NULL,cc,cn FROM csv;
INSERT INTO ip SELECT start,end,ci FROM csv NATURAL JOIN cc;

Step 5.
이제 웹에서 사용가능. 자세한 것은 아래 php코드 참고.

$connect = mysql_connect("localhost",$dbID,$dbPASS) or die("SQL server에 연결할 수 없습니다.");
mysql_select_db('geoip', $connect);

$remote = $_SERVER['REMOTE_ADDR'];
$ipnum = sprintf("%u", ip2long($remote));
 
$query="SELECT cc, cn FROM ip NATURAL JOIN cc WHERE ".$ipnum." BETWEEN start AND end";
$result=mysql_query($query,$connect) or die(mysql_error());
if((! $result) or mysql_numrows($result) < 1) {
     $lang = 'EN';
   }
   else {
   $data=mysql_fetch_array($result);
$lang =$data[cc];
}

: