fastcgi에서 php를 chroot 안에서 구축하기

오늘부터 OpenLook은 새로운 서버에서 돌아가게 되었습니다. 옵테론 242 듀얼이라 무지 빨라졌지요~ (사실 별로 돌아가는 게 없어서 그다지 체감 속도는;;) 이번에 옮기는 김에, 기존에 쓰던 아파치에서 lighttpd로 바꿨습니다. 요새 lighttpd가 워낙 인기가 있어서, 한번 도전을 해 봤는데, 환경 설정이나 속도나 소모되는 자원이나 여러모로 아주 마음에 듭니다. 🙂

OpenLook서버에서 돌아가고 있는 웹 사이트 중에 동아리 홈페이지와 파이썬마을이 php를 쓰고 있기 때문에, php를 설정하는 방법을 고심하다가, 심심하면 터지는 php 애플리케이션의 보안 버그에도 좀 대비를 하고자 각각의 php 사이트를 별도의 fastcgi 프로세스로 분리를 해서 setuid/chroot 해버리기로 마음을 먹었습니다. 그래서, lighttpd에서 기본으로 제공해 주는 spawn-fcgi 유틸리티를 이용해서 일단은 만들어 봤는데, spawn-fcgi는 소켓을 만든 다음에, setuid, setgid, chroot를 한 다음에 php를 띄우는 순서로 하다보니, php바이너리는 물론이고 관련 라이브러리까지 모두 chroot 디렉토리 안에 넣어야 제대로 돌아가는 문제점이 있었습니다.

그래서, 아무래도 원하는대로 하려면, chroot를 하기 전에 php의 초기화를 모두 끝내고 나서 chroot를 해줘야하기 때문에, 알고보면 spawn-fcgi에서는 아무리 별짓을 해 봐야, 방법이 없고, 결국은 php 내부에서 해결을 해야 하는 문제로 판단이 됐습니다.

그래서 결국은 패치를 만들었습니다. 으흐.. php-cgi-sapi는 fastcgi와 cgi를 동시에 지원하느라 코드가 상당히 지저분하긴 했지만서도;; 하여간 패치하고 나니까, pear를 사용하지 않는 대부분의 php 프로그램들은 그럭저럭 잘 돌아가는 것이, 제로보드를 돌려도 안전할 것 같은 느낌이 드는군요 -ㅇ-;; 가급적이면 명령행 옵션으로 만들어서 메인스트림에 올렸으면 좋았을텐데, 명령행옵션이 이미 너무 많이 들어가있어서, 옵션들을 더 넣을라니 알파벳도 마땅찮고 –; 그래서 결국은 그냥 환경변수로 그냥 혼자 쓰는 패치로;; 으흐~ 포트 유저는 패치를 /usr/ports/lang/php5/files에 넣으시고 www/php5-cgi를 WITH_FASTCGI=yes옵션을 주고 깔으시면 됩니다~!

명랑하고 발랄하고 경쾌한 lighttpd 세상으로 오세요~ -O-

4 thoughts on “fastcgi에서 php를 chroot 안에서 구축하기”

  1. 아, 안그래도 근래 lighttpd에 눈독을 들이고 있는 중이었습니다. (http://jaju.net/wiki/lighttpd) 프비에서 포트로 php까지 모두 다 설치되면 좋을텐데, php5 포트에서 WITH_FASTCGI=yes 옵션만 주어서 되는게 아닌 듯 하더군요. 그런데 회사일이 바빠서 신경도 못씁니다. (ㅠㅠ) lighttpd+php 같은 포트가 있음 좋겠습니다.
    그나저나 성능은 어떤지 궁금하네요. lighttpd는 epoll을 쓴다든가 하는 걸 얼핏 봤는데, kqueue를 사용하는 apache2와 비교하면 어떤가요?
    또 FastCGI는 종종 메모리 Leak이 발생한다던데, 파이썬진영의 scgi던가 그건 lighttpd에 안붙는건가요?
    – 궁금한게 너무 많은 초보가… ㅋㅋ

  2. 한번 설치해보고서, 위에 쓴 답글이 쓰잘데기 없다는 걸 알았습니다. lighttpd도 freebsd-kqueue를 사용하더군요.
    lighttpd가 상당히 맘에 들긴 한데, 아직까지 기능이 좀 부족하네요. 가상호스트, 디렉토리별로 php_admin_value 또는 SetEnv 같은 옵션을 줄 수 없는 것 같더군요. 그리고 php 뿐 아니라 다른 몇가지 확장자도 fcgi데몬을 spawn시키도록 하면, 결과적으로 php데몬이 차지하는 메모리가 기존의 아파치가 차지하는 메모리에 맞먹더군요.
    나중에 가상 호스트 지원이라든가 이런 옵션들만 좀 더 향상된다면, lighttpd로 옮겨와야겠습니다.

  3. 아아 좋지요~ 🙂

    사실 php의 디렉토리별 설정은 lighttpd에서 어떻게 할 수 없는 것이라, php의 cgi sapi가 향상되어야 하는 것입니다.

    그리고, php데몬들이 먹는 메모리들은 크게 신경 쓰실 필요는 없습니다. php가 fastcgi로 동작할 때 대부분의 메모리가 text영역이기 때문에 메모리를 화면에 나오는 것 보다는 훨씬 적게 먹습니다.

  4. 안녕하세요?
    이미지서버로 사용할거라면 thttpd 보다 lighttpd가 더 좋더군요. 현재 FreeBSD ports 에서 전용패치(?)해서 잘 사용하고 있고 아주 만족합니다. ㅎㅎ

Comments are closed.