n사 다닐때 글로벌 모바일 게임 웹 서버를 구축하는 프로젝트를 했었는데, 처음엔 싱가포르 지역에만 구축을 했었고
추후 기획의 요구사항이 국가코드.도메인.com/게임명 url로 해당 국가에 설치된 서버로 접속하도록 하는 것이었다.
예를 들면, 북미에서 접속할때는 us.domain.com/game1, 중국에서 접속할때는 cn.domain.com/game1 이런 식이었다.
지금은 잘 기억나지 않지만, 인프라에서 global dns 서비스를 구축하면 가능했던 걸로 확인을 했었으나 비용 등의 문제로
이 방법은 사용하지 못했고 대신 애플리케이션 레벨에서 처리를 하기로 마음 먹고 진행한 것이 geoIP를 이용해 해당 국가 코드를
알아내고 그 국가의 서버로 redirect 시키는 것이었다. 이를 바탕으로 간단히 정리해본다.
(실제로는 서비스는 종료되어 이 방법을 리얼 환경에 적용해보지도 못했음.)
- mod_perl 아파치 모듈을 이용해 perl 스크립트로 아파치 단 요청과 응답 사이에 로직을 추가하여 실행할 수 있다.
일반적으로 perl 스크립트는 실행시마다 컴파일이 되지만 mod_perl 을 이용할 경우 아파치 서버가 시작될 때 perl 모듈과
스크립트들이 한번만 컴파일이 되면 그 이후부터는 컴파일된 모듈이 아파치 내부에서 동작하게 된다.
- 읽어보면 도움이 될만한 사이트
- 2.2.x 와 호환 가능한 버전을 다운로드 받으면 된다. http://perl.apache.org/dist/mod_perl-2.0-current.tar.gz
2. 설치방법
1) tar zxvf mod_perl-2.0.-cyrrent.tar.gz 한 후 해당 폴더로 이동
2) perl Makefile.PL MP_APXS=/usr/local/apache/bin/apxs
3) make
4) make test
5) sudo make install
-----------------------
3. httpd.conf 추가
LoadModule perl_module modules/mod_perl.so
를 추가한 뒤 아파치 재시작이 성공하면 OK
4. 펄 모듈 생성
1) cd /home/www/perl; mkdir MyApache2; cd MyApache2;
2) vi startup.pl 한 뒤 아래 내용 입력 후 저장
use lib qw(/home/www/perl); // perl 설치 경로 1; |
3) vi RedirectUrl.pm 한뒤 아래 내용 입력후 저장
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; |
5. httpd.conf에 모듈을 사용하도록 설정 추가
<IfModule mod_perl.c> PerlRequire /home/www/perl/MyApache2/startup.pl <Location ~ "/*"> SetHandler perl-script PerlResponseHandler MyApache2::RedirectUrl // 사용자 정의 모듈 </Location> </IfModule> |
6. 필요시 XML 파싱을 위한 XML::Simple, XML::Parser 설치
yum install expat-devel;
cpan install XML::Simple;
cpan isntall XML::Parser;
cpan isntall APR::Table;
'Apache & Nginx' 카테고리의 다른 글
[Apache] 로그인 계정 세팅 (0) | 2015.09.03 |
---|---|
[Apache] 프로세스 생성 방식에 따른 비교 (0) | 2015.09.03 |