Tag Archives: lighttpd

CentOS에서 최신버전 lighttpd rpm 만들기

CentOS나 RHEL에서 최신 버전 lighttpd rpm 만드는 방법입니다.
이전 버전의 src rpm을 받아서 아래와 같이 src rpm 최신버전으로 제작할수 있습니다.

# wget http://www.lighttpd.net/download/lighttpd-1.4.13-1.src.rpm
# rpm -i http://www.lighttpd.net/download/lighttpd-1.4.13-1.src.rpm
# cd /usr/src/redhat/SPECS
# sed -i ‘s/1\.4\.13/1\.4\.22/g’ lighttpd.spec

sed로 lighttpd.spec 파일에서 1.4.13을 찾아서 1.4.22(현재 최신 버전)으로 변경합니다. 일반 에디터로 편집하셔도 됩니다. 파일 내용도 한번 확인해보시면 도움이 될듯하네요.

lighttpd 소스를 받습니다.

# cd /usr/src/redhat/SOURCES
# wget http://www.lighttpd.net/download/lighttpd-1.4.22.tar.gz

이제 rpm만 만들면 됩니다. src rpm은 아래처럼 만듭니다.

# cd /usr/src/redhat/SPECS
# rpmbuild -bs lighttpd.spec

이렇게 하면 /usr/src/redhat/SRPMS 에 src rpm이 만들어집니다.

아래처럼 바이너리 rpm을 제작할수 있습니다. ssl을 사용할 수 있도록 옵션을 추가적으로 전달했습니다. spec 파일 보면 어떤 옵션이 있는지 확인할수 있습니다.

# cd /usr/src/redhat/SPECS

# rpmbuild -bb lighttpd.spec -with ssl

이렇게하면 시스템에 따라 /usr/src/redhat/RPMS/{x86_64, i386} 에 바이너리 rpm 파일이 생성됩니다.

rpmbuild 할때 오류나면 yum으로 필요한 패키지 설치하면 됩니다. (yum update openssl-devel …)

이제 필요한곳에 rpm을 설치하고 재시작 하면 됩니다~

# rpm -e lighttpd      (이전 버전 제거)
# cd /usr/src/redhat/RPMS/x86_64
# rpm -i lighttpd-1.4.22-1.x86_64.rpm
# /etc/init.d/lighttpd start

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에서 부터 지원할것.

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/

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도 고려하고 있습니다.