admin write
blogblogblogbloglocation loglocation logtag listtag listguest bookguest book
rss feed

L4, LVS, DNS RR 등으로 여러대의 웹서버를 운영하다보면
늘 고민하게 되는게 세션 공유일 것 같다.

물론 L4의 Metric 중에 Hash를 이용하면 어느정도 해결 될 수 있는 문제이지만,
가끔 클라이언트가 다른 서버로 세션이 할당되는 경우를 볼 수 있다.

나 또한 이 문제로 많은 고민을 했고, 여러 많은 HOW를 보았지만 썩 마음에 드는것이 없었다.
아마 세션 공유를 위해서 사용되는 방법은 아래의 3가지가 가장 보편적이지 않을까 싶다.

1. NFS, Samba
특정 서버의 디렉토리를 다수의 웹서버에서 Network를 통해 공유하는 것이다.
그럼 한곳의 디렉토리에 모든 세션 파일이 존재할 것이고 문제는 해결이 된다.
그렇지만 NFS나 Samba는 Write 효율성이 상당히 떨어지는 데몬이다.
세션은 그 특성상 read/write가 매우 빈번히 일어나기 때문에 효율성 면에서는 좋지 않다.
(개인적으로 이 방법을 사용하다가 피본적이 있다-_-;;)

2. DBMS
세션 데이터를 DBMS와 연동하여 DB에 저장하는 방식이다.
보편적으로 주로 사용되는 방법이지만, 접속자가 매우 많은 환경에서는
DB서버에 부하가 늘어날 수 밖에 없는 구조이다.
또한 DBMS에서 생기는 lock도 무시못할 변수로 떠오를 수 있다.

3. Daemon
말 그대로 데몬을 이용하여 세션을 공유하는 방식이다.
세션서버를 따로 구축하기에 제일 적절한 방법이 아닐까 싶다.

늘 그렇지만.. 난 언제나 서론이 참 길다.
오늘은 sharedance 라는 데몬을 소개하고자 한다.
지인의 소개로 알게된 데몬인데..
약 2년정도를 15대의 웹서버에 적용해서 사용하고 계신다는데.. 별 문제는 없으시다고 한다.
그래서 현재 우리 회사에서도 적용중인 데몬이다.

1. 세션 서버 구성
이 데몬은 세션 서버로 사용될 서버에만 설치해주면 된다. 웹서버에는 설치할 필요가 없다.
sharedance의 최신버전은 http://sharedance.pureftpd.org/ 여기서 구할 수 있으며,
RPM으로 구하고 싶다면 http://rpm.pbone.net/ 에서 sharedance로 검색하면 된다.

1-1. RPM 설치
설치 끝났다. 참 쉽다. -_-

1-2. config 설정
sharedance의 환경설정 파일은 /etc/sysconfig/sharedance 에서 해주면 된다.
설정할 내용이 많은 것도 아니고, 달랑 2개면 된다.
SHAREDANCE_DIR="/var/lib/sharedance"
SHAREDANCE_OPTIONS="--expiration=1800 --timeout=1800"
SHAREDANCE_DIR 은 세션 파일이 저장될 디렉토리를 의미한다.
SHAREDANCE_OPTIONS 는 데몬을 시작할때 사용할 옵션을 지정해주는 것이다.
어떤 옵션들이 있는지 보고 싶다면 sharedanced --help 라고 치면 나온다.

1-3. sharedance 시작
[root@localhost]# /etc/init.d/sharedance start
이제 sharedance 사용 준비가 모두 완료 되었다.


2. Client 설정 (웹서버)
웹서버는 크게 설정하거나 설치할 내용이 없다.
단순히 php.ini에서 sharedance의 handler 파일만 호출해주도록 설정하면 된다.

2-1. handler 파일 준비
이 파일을 직접 만들 필요는 없고, sharedance 에서 제공하는 파일을 그대로 가져다 쓰면 된다.
세션서버에서 sharedance를 RPM으로 설치했다면,
/usr/share/doc/sharedance-0.6/php/ 에 핸들러 파일이 존재할 것이다.
[root@localhost]# ls /usr/share/doc/sharedance-0.6/php
session_handler.php  sharedance.php  test_session.php  test_sharedance.php
필요한 파일은 session_handler.php와 sharedance.php 파일이다.
이 2개의 파일을 웹서버로 전송한다.

2-2. handler 파일 복사 및 설정
세션서버에서 전송받은 핸들러 파일을 적당한곳에 잘 복사해두면 된다.
필자는 편의상 서버 운영에 필요한 파일을 한곳에 몰아서 관리하고 있기 때문에
/etc/sadmin/httpd/sharedance 에 복사를 했다.

핸들러 파일이 세션서버를 이용할 수 있도록, 핸들러 파일을 약간 수정해야 된다.
그렇지만 그리 어려운 내용은 아니기 때문에 쉽게 수정할 수 있다.
[root@localhost]# vi /etc/sadmin/httpd/sharedance/session_handler.php
define('SESSION_HANDLER_HOST', '192.168.0.100');
이 부분은 세션서버를 지정해주는 부분이다.
만약 세션서버가 같은 서버에서 돌고 있다면 localhost로 지정하면 될 것이고,
다른 서버에서 돌고 있다면 그 서버의 ip 혹은 host를 적어주면 된다.

[root@localhost]# vi /etc/sadmin/httpd/sharedance/sharedance.php
define('SHAREDANCE_DEFAULT_PORT', 1042);
define('SHAREDANCE_DEFAULT_TIMEOUT', 10);
이 부분은 세션서버의 listening port와 timeout 시간을 설정해주는 부분이다.
만약 세션서버에서 데몬의 포트가 다르게 설정되어 있다면 이곳에서 수정을 해주면 된다.

2-3. php.ini 설정
이제 모든 준비가 끝났으므로 웹서버의 PHP에서 session을 이용할때
sharedance의 핸들러를 통해 세션서버와 통신하도록 설정해주기만 하면 된다.
[root@localhost]# vi /etc/php.ini
...
auto_prepend_file = /etc/sadmin/httpd/sharedance/session_handler.php
...
session.save_handler = user
php.ini 수정이 모두 끝났으면 웹서버를 재시작하여 변경된 php.ini의 내용을 reload 시킨다.

3. sharedance 확인
모든 설정과 준비가 끝났다.
세션서버에 세션파일이 잘 생성 되는지 확인을 해보자.
[root@localhost]# ls /var/lib/sharedance
01c6hof0u872jp3grka4ifo3u4  4u44789jq4vtjt7l2fp3t1ime6  e7d6nq244j27l8bllif792pp25
...
...
위와 같이 세션파일이 생성이 된다면, 정상적으로 웹서버와 세션서버가 통신하고 있는 것이다.

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. ctlim
    2010.06.07 10:36 신고
    댓글 주소 수정/삭제 댓글
    좋은 정보 감사 합니다.
    퍼가요~^.^
  2. 헬로우~^^
    2010.08.22 07:57 신고
    댓글 주소 수정/삭제 댓글
    제가 잘 몰라서.. 질문을 드립니다.
    Daemon (세션서버)을 설치, 위에서 설명해 주신대로 설정을 하면
    다른 도메인간 세션공유도 되는건가요?

약 2개월간의 데이터 수집끝에 최근 아파치 access 로그에 남는 referer 수집이 대략적으로 끝났다.
이 referer를 참고해서 검색엔진들의 봇을 막을 수 있을 것이다.
(물론 이것은 일시적이고 한정적이기 때문에, 계속해서 추가되어져야 되겠지만 말이다.)

액세스 로그를 분석했을 경우 나오는 리스트
웹로그 분석기로 분석한 이름 = 실제로 액세스 로그에 남는 이름
MS Internet Explorer = MSIE
Firefox = Firefox
Opera = Opera
Netscape = Netscape
Firbird (Old Firefox) = Firbird
K-Meleon = K-Meleon
Nokia Browser (PDA/Phone browser) = Nokia
Konqueror = Konqueror
Safari = Safari
Curl = Curl
Wget = Wget
Unknown robot (identified by 'robot') = NaverBot
Yahoo Slurp = Yahoo! Slurp
ConveraCrawler = ConveraCrawler
EchO! = BonEcho
GigaBot = GigaBot
findlinks = findlinks
MSNBot = MSNBot
Unknown robot (identified by 'bot/' or 'bot-') = msnbot-media
Alexa (IA Archiver) = Alexa Toolbar
Python-urllib = Unknown (딱 한번 긁혔던데 로그가 지워져서 모르겠음-_-;)
SurveyBot = SurveyBot
psbot = psbot
Googlebot = Googlebot
Feedfetcher-Google = Feedfetcher-Google
OufoxBot = OufoxBot
Netcraft = Netcraft

대충 보면 알겠지만 MSIE부터 Wget까지는 정상적인 브라우저들이다.
봇의 시작은 NaverBot 부터..
이게 굉장히 웃긴게 웹로그 분석기(awstats 기준)에서 보여주는 이름과
실제로 액세스 로그에 남는 이름이 서로 다른것들이 가끔씩 있다.
따라서 웹로그 분석기에서 출력해주는 이름을 가지고 막으면 대략 낭패를 볼 수 있으므로
주의를 해야할 것이다.

현재 tini4u.net 서버는 아래와 같이 차단하고 있다.
## No Get.
BrowserMatch "WebZIP" go_out
BrowserMatch "Teleport" go_out
BrowserMatch "NamoWebEditor" go_out
BrowserMatch "WebSymmetrix" go_out
BrowserMatch "GetRight" go_out
BrowserMatch "WebCopier" go_out
BrowserMatch "FlashGet" go_out
BrowserMatch "Nimo" go_out
BrowserMatch "Googlebot" go_out
BrowserMatch "MSNBot" go_out
BrowserMatch "msnbot-media" go_out
BrowserMatch "Yahoo" go_out
BrowserMatch "Feedfetcher-Google" go_out
BrowserMatch "Alexa" go_out
BrowserMatch "OutfoxBot" go_out
BrowserMatch "Netcraft" go_out
BrowserMatch "Gigabot" go_out
BrowserMatch "findlinks" go_out
BrowserMatch "NaverBot" go_out

하나의 사이트에서도 여러개의 봇을 운영하는것을 느꼈는가?
검색엔진 잔인하다-_-;;

추가 -> BonEcho는 현재 Gentoo Linux에서 테스트로 사용중인 FireFox의 Compatible Name 이라고 하는군요.

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. 2006.12.21 00:56 신고
    댓글 주소 수정/삭제 댓글
    네. 현재 젠투 사용중인데, Bon Echo로 나오더군요.
    어차피 웹브라우져라고는 그것밖에 깐게 없어서 크게 상관없음 :)
    • 2006.12.22 11:03 신고
      댓글 주소 수정/삭제
      처음에 BonEcho까지 같이 막았다가..
      FF 사용자들이 접속을 못하는 에피소드가 있었지.. ㅎㅎ
      지금은 제거했지만.. ㅎㅎ