n사 다닐때 글로벌 모바일 게임 웹 서버를 구축하는 프로젝트를 했었는데, 처음엔 싱가포르 지역에만 구축을 했었고
추후 기획의 요구사항이 국가코드.도메인.com/게임명 url로 해당 국가에 설치된 서버로 접속하도록 하는 것이었다.
예를 들면, 북미에서 접속할때는 us.domain.com/game1, 중국에서 접속할때는 cn.domain.com/game1 이런 식이었다.
지금은 잘 기억나지 않지만, 인프라에서 global dns 서비스를 구축하면 가능했던 걸로 확인을 했었으나 비용 등의 문제로
이 방법은 사용하지 못했고 대신 애플리케이션 레벨에서 처리를 하기로 마음 먹고 진행한 것이 geoIP를 이용해 해당 국가 코드를
알아내고 그 국가의 서버로 redirect 시키는 것이었다. 이를 바탕으로 간단히 정리해본다.
(실제로는 서비스는 종료되어 이 방법을 리얼 환경에 적용해보지도 못했음.)
use lib qw(/home/www/perl); // perl 설치 경로 1; |
package MyApache2::RedirectUrl; use warnings; use XML::Simple; use APR::Table; use Apache2::Connection (); use Apache2::RequestRec (); use Apache2::RequestIO (); use Apache2::Const -compile => qw(REDIRECT); use LWP::UserAgent; use HTTP::Request; use HTTP::Headers; use Encode; sub handler { my $r = shift; $r->content_type('text/plain'); $r->content_encoding('utf-8'); my $c = $r->connection; my $clientIp = $c->remote_ip; my $address = "geoIP를 이용하여 국가코드를 리턴하는 api(사내주소여서 공개할 수 없음)"; my $objUserAgent = LWP::UserAgent->new(timeout => 2); $objUserAgent->agent("TEST/TEST"); my $objHeader = HTTP::Headers->new; $objHeader->push_header("Content-Type" => "text/plain"); my $objRequest = HTTP::Request->new(GET=>"$address", $objHeader); my $objResponse = $objUserAgent->request($objRequest); my $content = $objResponse->content; # Test XML #my $content = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>...주소데이터..."; my $xml = new XML::Simple; my $data = $xml->XMLin($content); if (defined($data->{error})) { my $errCode = $data->{error}; my $errMsg = "warning : "; if($errCode eq "1001") { $errMsg .= "ERROR_IP_NOTFOUND"; } if($errCode eq "1002") { $errMsg .= "ERROR_DB_SEARCH"; } if($errCode eq "2001") { $errMsg .= "ERROR_NETWORK"; } if($errCode eq "2002") { $errMsg .= "ERROR_NETWORK_TIMEOUT"; } if($errCode eq "2003") { $errMsg .= "ERROR_NETWORK_UNKNOWN"; } if($errCode eq "3001") { $errMsg .= "ERROR_IP_INVALID"; } if($errCode eq "4001") { $errMsg .= "ERROR_MAXMIND"; } print $errMsg; } else { my $countryCode = $data->{country}; if($countryCode eq "CN") { print "access denied....!(Country Code : CN) \n"; } elsif($countryCode eq "SG") { print "access denied....!(Country Code : KR) \n"; } elsif($countryCode eq "KR") { # 특정주소로 Redirect my $URL = "redirect할 주소"; $r->headers_out->set('Location' => $URL); return Apache2::Const::REDIRECT; } else { print "# welcome! \n"; } } return Apache2::Const::OK; } 1; |
<IfModule mod_perl.c> PerlRequire /home/www/perl/MyApache2/startup.pl <Location ~ "/*"> SetHandler perl-script PerlResponseHandler MyApache2::RedirectUrl // 사용자 정의 모듈 </Location> </IfModule> |
'Apache & Nginx' 카테고리의 다른 글
[Apache] 로그인 계정 세팅 (0) | 2015.09.03 |
---|---|
[Apache] 프로세스 생성 방식에 따른 비교 (0) | 2015.09.03 |