2008년 3월 12일 수요일

mod_python 설치

mod_python은 Apache의 module로서 python interpreter를 항상 띄워 놓고, apache의 내부객체를 노출시켜, python으로 성능 좋고, 편리한 웹코딩을 할 수 있게 해준다.

설치 시작해보까

1. 다운을 받는다. Apache 2.0 이상이라면 mod_python 버전 3이상을, Apache1.3 이라면 mod_python 버전 2를 다운 받는다.

2. configure 실행..
Apache의 DSO를 쓰려면 axps위치를 지정해야 하고, python도 제위치에 안깔았다면 지정해야 한다.

./configure --with-apxs=/usr/local/apache2/bin/apxs --with-python=/data/python/bin/python

3. make -> make install
만일 make install에서 에러가 나면... 다음과 같이...

/usr/bin/install -c src/mod_python.so /usr/local/apache2/modules /usr/bin/install: cannot stat `src/mod_python.so': No such file or directory make[1]: *** [install_dso] Error 1 make[1]: Leaving directory `/home/hobb/mod_python-3.0.1' make: *** [install] Error 2 #

이것은 apache에서 제공하는 libtool의 bug때문이란다...
그래서 /usr/local/apache2/build/libtool 을 백업하고 /usr/bin/libtool 을 그 디렉토리로 복사한다. 그리고 make install 하면 잘 될 것이다. libtool은 version 1.4.2 이상이어야 한단다.

4. Apache 설정 바꾸기

LoadModule python_module /usr/local/apache2/modules/mod_python.so

그리고 mod_python을 쓰는 방법은 여러가지가 있으나, psp(Python server page)와 cgihandler로 쓰는 것이 제일 쉬울 것이다. 이렇게 두개를 동시에 설정하려면 AddHandler하나에 여러개의 PythonHandler를 다는 것인데... 그 방법은 다음과 같다.

AddHandler mod_python .psp .psp_ .py
PythonHandler mod_python.psp | .psp .psp_
PythonHandler mod_python.cgihandler | .py
PythonDebug On

위 세 라인을 httpd.conf 파일에 넣으면 된다. (루트에) .psp_ 는 psp 디버깅을 위해 추가하는 것이다.

만일 publisher 등을 쓸려면 확장자를 달리 하던지, 태그안에 넣던지 해야 할 것이다.

5. 흔히 발생하는 문제...

mod_python을 해서 cgihandler/publisher/psp 등을 시험해보았는데... Apache의 error_log에 Segmentation Fault가 나는 이상한 현상을 보인다. 그래서 google을 샅샅이 뒤졌다.

그런데 결론은... 너무도 허무하다.

문제는 apache가 가지고 있는 공용 라이브러리와 mod_python이 가지고 있는 공용 라이브러리의 version이 다르면 안된다는 점이다.

내가 테스트한데서 문제가 된것은 xmlrpclib을 import할 경우에의 segmentation fault인데, 이는 apache의 소스에도 expat이 있고, python도 expat을 가지고 있는데, apache의 expat는 1.85.1, python의 expat는 1.85.8 이라는데 있다. 이렇게 버전 다른 expat을 공용라이브러리로 쓰면 Bug이 난다고 한다.

비슷한 오류는 php와 mod_python을 쓸때도 난다고 한다. php의 mysql binding과 python의 Mysql binding에서 충돌이 나는 경우도 적지 않다고...

그러면 해결책은...
----------------------------------
expat 최신버전 1.85.8를 다운받아서 설치한다.

./configure --prefix=/usr

로 해야 제 위치 (/usr/lib)에 깔린다.

다음 make/make install

그리고 이 expat 소스를 apache소스의 apache/srclib/apr-util/xml/expat 에 넣는다. 적당히 넣고 이름바꾸고 configure /make/make install 한다.

그러면 이제 잘 될 것이다. 정말 힘들었다. 이렇게 세팅하는데...

===============================================================
Intel Solaris 5.8, gcc 3.2.2 버전 이상인 경우 Python 컴파일은 잘 되나, mod_python 컴파일은 다음과 같은 에러를 내며 안된다.

*** Warning: Linking the shared library mod_python.la against the non-libtool
*** objects _eprintf.o _floatdidf.o _muldi3.o is not portable!

이러면서 에러메시지가 죽 뜬다.

구글링 결과 eprintf 등은 Solaris에서 문제가 있는 파일들인데, gcclib에서 ar -x 로 뽑아낸다고 한다. 그런데 이게 Python과 안맞다는 건데... 무슨 말이냐면 gcc는 shared형태이고, Python은 static이면 이런 에러가 나는 것이다.

이를 해결하기 위해서는 Python을 동적으로 컴파일해야 한다. 다음과 같이 Python 컴파일시 --enabled-shared를 넣고 컴파일하면 잘된다.

./configure --with-threads --enable-thread --without-pymalloc --enable-shared

댓글 없음: