Category Archives: UNIX

CentOS 5.2에서 lighttpd 설치

전에 CentOS 4에서 lighttpd 설치하는 방법에 대한 글을 썼었는데 5에서는 설치가 많이 편해졌네요 :)

저는 CentOS 5.2 x86_64 버전에서 설치하였습니다.

lighttpd는 http://dag.wieers.com/rpm/packages/lighttpd/ 에서 바이너리를 구해서 설치했습니다. 32 비트 버전에서는 i386.rpm을 받아서 설치하세요~

# wget http://dag.wieers.com/rpm/packages/lighttpd/lighttpd-1.4.18-1.el5.rf.x86_64.rpm
# wget http://dag.wieers.com/rpm/packages/lighttpd/lighttpd-fastcgi-1.4.18-1.el5.rf.x86_64.rpm
# rpm -i lighttpd-1.4.18-1.el5.rf.x86_64.rpm lighttpd-fastcgi-1.4.18-1.el5.rf.x86_64.rpm

php는 따로 컴파일하지 않고 php-cli 패키지에 포함된 /usr/bin/php-cgi 를 이용하면 되더군요. xcache는 소스를 받아서 설치했습니다.

lighttpd와 php(php-cli) 설치하시고 /etc/lighttpd/lighttpd.conf를 편집합니다. php fastcgi설정과 sys epoll 사용하도록 설정하는건 필수죠~

fastcgi.server              = ( “.php” =>
                               ( “localhost” =>
                                 (
                                  “socket” => “/tmp/php-fastcgi.socket”,
                                  “bin-path” => “/usr/bin/php-cgi”,
                                  “min-procs” => 1,
                                  “max-procs” => 2,
                                  “max-load-per-proc” => 4,
                                  “idle-timeout” => 10,
                                  “bin-environment” => ( “PHP_FCGI_CHILDREN” => “16”,
                                                         “PHP_FCGI_MAX_REQUESTS” => “2000” )
                                 )
                              )
                             )

server.event-handler = “linux-sysepoll”

xcache는 http://www.howtoforge.com/xcache-php5-apache2-fedora8-centos5.1 를 참고해서 설치했습니다. 과정이 다 필요한지는 모르겠지만 그냥 그대로 따라했습니다.

# yum install php-devel
# yum groupinstall ‘Development Tools’
# yum groupinstall ‘Development Libraries’
# wget http://xcache.lighttpd.net/pub/Releases/1.2.2/xcache-1.2.2.tar.gz
# tar xzvf xcache-1.2.2.tar.gz
# cd xcache-1.2.2
# phpize
# ./configure –enable-xcache
# make
# make install
# cp xcache.ini /etc/php.d
# vi /etc/php.d/xcache.ini

마지막 ini 파일 편집시 zend_extension은 모두 주석처리하고 extension = xcache.so만 주석을 풀었습니다.

마지막으로 시스템 시작할때 lighttpd 실행할수 있도록, 아파치 대신 lighttpd를 실행되도록 했습니다.

# /usr/sbin/apachectl stop
# /sbin/chkconfig httpd off
# /sbin/chkconfig –add lighttpd
# /sbin/chkconfig lighttpd on
# /etc/init.d/lighttpd start

방화벽(iptables)은 설치할때 22와 80번 포트는 풀어줬었습니다. 혹시 방화벽이 안 풀려있다면… /etc/sysconfig/iptables 파일을 편집해서 다음 라인을 적당한 곳(REJECT 이전)에 넣고…

-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT

iptables를 다시 시작하고 설정을 저장~ (저장 안하면 리부팅하면 설정 날라가요)

# /etc/init.d/iptables restart
# /etc/init.d/iptables save

그리고 selinux 기능을 사용중이고 일반 사용자 계정에서 웹페이지가 서비스 되게 하려면…

# su – webuser
$ chmod og+x ~
$ chcon -R -t httpd_user_content_t public_html

lighttpd 모듈

lighttpd 사용하면서 여러 모듈 덕을 많이 보고 있는데, 정리를 좀 해봤습니다.

기본 모듈:

URL 처리 관련 모듈:

보안 모듈:

연동 모듈:

퍼포먼스 향상 모듈:

  • mod_cache : 요청한 내용 파일로 캐싱
  • mod_mem_cache : 요청한 내용 메모리에 캐싱

  • mod_expire : Expire 값 조정. (이미지등 재요청 오랫동안 안하게)
  • mod_compress : 내용 압축해서 보내기 (캐시 파일로 저장)
  • mod_secdownload : URL 암호화, 타임아웃
  • mod_trigger_b4_dl : 특정 URL 방문후 다운로드 가능하도록
  • mod_cml : cache meta language (mod_magnet이 대체)
  • mod_magnet :mod_cml 대신 새로나온 모듈. request 처리 로직 변경할수 있음. 헤더/페이지 조회/수정. Lua 언어로 프로그래밍 가능.

virtual hosting: 설정 파일만으로도 설정 가능.

기타 :

  • mod_useronline : IP별 온라인 사용자수 계산. $_ENV[‘USERS_ONLINE’]에 저장.
  • mod_usertrack : 사용자별 쿠키 할당

lighttpd 1.5에서 부터 지원할것.

FreeBSD 쉘에서 색 사용

사용환경: FreeBSD 6.x, tcsh 또는 bash, 윈도우용 putty 터미널.

리눅스에 비해 FreeBSD를 사용하면 기본적으로 쉘상에서 색상이 거의 안나오는데, 몇가지 설정을 하면 리눅스 부럽지 않게 화려(?)해집니다.

tcsh 사용자는 .cshrc에 아래를 적당한 위치에 추가합니다.

setenv CLICOLOR
setenv LSCOLORS Exfxcxdxbxegedabagacad

set mch = `hostname -s`
alias prompt ‘set prompt = “%{\033[1;33m%}$mch%{\033[0m%}:%{\033[1;34m%}$cwd%{\033[0m%}> “‘

첫줄은 ls에서 기본적으로 색이 출력되도록 합니다. 두번째 줄은 폴더에 할당된 색이 기본적으로 파랑색인데 putty에서 파랑색이 눈에 잘 띄지 않아서 밝은 파랑으로 바꿔주었습니다. 자세한 것은 man ls

밑에서는 쉘 prompt에 색상이 출력되도록 했습니다. 색 지정은 이 페이지를 참조했습니다.

bash 사용자라면 .profile에 아래를 등록하세요.

export CLICOLOR=1
export LSCOLORS=Exfxcxdxbxegedabagacad
export PS1=”\[\033[1;33m\]\h\033[0m\]:\[\033[1;34m\]\w\]\033[0m\]> “

이렇게 하고 이전글에서 설명했던대로 .screenrc를 설정하면 아래와 같은 화면이 나옵니다:

GNU screen

Linux Reality에서 screen에 대한 Podcast를 듣고 screen에 대해서 모르던걸 알게됐네요. GNU screen은 하나의 물리적인 터미널 안에서 여러 터미널을 사용할수 있도록 해주는 프로그램입니다. 한 터미널에서 여러 작업을 할때 매우 유용합니다. 또한, 작업하던 세션을 종료하지 않고 빠져나온 다음에 다른 곳에서 세션을 이어서 작업할수 있기 때문에 회사와 집 등 여러곳에서 작업할때 같은 환경에서 그대로 작업을 할수 있습니다. Podcast 들으면서 새롭게 안 기능은 여러 터미널에서 같은 screen 세션에 동시에 접속해서 작업할수 있다는 내용인데, 직접 해보니 Pair Programming할 때 아주 유용할거 같습니다. 그래서 검색을 해보니 위키(한글)에도 이러한 내용이 소개되어 있네요.

약 5년전에 하이텔(?)에 올렸던 글이 있어서 약간 내용 보충해서 올립니다.

—–

원격에서 작업하다 보면 여러창을 보고 싶을때가 많지만, 따로 로그인 하기도 귀찮고, 여러창 왔다갔다 할때도 어느 터미널이 어느 기계인지 많아지면 관리가 안되죠 –; 이럴때 사용하면 편리한 것이 screen입니다.

screen은 한 터미널 화면에서 여러 쉘과 프로그램을 띄울수 있으며, 또한 세션 관리 기능도 지원해서 터미널을 종료해도 나중에 다시 그 세션으로 복귀할수 있기 때문에 정말 편리합니다. 저는 이제 로컬에서도 screen을 애용하고 있네요.

먼저 시작은

% screen

또는

% screen -S 세션명

으로 시작하고, screen 실행후 모든 명령은 Ctrl-a로 시작합니다:

Ctrl-a, c : (create) 새로운 쉘이 생기면서 그 쉘로 이동
Ctrl-a, a : 바로 전 창으로 이동
Ctrl-a, n : (next) 다음 창으로 이동
Ctrl-a, p : (previous) 이전 창으로 이동
Ctrl-a, 숫자 : 숫자에 해당하는 창으로 이동
Ctrl-a, d : (detach) screen 세션에서 빠져나옴
Ctrl-a, x : lock screen

Ctrl-a, [ : 화면에서 텍스트 선택하여 클립보드로 복사 (화면 스크롤 가능)
            이때 vi와 동일하게 커서 이동할수 있고, space로 영역을 선택
Ctrl-a, ] : 클릭보드 텍스트 붙이기

Ctrl-a, S : (split) 창을 나눔 (region)
Ctrl-a, Tab : 다른 region으로 이동
Ctrl-a, Q : 현재 region을 제외한 나머지 숨기기

Ctrl-a, : : 명령모드로 들어갑니다.

위 명령 정도를 알고있으면, 불편하지 않게 사용할수 있으며, detach 시 세션이 종료되는 것은 아니고

% screen -r 세션명

으로 그전 세션을 다시 불러들일수 있습니다. 여러 창을 쓴다는 장점도 있지만, 세션 관리가 되는것도 아주 큰 장점입니다.

세션이 여러개 있으면 screen -list 하면 세션명이 쭉 나오고 (-S로 지정하지 않았으면 자동으로 이름이 할당됩니다)

세션을 완전히 종료하기 위해서는 모든 창에서 빠져나오면(exit 등으로) screen을 빠져나옵니다. 한번에 종료할려면 Ctrl-a : quit 하면 전체 창이 종료됩니다. 하지만 창을 하나씩 확인하면서 종료하는게 안전하겠죠.

split으로 화면을 나누면, 나눠진 공간(region) 별로 다른 창으로 전환할 수 있습니다.

% screen -x 세션명

-x는 -r과 동일하지만 그 전에 연결된 터미널을 끊지않고 세션에 동시에 연결합니다. 같은 세션을 여러명이 공유할수 있고, 세션에서 같은 화면을 보고 있으면 작업하는 내용이 실시간으로 보입니다.

스크린 사용하면 원래 사용하는 터미널의 히스토리 버퍼가 정상적으로 동작하지 않는데, 이때 Ctrl-a, [ 또는 Ctrl-a, ESC 를 이용하면 지나간 텍스트를 볼수 있습니다. 버퍼 크기는 .screenrc에서 “defscrollback 라인수”로 정할수 있으며 디폴트 값은 약간 작은 100 라인 입니다.

다음은 제 .screenrc 파일입니다. hardstatus는 여기를 참고했습니다.

vbell off
defscrollback 500
hardstatus alwayslastline
hardstatus string ‘%{gk}[%{wk}%?%-Lw%?%{=b kR}(%{W}%n*%f %t%?(%u)%?%{=b kR})%{= kw}%?%+Lw%?%?%= %{g}][%{Y}%l%{g}]%{=b C}[%H]%{W}’

hardstatus를 설정해서 맨 아래줄에 화면 리스트와 load average, 호스트명 등을 표시해줍니다.

FreeBSD blackhole 기능

FreeBSD에서 DoS 공격을 근본적으로 막을 방법은 뾰족히 없지만 좀 느리게 만드는 방법입니다. PF(Packet Filter)로 잘 설정하고 싶지만 연결을 많이 유지하는 서버에서 PF가 성능저하가 있는거 같아서 일단 다른방법으로 대처했습니다.

man blackhole 하면 자세한 설명 볼수 있으며,

net.inet.tcp.blackhole와 net.inet.udp.blackhole을 세팅하면 됩니다.

# sysctl -w net.inet.tcp.blackhole=1
# sysctl -w net.inet.udp.blackhole=1

포트 스캔할때, 닫혀있는 포트에 대해서는 리셋(RST) 패킷이 날라가는데 이걸 아예 안보내게 합니다. tcp.blackhole의 경우 1이면 연결(SYN) 패킷에 대해서 RST를 안보내며, 2로 세팅하면 모든 패킷에 대해서 RST를 안보냅니다. UDP는 따로 연결 패킷이 없기 때문에 1로 세팅하면 닫혀있는 포트로 오는 패킷에 대해서 RST 응답을 안보내고 무시합니다.

포트스캔을 하면 없는 포트로 많은 패킷이 오기 때문에 RST 패킷이 많이 나가게 됩니다. 이럴 경우 시스템에 부하를 일으킬 소지가 있으므로, FreeBSD에서는 RST를 보낼때 1초에 200개의 RST 패킷만 보내도록 제한이 되어있습니다. 이를 넘을 경우 아래와 같은 경고 메시지가 dmesg 등에 나타납니다.

Limiting closed port RST response from 286 to 200 packets/sec
Limiting closed port RST response from 463 to 200 packets/sec

여기 IP 정보가 나오지 않기 때문에 정보를 보기 위해서는

# sysctl -w net.inet.tcp.log_in_vain=1
# sysctl -w net.inet.udp.log_in_vain=1

하지만 이렇게 하면 로깅되는 정보가 너무 상당히 때문에 시스템에 더 큰 부하를 일으킬 가능성이있습니다. 공격을 당하는 서버에서는 잠깐동안 기능을 켰다가 끄도록 아래처럼 실행하세요.

# sysctl -w net.inet.tcp.log_in_vain=1; sleep 5; sysctl -w net.inet.tcp.log_in_vain=0

위에 처럼 서버(SERVER_IP)에서 돌리고, 원격 서버(SCANNER_IP)에서 nmap을 돌려봤습니다. 스캔 당하는 SERVER_IP에서는 blackhole 기능은 끈상태입니다.

Connection attempt to TCP SERVER_IP:25 from SCANNER_IP:38947 flags:0x02
Connection attempt to TCP SERVER_IP:1723 from SCANNER_IP:38947 flags:0x02
Connection attempt to TCP SERVER_IP:3389 from SCANNER_IP:38947 flags:0x02
… (생략)
Limiting closed port RST response from 233 to 200 packets/sec
… (생략)
Limiting closed port RST response from 262 to 200 packets/sec
… (생략)
Limiting closed port RST response from 279 to 200 packets/sec

blackhole=1로 설정한 상태에서는 Limiting closed port… 메시지가 나타나지 않고, nmap의 실행속도가 많이 느려집니다. 글쓰면서 실행해봤는데 몇분이 지나도 끝나지가 않는군요. 답답해서 nmap 실행창에서 엔터를 쳤더니 다음과 같은 메시지가 나오네요. ㅎㅎ 콘솔 프로그램인데 이런거까지 신경써주는군요. ^^

Stats: 0:06:49 elapsed; 1 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 72.17% done; ETC: 01:59 (0:02:37 remaining)

한가지 문제가 blackhole 기능을 켜두면 원격에서 서버 모니터링할때 서버가 죽어도 응답이 바로 오지않는 문제가 있는데, PF를 통해서 포트에 따라서 선택적으로 blackhole 기능처럼 RST 보내지 않도록 설정하는것이 더 좋을거 같네요.

Unix/Linux 모임 참석 후기

정말 오랜만에 오프라인 모임에 나가보았습니다. 온라인으로도 활동을 거의 안하긴 하지만… 얼마전부터 다른 사람들의 블로그 글들을 꾸준히 읽다보니 제가 뒤쳐지는 느낌도 들고, 회사 내에서 회사일만 하기도 바쁘다보니 보는 시야가 너무 한정되는거 같아서 오프라인 모임 같은곳에 한번 나가야겠다는 생각은 했었습니다.

스마트플레이스에서 “Unix/Linux 엔지니어, 개발자, IT 매니저와의 대화“글을 보고 설문에 참여했었는데 연락 주셔서 어제 모임에 참석하게 되었습니다. 모임의 성격은 약간 애매했던거 같은데, 개발자가 아닌 다른 입장에서 왜 유닉스를 사용하는지에 대해서 들을수 있어서 도움이 되었습니다. 또한 작은 기업에서 서비스 운영하다보니 싼 서버에 오픈 소스 유닉스만 사용하고, 최적화의 끝을 찾아헤매는데, CPU 32개 이상 서버, 문제있을때 4시간만에 출장은 다른 나라 얘기같더군요. 그래도 최적화를 하면서 많은 보람을 느끼는데 최적화를 통해서 다른 곳에서 하지 못하는 서비스를 언젠가 할수 있다고 믿고 싶네요.

모임은 스플 멤버 외에 참가한 사람들의 소개로 시작해서 소개로 끝났습니다. 많은 얘기 나누지는 못했지만 참가한 모든 사람들의 열정적인 모습 보고 많은 자극 받았습니다. 블로그 들어가서 보니 참 많은 생각 하시고, 부지런한 분들이시더군요.

앞으로도 오프모임 자주 참석해서 사람들 많이 만나봐야겠다는 생각이 드네요.

그리고 준비해주신 기념품 너무 고맙게 받았습니다. ^^

CentOS (Redhat Enterprise)에서 lighttpd 설치

이번에 회사에서 새 서버들을 구매해서 IDC에 들어왔습니다. Dell PowerEdge SC1435로 AMD기반 옵테론 CPU라서 FreeBSD보다는 Linux가 좋을거 같더군요. 전에도 델서버 들어왔었는데 FreeBSD에서 네트워크 디바이스가 정상적으로 동작을 안하더군요. 델서비스에 연락했더니 Redhat Enterprise Linux(RHEL)구해서 설치하라고 해서 설치했었는데 네트워크 드라이버를 따로 구해서 설치해야되더군요. 서버에는 원래 엑스를 설치를 잘 안해서 고생했습니다. 일단 이미 설치된 다른 서버에 X 설치하고 웹에서 다운로드하는데 문서가 exe 파일이더군요! 황당 –; 집으로 VNC로 연결하여 실행하여 풀어보니 별거 없더군요 –; 설치했던 서버는 PE2950이었습니다. 다행히 USB 메모리가 있어서 네트워크를 잡을수 있었습니다…  그때 RHEL4를 받아서 설치했었는데 유료사용자가 아니면 업그레이드가 안되더군요. 그래서 이번에는 RHEL 소스를 이용하여 바이너리 호환이 되는 CentOS (Community Enterprise OS) AMD64 버전을 받아서 설치했습니다.

서버 여러대 설치하느라 시간이 좀 남아서(DVD 한장만 궈서갔음) FreeBSD 6.2(AMD64)도 설치해봤는데 별 이상없이 깔리더군요. 근데 SC1435에 PS/2 포트가 없어서 USB포트로 키보드와 마우스를 연결(Y케이블 이용해서 PS/2 키보드와 마우스연결)했는데 뺐다가 끼면 키보드와 마우스가 인식이 안되더군요.. 관리편의상 동시에 들어오는 서버는 같은 OS를 설치하는게 편하기 때문에 다시 밀고 CentOS를 설치하고, 업데이트까지 무사히 마치고 왔습니다. 업데이트는 정말 편하더군요. (#yum update) 그리고 네트워크 드라이버도 추가 설치없이 바로 잡히더군요.

이제 CentOS(AMD64)에서 lighttpd와 친구들 설치 방법에 대해서 설명드릴께요^^

AMD64의 php는 fastcgi가 컴파일안되어 있어서 lighttpd와 php를 fastcgi와 연결하기 위해서 php를 컴파일했습니다.

# cd /opt
# wget http://isoredirect.centos.org/centos/4/os/SRPMS/php-4.3.9-3.15.src.rpm
# rpm -i php-4.3.9-3.15.src.rpm
# vi /usr/src/redhat/SPECS/php.spec

       –enable-force-cgi-redirect \
      앞줄에
       –enable-fastcgi \
      를 넣어줍니다.

# rpmbuild -bb php.spec

이때 필요한 패키지를 설치하고 해야할수도 있습니다. 오류에 뭐가 필요하다고 나옵니다.
  ( # yum update aspell-devel httpd-devel pcre-devel …)
컴파일 완료되면 /usr/src/redhat/RPMS/x86_64 (또는 i386)에 바이너리 rpm이 생깁니다.

컴파일후 원하는 패키지를 업데이트 합니다. 버전번호 때문에 업그레이드가 안되면 –force를 이용해서 강제로 업데이트하면 됩니다.

lighttpd는 src rpm을 받아서 컴파일 합니다.

# wget http://www.lighttpd.net/download/lighttpd-1.4.13-1.src.rpm
# rpmbuild –rebuild lighttpd-1.3.15-1.src.rpm

xcache 역시 src rpm을 받아서 설치합니다.

# wget http://www.jasonlitka.com/media/files/SRPMS/php-xcache-1.2.0_0.2.src.rpm
# rpmbuild –rebuild php-xcache-1.2.0_0.2.src.rpm

rpm 바이너리 파일은 /usr/src/redhat/RPMS/x86_64 나 i386 등에 생깁니다. 적당히 원하는 패키지를 설치해주면 됩니다. 5대 서버에 설치하느라 한곳에서 컴파일하고 다음 스크립트를 이용하여 여러서버에 설치하였습니다.

#!/bin/sh
# install_lighttpd.sh

/usr/sbin/apachectl stop

rpm -ivh lighttpd-1.4.13-1.x86_64.rpm
rpm -Uvh –force php-4.3.9-3.15.x86_64.rpm php-devel-4.3.9-3.15.x86_64.rpm  php-pear-4.3.9-3.15.x86_64.rpm php-ldap-4.3.9-3.15.x86_64.rpm  php-mysql-4.3.9-3.15.x86_64.rpm
rpm -ivh php-xcache-4.3.9_1.2.0-0.2.x86_64.rpm

mkdir -p /etc/lighttpd
cp ./lighttpd.conf /etc/lighttpd
adduser -s /sbin/nologin www
/sbin/chkconfig httpd off
/sbin/chkconfig –add lighttpd
/sbin/chkconfig lighttpd on

touch /var/log/lighttpd.access.log
touch /var/log/lighttpd.error.log

chown www:www /var/log/lighttpd.access.log
chown www:www /var/log/lighttpd.error.log

/etc/init.d/lighttpd start

lighttpd.conf는 freebsd에서 사용하던걸 그대로 가져와서 server.event-handler 등 몇가지만 바꿨습니다. 주석등의 라인은 삭제했습니다.

# lighttpd.conf
server.modules              = (
                               “mod_redirect”,
                               “mod_alias”,
                               “mod_access”,
                              “mod_status”,
                              “mod_fastcgi”,
                              “mod_userdir”,
                               “mod_accesslog” )
server.document-root = “/var/www/html/”
accesslog.filename          = “/var/log/lighttpd.access.log”
server.errorlog             = “/var/log/lighttpd.error.log”
index-file.names            = ( “index.php”, “index.html”,
                               “index.htm”, “default.htm” )
server.event-handler = “linux-sysepoll”
mimetype.assign             = (
  생략…
)

userdir.path = “public_html”
url.access-deny             = ( “~”, “.inc” )
static-file.exclude-extensions = ( “.php”, “.pl”, “.fcgi” )
server.pid-file            = “/var/run/lighttpd.pid”
server.username            = “www”
server.groupname           = “www”
fastcgi.server              = ( “.php” =>
                               ( “localhost” =>
                                 (
                                  “socket” => “/tmp/php-fastcgi.socket”,
                                  “bin-path” => “/usr/bin/php”,
                                  “min-procs” => 1,
                                  “max-procs” => 2,
                                  “max-load-per-proc” => 4,
                                  “idle-timeout” => 10,
                                  “bin-environment” => ( “PHP_FCGI_CHILDREN” => “16”,
                                                         “PHP_FCGI_MAX_REQUESTS” => “2000” )
                                 )
                              )
                             )

server.max-fds = 4096

그리고 로그가 계속 쌓이지 않도록 /etc/logrotate.d/lighttpd 파일을 만들었습니다.

/var/log/lighttpd.*.log {
  rotate 30
  daily
  missingok
  notifempty
  compress
  sharedscripts
  postrotate
       touch /var/log/lighttpd.access.log
       touch /var/log/lighttpd.error.log
       chown www:www /var/log/lighttpd.access.log
       chown www:www /var/log/lighttpd.error.log
       /bin/kill -HUP `cat /var/run/lighttpd.pid 2>/dev/null` 2> /dev/null || true
  endscript
}

참고 URL:
http://www.cyberciti.biz/tips/redhat-enterprise-linux-lighttpd-fastcgi-php.html
http://www.jasonlitka.com/2006/12/20/php-caching-and-acceleration-with-xcache/

UTF-8, putty, VIM, screen

원래 EUC-KR로 터미널에서 작업했었는데, 태터툴즈를 깔고 나서 UTF-8로 일부 변경하고 있습니다. 사용하는 환경은 윈도우즈에서 putty를 이용하여 FreeBSD 서버에 SSH로 접속해서 screen을 띄우고 vim을 이용하여 편집합니다.

putty설정: “창-변환-수신한 데이타를 이 문자셋으로 가정”에서 UTF-8로 바꾼후 설정 저장.

vim설정: .vimrc에 다음 추가합니다. euc-kr 파일도 편집이 가능하며, 새로운 파일을 저장할때는 UTF-8로 저장됩니다. 기존 euc-kr 문서는 그대로 저장됩니다.

set encoding=utf-8
set fileencodings=utf-8,euc-kr

screen: -U 옵션 사용.  처음 세션 만들때 뿐만이 아니라, 세션을 resume할때도 -U 옵션을 주어야합니다! 아직 .screenrc에 어떻게 넣어야 적용되는지 모르겠습니다.

% screen -US mysession
[Ctrl-A][Ctrl-D] (detach screen)
% screen -Ur mysession

.cshrc: .cshrc에 LANG을 아래와 같이 정해주면 screen에서 -U 옵션을 주지 않아도 되더군요.

setenv LANG ko_KR.UTF-8

bash 사용자는

export LANG=ko_KR.UTF-8

lighttpd 1.4.12 bug

1.4.12로 업그레이드한 후 서버가 가끔씩 죽었었는데 버그 찾아보니 해결되었네요. 1.4.11로 다운그레이드했었는데 소스 패치해서 다시 올려야겠네요. 1.4.11은 POST할때 가끔 먹통되는 버그가 있었는데, 해결은 아래 링크를 참조:

http://trac.lighttpd.net/trac/changeset/1352

FreeBSD 4.10에서 컴파일 안되는 버그도 있는데, 아래 URL을 참조:

http://trac.lighttpd.net/trac/ticket/875
http://trac.lighttpd.net/trac/changeset/1383

Varnish Cache Project & 웹서버 최적화

웹 프로그래밍을 전문적으로 하고 있지는 않으나, 서비스에 사용자가 많이 늘면서 여러가지 기술들을 찾고 있는데, 아직 본격적으로 적용은 못했으나 관심을 갖아볼 만한 프로젝트입니다. Varnish는 웹캐시로 웹속도를 줄이기위한 방법중 하나로 Reverse Proxy 역할을 위주로 설계됐습니다. 많이 쓰이는 Squid라는 프록시는 클라이언트 단에서 서버에서 오는 정보를 캐싱하여 클라이언트 단에서의 접속 속도를 향상시키는 역할이 주인 (Forward) Proxy로 주로 쓰입니다. 반면 Reverse Proxy는 서버단에 가까운곳에 위치하여 서버에서 나오는 데이타를 캐싱하여 서버의 부하를 줄이는 역할을 하며, 주로 동적으로 생성되는 페이지가 많을 경우 효과를 볼수 있습니다.

Varnish는 효율성을 위해서 C로 짜여져 있으며, VCL이라는 언어로 설정이 가능합니다. VCL은 간단한 언어로 오브젝트 파일로 컴파일되어 데몬에서 호출되는 등 빠르게 동작할수 있도록 최적화에 신경을 많이 썼습니다. 주 개발자는 FreeBSD 커널 여러부분에서 작업해서 OS에 대한 이해도가 높고, 기존에 있던 캐싱 시스템들이 옛날 하드웨어 맞게 최적화되어 개발되어 있기 때문에 오히려 요즘 처럼 여러단계로 메모리가 캐싱되는 하드웨어 상황에서는 적합하지 않다고 얘기합니다.

홈페이지는 http://varnish-cache.org/ 이며, FreeBSD에서는 /usr/ports/www/varnish 에서 설치할수 있습니다.

회사 서비스 중 웹서버에 많은 부하가 집중되어 있었는데 많은 부분 해결이 되었습니다. 해결을 위해 동원된 방법은…

  • SQL 쿼리 최적화
  • PHP에서 필요한 부분만 include (main include 파일이 커져서)
  • 랜더링 오래 걸리는 페이지 memcache에 캐싱
  • 잘 변하지 않는 페이지 html로 저장
  • 웹서버 Apache에서 lighttpd로 변경
  • xcache 적용 (코드 캐시만 사용)

동시 연결된 클라이언트가 급속히 늘다보니 아파치 1.3에서는 mod_php는 메모리가 너무 많이 차지하여 한계가 생겼었습니다. 당시 php 처리도 느렸었지만, lighttpd에 fastcgi로 바꾸고 나서는 메모리 사용량이 현저히 줄었습니다. xcache는 php 컴파일된 코드를 메모리에 캐싱하는 모듈로 적용후 php의 부하를 많이 줄일수 있었습니다. xcache에서 memcache와 동일한 기능도 제공합니다. 그외에 pen이나 plb등의 S/W load balancer 도입도 생각하고 있으며, lighttpd의 fastcgi load balancing도 고려하고 있습니다.