Apache - PHP4 - ModPython - MySQL 정적 컴파일
2001-05-29. yong27
2003-01-06. neosphere 수정
이 문서는 본인 역시 초보자로서, 초보자 입장에서 쉽게 인터넷프로그래밍환경을 접할 수 있는 환경을 만들어주고자 작성되었다. 실제 리눅스환경에서 프로그램설치는 쉽지 않은 부분이며, 설치에서 많은 시간을 소모하게 되며, 쉽게 포기하게 된다. 본인역시 많은 시행착오끝에 제대로 동작하는 환경을 만들 수 있었고, 우선은 본인에게 레퍼런스가 되게 하며, 다른 이들에게도 도움이 되었으면 하는 바램에서 이 문서를 작성하게 되었다.
Contents
서론
CGI 프로그래밍에 있어서 대표적인 언어라면 Perl이겠지만, 본인에겐 참 난해했다. 물론, 단순한 SSI 페이지작성은 PHP로도 가능하지만, 좀더 복잡하고 다양한 기능을 원했기 때문에 CGI는 피할 수 없는 대안이였다.
Python은 원래가 독립적인 프로그램을 지향하는 언어이며, 명료한 문법과 객체지향기술을 통해 프로그래머의 의도를 쉽게 구현할 수 있으며, 매우 다양한 활용범위를 갖는다. 이 언어를 통해서 CGI를 구현할 수 있다는 것은 매우 즐거운 일일 것이다. 사용자는 Python 코드를 만들고, CGI작동가능환경에서 #!/usr/local/bin/python 으로 시작하는 문서로 CGI 프로그램을 작성할 수 있다.
그러나, CGI의 특성상 접속이 많을시 시스템자원소모가 많아지고, 느려지게 된다. 이에 ModPerl처럼 Apache 서버내에서 작동하는 모듈이 개발되었고, 이것이 ModPython, PyApache이다.
여기서는 ModPython을 설치하는 방법을 설명한다.
Apache 에 ModPython 같은 모듈을 설치하는 방법은 정적컴파일과 동적컴파일로 나뉘는데, 정적컴파일은 아파치 재설치가 필요한 반면 안전성과 최적화를 할 수 있다는 장점이 있으며, 동적컴파일은 아파치 재설치과정 없이 DSO로 동적으로 연결하여 사용할 있지만 최적화(속도나 안전성등.) 면에서 정적 컴파일에 뒤진다.
그래서 필수적으로 사용하는 기능을 정적컴파일을 하며 DSO 기능을 켜놓아서 가끔씩 필요한 프로그램을 동적으로 컴파일해서 작동시키는 것이 최선이라 생각된다.
이에 흔히, APM(Apache+PHP+MySQL)이라 불리우는 WebProgramming 기본환경에 ModPython을 정적으로 (혹은 동적으로) 컴파일 하고, MySQLdb를 설치하는 방법을 소개하고자 한다.
APM 설치과정은 동적 컴파일시에는 아파치를 먼저 설치한후 PHP 와 기타 다른 것을 나중에 설치하기만하면 되지만, 정적 컴파일시는 모듈을 첨가하기 위해서 순서를 상당히 잘 따라와야 한다.
설치 과정은 각 소스파일의 압축을 풀면, INSTALL(-xxxx) 이라는 문서에 잘 나타나 있다. 버젼이 바뀐때마다 조금씩 변하는 경우가 있으므로, 꼭 읽어보기 바란다. 또한 설치에도 몇 가지 방법이 있으므로 끝까지 대강 본후 필요한 부분을 자세히 보는 방법을 사용하도록 권한다.
작업환경
본인의 작업환경은
Asplinux 7.1 kernel 2.4.2 Python 2.1 Apache 1.3.19 PHP 4.0.5 MySQL 3.23.38 Mod_python 2.7.2 MySQL-python-0.3.5
이며 모든 작업은 root 권한에서 실행했다.
기존설치된 프로그램의 삭제 (Apache, MySQL)
리눅스배포본을 기본적으로 Full로 설치하면 Apache, MySQL, Python등이 rpm으로 설치된다. (Asplinux에는 PHP가 없었던 것으로 생각된다. (아닌가?.. 없던데..)) 본인은 Python1.5는 차후 필요성?위해 남겨두고, 위의 Apache, MySQL을 직접 삭제했다.
# ps -ef | grep apache # kill (프로세스아이디) # rpm -e apache --nodeps # rpm -e mysql --nodeps
혹시하는 생각에 관련 디렉토리까지 몽땅 지웠다. (/usr/lib/mysql 등등 이름있는 디렉토리들)
프로그램 다운로드
apache_1.3.19.tar.Z : www.apache.org mysql-3.23.38.tar.gz : www.mysql.com php-4.0.5.tar.gz : www.php.net python-2.1.tgz : www.python.org mod_python-2.7.2.tgz : www.modpython.org zxvf MySQL-python-0.3.5.tar.gz : dustman.net/andy/python/MySQLdb
받은 소스화일들은 모두 /usr/src 밑에 모아놓고 각각 tar zxvf 로 풀어놓는다.
Python 설치
기존에 1.5버젼은 그냥 두고 직접 컴파일한다. /usr/local/lib/python2.1 밑에 기본적으로 설치된다.
# cd python-2.1 # ./configure # make # make install
직접 shell에 python을 입력하면 1.5버젼이 가동된다. 이는 /usr/bin 에 python 구버젼이 있기 때문이다.
# cp /usr/local/bin/python /usr/bin/python
구버젼을 실행하고 싶으면 python1.5를 입력하면 된다.
MySQL 설치, 구동
MySQL은 배포되는 형태가 바이너리와 소스 코드 2가지가 있다. 얼듯 생각하면 소스가 더 좋은 듯 하지만, 여러가지 면에서 바이너리 배포본을 추천한다. MySQL 홈페이지에서도 아래 문구와 같이 스스로 컴파일 하는 것보다는 바이너리 배포본을 사용하는 것을 추천하고 있다.
The best solution in terms of stability and performance for most users is to use our binary instead of compiling their own. from http://www.mysql.com/
1 # groupadd mysql 2 # useradd -g mysql mysql 3 # cd /usr/local 4 # tar xvfz /path/to/mysql-VERSION-OS.tar.gz . 5 # ln -s mysql-VERSION-OS mysql 6 # cd mysql 7 # scripts/mysql_install_db 8 # chown -R root . 9 # chown -R mysql data 10 # chgrp -R mysql . 11 # bin/safe_mysqld --user=mysql & 12 # bin/mysqladmin -u root password 'xxxx'
바이너리 배포본 설치 과정이다. 이 과정을 설명하면 우선 MySQL 이라는 id 를 등록한다. 위에서 rpm 을 제거한 사람은 이미 MySQL ID 가 등록 되어있을 것이다. MySQL ID를 사용하여 MySQL을 띄우는 이유는 보안상의 안전성을 위해서이다. 위의 설치 방법 중에서 4번과 5번과정은 그냥 받은 파일을 압축을 푼후 원하는 디렉토리로 옮기는 것으로 대체가 가능하다.(neosphere 는 다운받은 파일을 압축을 풀어서 /usr/local/mysql 이란 디렉토리로 옮겨서 사용한다.) 또한 7번 줄은 2번 실행해서는 안되며 scripts 라는 디렉토리로 들어가서 실행시켜서도 안된다.
소스를 설치할 사람은 다음을 설치과정을 참고하기 바란다.
# cd ../mysql-3.23.38 # mkdir /usr/local/mysql # ./configure --prefix=/usr/local/mysql --with-charset=euc_kr # make # make install # /usr/local/mysql/bin/mysql_install_db # /usr/local/mysql/bin/safe_mysqld & # /usr/local/mysql/bin/mysqladmin -u root password 'xxxx'
주의해야할 사항은 prefix옵션을 꼭 설정하라는 것이다. 이거없이 그냥 컴파일하면 나중에 아파치 컴파일시 참조가 안된다.
작동확인
# mysql -p Enter password: xxxx mysql> show databases; mysql> quit
Apache configuration
다른 프로그램들의 설치시 설정을 위해서 전단계 configure하는 과정이다. 역시 prefix 옵션이 중요하다.
# cd /usr/src/apache_1.3.19 # ./configure --prefix=/usr/local/apache --with-layout=Apache
PHP 설치
# cd ../php-4.0.5 # ./configure --with-mysql=/usr/local/mysql --with-apache=../apache_1.3.19 --enable-track-vars # make # make install
이외에도 PHP관련 옵션설정이 더 있을 수 있다. 관련문서를 참조하기 바란다.
ModPython 설치
# cd ../mod_python-2.7.2
정적컴파일시
# cd ../mod_python-2.7.2 # ./configure --with-apache=../apache_1.3.19 # make static # make install
동적컴파일을 위해서는 먼저 아파치를 설치한 후에 다음 과정을 거친다.
# whereis apxs (apxs경로) # ./configure --with-apxs=(apxs경로) # make dso # make install
만약 아무런 옵션을 주지 않고 make 만하시면 동적 컴파일이 됩니다.
위 방법은 정적으로 아파치에 포함되는 과정이며, 이 방법을 통해 python2.1/site-package/mod_python 디렉토리가 생성되고 파이썬 파일들이 컴파일된다. 또한 아파치설치디렉토리의 src/module/python 디렉토리가 생성된다.
동적컴파일시 libexec 디렉토리 밑에 mod_python.so 화일이 생성된다.
Apache reconfiguration, 설치
본인은 reconfiguration시 다른 동적 모듈을 활성화 시키고자 다음의 옵션을 사용했다. 그러나, 다른 동적모듈활성화가 이 방법으로 되는지 확신하지 못하겠다. 이 부분에 있어서는 다른 apache 설치관련 문서를 참고하기 바란다. 어쨌건, PHP와 ModPython은 정적으로 컴파일된다.
# cd ../apache_1.3.6 # ./configure --prefix=/usr/local/apache --with-layout=Apache --activate-module=src/modules/php4/libphp4.a --activate-module=src/modules/python/libpython.a --enable-shared=max --enable-rule=SHARED_CORE # make # make install
위 과정중에 PHP와 ModPython이 컴파일된다. 과정중 --activate-module=src/modules/php4/libphp4.a 이런 라인이있는데, 실제로 컴파일 하는곳의 하위 경로를 보면 libmodphp4.a 라는 파일이존재한다. 하지만 이것은 잘못된 설정이 아니다. 괜히 libphp4.a 를 libmodphp4.a 로 고치면 에러만 난다.
httpd.conf 설정
PHP 작동을 위해서
#AddType application/x-httpd-php .php .php4 #AddType application/x-httpd-source .phps
부분의 #표시를 없애준다.
ModPython 작동을 위해서 (본인은 htdocs/py 디렉토리 만을 사용하고자 했다.)
<Directory "/usr/local/apache/htdocs/py"> AllowOverride All Options ExecCGI Order allow,deny Allow from all </Directory> <Directory "/usr/local/apache/htdocs/py"> AddHandler python-program .pyc .py PythonHandler mod_python.cgihandler PythonDebug Off AllowOverride Options FileInfo AuthConfig </Directory>
설정이 끝났으면 아파치를 시작한다.
# /usr/local/apache/bin/apachectl start
MySQLdb 설치
# tar zxvf MySQL-python-0.3.5.tar.gz # cd MySQL-python-0.3.5
설치전에 두가지 우선과제가 있다. 우선 setup.py 화일내에 include, lib 참조경로가 달라졌기 때문에 수정해주어야 한다.
41, 42열의 내용을 다음처럼 수정한다.
include_dirs = ['/usr/local/mysql/include/mysql'] library_dirs = ['/usr/local/mysql/lib/mysql']
또한 MySQL의 공유라이브러리들이 아직 로드되지 아니하였으므로 /etc/ld.so.conf 화일을 열어서, /usr/local/mysql/lib/mysql 경로를 추가한후
# ldconfig # python setup.py build # python setup.py install
다음을 테스트해본다.
# python >>> import MySQLdb
이상없으면 설치가 무난히 된것이다.
테스트
htdocs/py 디렉토리에 다음 두 화일을 만들어 본다.
# cat test.py import string import cgi print "Content-Type: text/html" print print "<html><body><b>Hello mod_python!</b></body></html> # cat test.php <? phpinfo(); ?>
웹브라우저를 띄운후,
http://localhost/py/test.pyc http://localhost/py/test.php
명령을 수행해본다.
이상이 없다면 두꺼운 글씨체의 Hello mod_python! 글자와 PHP infomation 화면을 보게 될것이다.
즐거운 파이썬 CGI 프로그래밍되길 바란다.
CGI 프로그래밍 팁
위에서도 봤지만 링크시킬때 .pyc를 사용하면 약간의 속도향상이 있다고 한다. 메인이 될 파일에는 간단하게
import cgi import 서브화일 key = form['XXX'].value if key == xxxx: 서브화일.서브함수 else: 어쩌고 저쩌고
의 방법을 사용하고 틀에 해당하는 html 디자인된것들은 앞부분과 뒷부분으로 나눈후 각각 template.py 화일에 각각의 변수명으로 저장한다.
before = """ <html>xxxxxxxxxxxx """ after = """ xxxxxx </html>"""
그리하여, 출력시 before를 먼저 출력시키고, 내용, after를 출력시킨다.
또한 출력전에 헤더를 빼먹지 말아야 한다.
def sendHeader(): print "Content-Type: text/html" print
또한, 본인의 생각인데 웹이 느리다고 생각된다면 (연산수행등등...) 미리미리 내용들을 출력시키는 것도 한 방법이다. (sendHeader(), print before)
끝마치며
이상, 초보자로서의 APM + ModPython + MySQLdb 설치방법내용을 마친다.
본인이 초보인관계로... 고수님들이 보면 수정했슴하는 사항들이 있을 수 있다.
그런 점들이 보인다면 지체없이 수정해주시기 바랍니다.
페이지 다시 수정했습니다. 서론 부분하고, MySQL 부분을 좀 바꿨구요. 아직 미심적은 몇 부분은 수정안했습니다.; 그리고 아파치 2.0 하고 mod_python 3.0.1 하고 mysql-python 0.9.2 가 나왔구요... 아직 아파치 2.0 설정을 잘 몰라서 수정하지는 않았습니다.. php 하고 문제도 좀 있는 것 같구요. 다음에 알게되면 다시 수정할께요. --neosphere