블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2011.12.01 12:04

[ Perl / AdventCalendar ] 펄 크리스마스달력 2011 시작되었습니다.


  
    첫째 날: 네모 반듯한 표 그리고 한글

  @keedi 님의 글을 시작으로 Seoul.pm 펄 크리스마스 달력 2011 이 시작되었습니다.

  이 모든 게 다 @keedi++ 님의 은총..

  전 그냥 대놓고 밥숫가락 얹을려고...

오늘의 착한 일 - http://t.co/0VhZn5NE 작년 기사들의 URL 이 바뀌어서 301 설정.Thu Dec 01 02:39:53 via Echofon


  
  

  아파치 설정이나 추가했습니다.
 
신고
IT/Tips 2011.10.21 14:35

퍼포먼스 개선, 안전성 향상을 위한 Apache 설정

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

IT/Perl 2010.01.04 13:06

[ Perl ] Catalyst + Plack + Apache

  최근에야 듣보 Web App Framework 에서 Catalyst 로 완전히 옮기게 되었습니다. 개발속도는 안 써봐서 그런지, 좀 느린 감은 있었지만, 기존에 해오던 대로 쓰니까 크게 차이는 없어서 무난히 개발을 할 수 있었습니다. 
  예전에는 FastCGI 띄우고, Apache 에서 mod_fastcgi  붙여서 서버 띄우곤 했는데, 최근에 Server::Starter 가 Plack 에 붙어줘서(Plack::Server::Standalone::Prefork::Server::Starter) mod_proxy 를 써서 Apache 에 접붙이기를 하고 있습니다. 

 왜 Server::Starter 냐? 
  기존의 웹 어플에서는 코드 수정이 이뤄질때마다 서버를 다시 띄워야 되며, 이때의 작은 downtime 이 발생하게 되지만, Server::Starter 를 사용하면  downtime 없이 웹 어플의 재기동이 가능하게 된다는 것입니다. 

  대충 이런 형식입니다. 

  |Apache|  -----  |Plack(::Server::Standalone::Prefork::Server::Starter)| --- |Catalyst|

  우선 사전준비로써,
  Apache 가 있고, mod_proxy 를 사용가능하며, 

  CPAN 모듈로는 
  PSGI 
  Plack 
  Server::Starter 
  Plack::Server::Standalone::Prefork::Server::Starter 
  등이 필요합니다. 
   그리고 물론 WebApp 도 있어야 되겠죠? 여기에서는 Catalyst 를 사용합니다.  Catalyst에서 Plack 엔진을 사용하려면 Catalyst::Engine::PSGI 가 있어야 합니다. 
 
  모든 준비가 끝났다면 우선 Plack 용 .psgi 스크립트를 작성합니다.
 * app.psgi
use Plack::Builder;
use Zzoo::Web;
Zzoo::Web->setup_engine('PSGI');
my $app = sub { Zzoo::Web->new->run(@_) };
builder { 
   enable "Auth::Basic", authenticator => sub {
      my ($user, $pass) = @_;
      return $user eq 'pass' && $pass eq 'word';
   };
   $app;
};
  Auth::Basic 은 접속시 기본인증을 거치게 해줍니다. 

  Plack::Builder 를 통해서 여러가지 MiddleWare 를 사용할 수 있는데, Auth::Basic 이 그 대표적인 예 중 하나입니다. 
  이런 Middleware 는 Plack::Middleware::* 라는 네임스페이스를 가지며 이외에도 다양하고 유용한 미들웨어들이 존재합니다. 

  Apache 설정은 아래와 같습니다. 
 /etc/apache2/site-available/blahblah.blah.blah
<VirtualHost *:80>
   ServerAdmin  who@am.i
   ServerName    your.server.com
   <Location />
      Order allow, deny
      Allow from all
      ProxyPass http://localhost:5000/
   </Location>
</VirtualHost>

  Server::Stater 스크립트를 통해서 Plack을 기동합니다.
  
$ start_server --port=5000 -- plackup -s Standalone::Prefork::Server::Starter --max-workers 3 -a app.psgi  

  그리고는 해당 서버에 접속해서 동작을 확인합니다.  
  --max-workers 옵션으로 서버 기동시의 Prefork 되는 워커(프로세스)의 갯수를 지정할 수 있습니다.
  -s 옵션으로 Plack Server 를 지정합니다. Plack::Server::* 의 네임스페이스를 가지는 모듈이 이에 해당합니다. 
  -a 옵션으로 psgi 스크립트를 지정합니다. 
  그외 여러가지 옵션이 있지만 여기에서는 생략하겠습니다. 

  이렇게 기동한 프로세스는 
$ killall -HUP start_server
  을 통해서 앞에서 말한 downtime 이 없는 서버재기동이 가능하게 됩니다. 

  여러모로 설명을 생략해버렸지만, Plack 에 대해서는 차후에 천천히 처음부터 차근차근 소개해볼까 합니다.

  참고자료
신고

'IT > Perl' 카테고리의 다른 글

[ Perl ] Twitter Steam + IRC = Twit2IRC  (2) 2010.01.04
[ Perl ] Catalyst + Plack + Apache  (0) 2010.01.04
[ Perl ] Cafe Crawler  (0) 2010.01.03
Rakudo Perl 6 development release #24 ("Seoul")  (1) 2009.12.18
IT/Tips 2009.02.21 12:13

[ Apache ] mod_access_token 을 사용해봤습니다.

  mod_access_token 은 일본의 대형IT업체인 livedoor labs 에서 공개한 아파치 모듈입니다.

 - http://blog.livedoor.jp/edge_labs/archives/717201.html

  mod_access_token 을 사용함으로 웹사이트 상의 그림 이나 각종 파일에 유효기한을 설정해서 유저에게 일시적인 다운로드를 허용하도록 하는 것입니다. 저희 회사 같은 경우에도 중요도에 따라서 클라이언트에게 보내는 문서등에 원타임 패스워드를 발행하거나, 저런식으로 유효기한을 설정하거나, 다운로드 횟수 제한을 걸어두기도 합니다.

  아쉽게도 mod_access_token 에는 아직 원타임 패스워드나 다운로드 횟수 제한 등에 관한 구현은 없으며, 단순한 토큰발행으로 유효기한만을 설정할 수 있습니다.

  - http://code.google.com/p/modaccesstoken/
  - http://modaccesstoken.googlecode.com/files/mod_access_token-0.10.tar.gz

 위의 구글코드에서 mod_access_token 설치파일을 받을 수 있습니다. 자세한 건 그 안의 README 파일을 읽어보시면 쉽게 설명되어 있을 겁니다. 그리고 토큰 발행을 위한 방법과, 토큰 발행을 위한 펄 스크립트 코드도 제공되어 있습니다.

  제 서버에 설정해놓은 간단한 예제는 아래와 같습니다.

  우선 Location 설정을 /access 로 놓고, AccessKey 등을 설정합니다.
  그리고 토큰을 발행할 대상 파일은 아래와 같습니다.

    http://www.myemy.com/access/whitecatz.txt
 
  위 파일에 접근하면 403 Forbidden, 접근할 권한이 없다고 나옵니다.
  그래서 위 파일에 대한 토큰을 발행합니다.

  위의 tar.gz 를 해제하면 eg/sign.pl 파일이 있습니다. <URL> + <Access> + <Secret> + <Expire> 를 지정하고, 아래와 같은 URL 을 받았습니다.

   http://www.myemy.com/access/whitecatz.txt?Signature=L3D8mlK1b5HU%2BNqk2NUK0KN%2FPx4&AccessKey=bar&Expires=1245103297

  그러면 whitecatz 의 정체를 말해주는 파일의 내용을 볼 수 있습니다. 위에 발행된 URL 도 유효기한이 지나면 위처럼 403 Forbidden 이 나오겠죠. mod_access_token 은 이런 식으로 동작합니다. 조금 생각해보면 간단하게 Web App 를 연결해서 각종 업무에 도입할 수 있을 것입니다.
  개인적으로는 조금만 더 발전하면 좋겠다라는 생각도 하지만요. 뭐, 물론 Web App 로 mod_access_token 에서 하는 그런 것들이나, 부족한 것들을 구현해낼 수도 있겠죠.
신고
Project 2008.03.26 19:47

[PERL] 급조 Access Log에서 검색 키워드만 뽑아서 샥샥샥...


 관리하고 있는 어느 사이트의 검색 기능을 손 봐야될 필요성이 있어서...

 일단은 어떤 걸로 검색되고 있는지 알아보려고 하던 차에...

 
사용자 삽입 이미지

떡밥 등장 : Apache Log


마침 #perl 방에서도 비슷한 떡밥이 돌아다니고 있었다.

사용자 삽입 이미지

Apache::ParseLog 쓸려고 했는데... L모님께서 "모듈씩이나..." 하는 바람에...


 싱싱하던 떡밥이 펄펄 날뛰고 있을 때 하려던 것이 시간이 지나고 지나고...
 
사용자 삽입 이미지

일단 access log는 뭐.. 이번달 분량만 해봤습니다.


 
use strict;
use warnings;
use Data::Dumper;
use Path::Class;

my $dir = Path::Class::dir("./");

my $data;
while(my $file = $dir->next) {
    next if $file->is_dir;
    next unless $file->basename =~ /^lighttpd/; # lighttpd.access_log.YYYY-mm-dd

    open my $fh, "<", $file or next;
    while(<$fh>) {
        if (/GET \/search\/\?(.*) HTTP\/1\.1/) { # 검색부분만 뽑아서
            my $url = $1;
            my @data = map { my @p = split /=/, $_; +{ name => $p[0], value => $p[1] } } split /\&/, $url;

            my $set;
            foreach my $blah (@data) {
                if ($blah->{name} eq 'keyword' && defined $blah->{value}) {
                    my $keyword = urldecode($blah->{value}); #URL_DECODE시키고...
                    $data->{$keyword}++;
                } # else blahblahblahblah... id 있음 뭐하고... 딴 거 있음 뭐하고...
            }
        }
    }
    print STDERR $file->basename." is white-catted\n";  #White-Catted 시켜서(의미없음)
}

foreach my $key (sort { $data->{$b} <=> $data->{$a} } keys %{ $data }) { # 정렬해서...
    print $key."\t".$data->{$key}."\n";   # 찍어바르기...
}

sub urldecode {
    my $value = shift;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/seg;
    $value;
}

이렇게 깨작거렸다. 결과는 제대로 나오는 데... 인코드를 보니까 BINARY로 되어있었지요.

아마 "binmode(STDOUT, ":utf8")" 을 넣으면 UTF-8으로 결과가 나올 겁니다.

걍 귀찮아서 셸에서 "nkf --utf-8 [FILE]" 해서 키워드 중에 일본어등을 보이게 해버렸습니다.

이런 거 하면서... 문제라고 느끼는 게 뭐냐면...

예전에 이런거 해놓고서는 스크립트 어디있는 지 까먹어서 다시 만들고 있다는 것입니다.

그래서 코드는 제대로 된 관리가 필요하다는 것을 새삼 깨닫고 있습니다. (그래봐야 나중에는 뭐...)
신고
TOTAL 484,112 TODAY 30

티스토리 툴바