Oracle 8i 설치에 따른
PHP4 소스 RPM (src.rpm) 으로 설치하기
2005. 1. 18
김윤환
yunankim@santoh.com
1. 배경
당사는 Linux 서버를 보유하고 있는데, 이 서버의 주 사용목적이 이-메일서버, 웹서버 (아파치) 이다. 따라서 이곳에는 이미 홈페이지가 운영 중에 있었고, 홈페이지에는 흔히 그렇듯이 게시판이 있었으며, 게시판 재료로 제로보드를 사용하였기 때문에 MySQL 데이터베이스도 사용하고 있었다. 또한 이메일 기능은 sendmail 기능과 웹메일 (다람쥐 메일) 기능도 갖추고 있다. 웹메일 기능을 위해서는 imap 기능도 지원하고 있는 환경이다.
이런 상황에서 다른 데이터베이스 서버 (Windows2000, Oracle 8i) 에 있는 데이터 일부를 홈페이지로 가져와 고객에게 보여줄 필요가 생겼다. 처음에는 Oracle 데이터를 가져오기 위해서 ODBC 를 생각하였으나, Linux ODBC 가 Oracle 를 지원하지 않는다는 사실을 알게 되어, 할수없이 Oracle Client 를 설치할 수 밖에 없다는 결론에 도달하였다. 또한 Oracle 데이터를 웹에서 사용하려면, PHP 가 최선의 방법이라고 생각하였다.
그러나, 기존에 설치된 PHP 는 오라클과 연동되어 있지 않았으므로 PHP를 재설치할 필요성이 생겼다. PHP 설치 방법으로 머리에 떠오른 방법은 기존의 환경을 그대로 두고 PHP 만을 설치하는 것이 가장 이상적이라고 생각하였다.
따라서, PHP 만을 설치하는 방법을 인터넷에서 찾아 보았지만, 이런 방식의 설치법을 소개한 자료는 찾을 수 없고, 죄다 APM 소스 설치법만 소개되어 있었다. 기존 Apache, MySQL 등은 그대로 두고 PHP 만을 RPM 방식으로 설치하는 법은 나와 있는 것이 없었다. 자료빈곤의 정확한 이유는 모르겠으나 추정컨대, APM 소스설치법이 하나의 풍조로 여겨져서 그런게 아닌가 생각되어졌다. 그렇다고 나는 그것만이 반드시 옳다고 보지 않았으므로, 끝까지 PHP 를 독립적으로 재설치하는 방법을 찾고자 시도하였으며, 그 결과를 얻어 이를 다른 이에게도 알리고자 이글을 쓰게 되었다.
2. 기존 환경
Apache, MySQL, PHP4 는 Redhat 9 최초설치 시에 함께 설치되었음.
즉 RPM 으로 설치되어 있고, 버전은 참고 삼아 나열하면,
O/S : Redhat 9
Apache : 2.0.40
MySQL : 3.23.54
PHP : 4.2.2
설치할 Oracle : 8.1.7
3. Oracle 8i Client 설치 방법
이것은 다른 문서에 많이 소개되었으므로 세부적인 순서는 생략한다.
다만, 설치문서를 2종 소개하며 이를 참조하기 바란다.
(1) 종스클럽
http://www.jongsclub.com/webedit/studyView.jsp?num=18
(2) 김성박
http://database.sarang.net/database/oracle/install/oracle816/816onRedhat7/oracle-linux.html
4. PHP 설치 하기
위 오라클 설치하는 데에도 애를 많이 먹었지만, 오라클 기능이 연동된 PHP 를 설치하는 데에는 더 많은 시간과 노력이 들었다. 둘 다 합쳐 근 한달간을 소비하였다. PHP 소스 RPM 설치법은 아마도 국내인은 시도한 사람이 없는 듯, 참고 자료를 국내 인터넷에서 찾을 수가 없었으며, 문제가 생길 때마다 외국 싸이트를 뒤져 참고하였다.
(1) RPM 파일들을 모아 놓은 곳 : http://rpmfind.net/linux/RPM
이 싸이트는 RPM 파일을 가져오기 위해서는 반드시 알아둬야 할 싸이트이므로 브라우저의 즐겨찾기에 올려 놓는다.
(2) PHP 소스 RPM 복사
각자 자신의 환경에 맞는 버전을 찾아 복사한다.
나의 경우는, php-4.2.2-17.src.rpm
(3) 소스 RPM 설치하기
나의 경우는 /usr/src 에 위의 파일을 갖다 놓고 설치.
rpm -Uvh php-4.2.2-17.src.rpm
(4) 소스 풀기
위 (3)번을 실행하고 나면, 소스 디렉토리가 /usr/src/redhat/SOURCES 에 생기고, 이곳에 php-4.2.2.tar.gz 이 만들어 진다.
tar xvfz php-4.2.2.tar.gz
(5) spec 파일 수정하기 : php.spec
위 (3)번을 수행하고 나면 4개의 디렉토리가 생기는데, 그 중 하나가/usr/src/redhat/SPECS 이며, 이곳에 php.spec 이 존재한다.
이것은 php ./configure 에서 옵션들을 넣어주는 것과 같은 기능을 하는 것이며, 또는 phpinfo() 에서 본 configure 옵션과 같은 것이다.
아무튼 수정할 부분은 Oracle 부분이므로, --without-oci8 을 바꿔 줘야 한다.
그리고 Oracle 디렉토리를 지정해야 하는데, 이는 오라클 설치시에 ORACLE_HOME 으로 지정한 곳이므로, 나의 경우는
--with-oci8=/home/oracle/product/8.1.7
--enable-sigchild
그런데 php.spec 파일을 잘 보면 맨 위에서 서너줄 아래에 oracle 라이브라리 컴파일 부분 정의 하는 것이 있는데, %{!?oracle:%define oracle 0} 에서 0을 1로 바꿔주고, 아래 configure 옵션중에서 %if %{oracle} 에서 바꿔주는 방법과, 또는 이를 놔두고 그냥 configure 옵션 중에 위 2 옵션을 넣어도 된다.
(6) PHP 빌드하기 : PHP RPM 파일 만들기
rpmbuild -bb php.spec
이 명령을 수행하면 무수한 에러가 튀어 나온다. 만약 PHP 소스 RPM 을 시도한 사람이라면 여기서 포기한 사람이 대부분일 거라고 생각한다. 나도 여기서 많은 시간을 소비하였다.
(7) PHP 빌드에 필요한 다른 rpm 파일 복사하기
지금 당장 필요한지 어떤지는 몰라도, PHP 빌드시에 연계되어 있던 파일들이 없다고 에러 메시지가 나오면 이것들을 rpmfind.net 에서 복사하여 실행한다.
나의 경우는,
Error : Failed build dependencies
bzip2-devel is needed by php-4.2.2-17 하면서
아래 파일들도 같은 메시지
gd-devel, freetype-devel, pspell-devel, httpd-devel, libjpeg-devel, libpng-devel, imap-devel, mysql-devel, postgresql-devel, unixODBC-devel, net-snmp-devel
(8) PHP 빌드하기 : glibc 버전 점검
아마 (7)을 수행하고 다시 (6)번을 수행해도 역시 에러가 뜰 것이다.
만약 이것이 C 컴파일러 관련된 것이라면, Oracle 설치시에 C 컴파일러 버전을 낮추었던 걸 기억하실 것이다. 즉 glibc-2.1.3 을 설치하고 링크 걸고, 원래 있던 glibc-2.3.2 를 백업해 놓았으리라. 이걸 다시 원상 복구 시키고 (6) 을 실행하여야 한다. 원상 복구법은 Oracle 설치법에서 기술되어 있다.
(9) PHP 빌드하기 : lclntsh 에러 만나기
아마도 이 정도 했으면 에러 없이 넘어가리라 짐작하지만 이제 가장 중요한, 그리고 대책없는 에러를 만날 것이다. 에러 내용은,
/usr/bin/ld : cannot find -lclntsh
collect2 : ld returned 1 exit status
이러면서 Bad code 가 나오면서 빌드과정이 중지되고 rpm 파일은 만들어지지 않을 것이다.
결국, 이 에러의 원인도 Oracle 이 glibc 2.1.3 에서 컴파일 되었고 이 버전의 라이브러리를 사용하는데, 실제 시스템에 있는 것은 상위 버전 2.3.2 가 존재하니 버전 미스매치에 의한 에러, 컴퓨터를 다루다 보면 흔히 경험하게 되는 분야이지요. 응 그러나 리눅스 초보인 (1년) 나의 경우에는 심각한 상황.
이 에러 내용에 대해 인터넷 싸이트를 수도 없이 뒤지고 방황, 국내 싸이트에서는 아예 이런 시도를 볼 수도 없었고 해외 싸이트에서 같은 예를 보았으나 응답한 놈이 무성의하게 대답하거나 정곡을 찌르지 못하므로서 해답 찾는데 거의 탈진하는데…
핵심은 라이브라리 인데, 문제는 PHP 가 빌드될 때 다른 소프트웨어는 glibc 2.3.2 를 요구하는데 Oracle 만 2.1.3 를 사용하므로 이 둘을 한꺼번에 만족시키는 방법을 찾아야 해결된다고 생각하였다.
그런데 Oracle 사의 Patch Description 에 이에 대한 설명이 있는 걸 발견하였다. 이건 실제로는 Oracle 설치 시에 수행했었어야 하지만, 내가 참고한 Oracle 설치문서에는 이런 구절이 없었기에 (그 이유는 아마도 그 필요성을 만나지 못하여 기술하지 않았는지 모르지만) 그냥 넘어 오다가 이곳에서 문제에 봉착한 것이다. 마저 설명하면,
glibc-2.1.3-stubs.tar.gz 을 복사해 온다.
다운 받는 곳은, http://www.pawprint.net/linux/glibc-2.1.3-stubs.tar.gz
cd $ORACLE_HOME
tar xvfz glibc-2.1.3-stubs.tar.gz
./setup_stubs.sh
(10) PHP 빌드하기 : shared 라이브라리 표시
(9)번 까지 하고, php.spec 를 빌드하면 되겠지 하고 믿었는데, 또 다시 에러가 나타난다. 뭐가 문제인가 ? 이것까지 해줬는데…
문제 해결은 여기서 찾아야 하는데,
--with-oci8=/home/oracle/product/8.1.7
이것은 Oracle 라이브라리는 제대로 찾아 주지만, glibc-2.1.3 에 해당되는 것은 찾아 주지 못하니 이게 문제로 여겨졌는데, 마침 외국 싸이트에서 Debian 에서 같은 문제에 봉착한 걸 해결했다는 어느 사람의 얘기에서 힌트를 얻게 되었다. 핵심은 shared 라, 요게 결국 stubs 라이브러리를 지정하는 걸로 추정하게 되었다. 그렇다고,
--with-oci8=shared
로 하면 또다시 에러가 발생하는데, 당연히 Oracle 라이브라리를 못 찾는다는 에러 이지요. 그렇다면 어떻게 해야 되나 ? 해답은,
--with-oci8=shared, /home/oracle/product/8.1.7
과 같이 수정해 줘야 한다. 그리고 빌드 수행.
(11) php.spec 재수정 : openssl 없애기
(10)번 까지 하고 빌드 걸어 에러 없이 끝났으면 좋겠는데, 또다시 에러가 나타난다. 에러 내용 간단히 소개.
Checking for unpackaged file(s):
/usr/lib/rpm/check-files /var/tmp/php-root
error : Installed (but unpackaged) file(s) found:
/usr/lib/php4/openssl.so
RPM build errors:
이거 언제 끝나는 건가 독자들은 궁금해 할 것이다. 나는 또다시 이 대목에서 좌절했다가 다시 도전. 이 역시 인터넷 싸이트를 엄청 뒤져 보았는데, 역시 국내 싸이트에서는 일언반구 도움을 받을 수가 없었고, 외국 싸이트에서 얻은 힌트는 이건 지원 못한단다. 없애는 수 밖에. 눈물을 머금고 php.spec 수정.
--without-openssl
openssl 이 뭔지 자세히는 모르지만 이 기능은 장래 사용하지 못할걸 각오해야 한다.
(12) PHP RPM 실행하기
이제 빌드 걸면, 이상 없이 빌드가 끝난다. 휴.
그러나 모든 게 끝난 걸로 생각하지만 아직은 아니다. 일단 그 지겨운 PHP RPM 파일이 만들어 졌으니 그걸 우선 설치한다. RPM 파일이 만들어진 장소는, 나의 경우엔, /usr/src/redhat/RPMS/i386 에 있는데, 거기서 새로운 php 를 설치하기 전에 기존에 설치되어 있던 php 를 지우고 설치한다.
rpm -e --nodeps php
rpm -Uvh php-4.2.2-17.i386.rpm
이곳에는 이 파일 이외에 빌드로 만들어진 다른 파일들이 많이 있다.
(13) php-oci8 설치하기
PHP RPM 파일 설치하고 나서, php-oci8 파일도 설치해야 한다.
rpm -Uvh php-oci8-4.2.2-17.i386.rpm
이거 돌렸을 때, 모든 게 에러 없이 끝났으면 얼마나 좋았을까 ?
그러나 미치게도 또 다시 에러 출현, 환장할 지경, 에러 내용은,
error : Failed dependencies
libclntsh.so.8.0 is needed by php-oci8-4.2.2-17
도대체 어디를 건드려야 한단 말인가 ? 또다시 인터넷 싸이트 뒤지기, 그런데 별 뾰족한 응답을 발견하지 못했다. 그저 얻은 힌트는 dependency 무시하기. 그러나 그렇게 하면 아파치 시동 시 에러가 난단다. 일단 그건 나중에 해결하기로 하고,
rpm -Uvh --nodeps php-oci8-4.2.2-17.i386.rpm
(14) httpd 수정하기
(13)번 때문에 아파치 시동시에 에러가 난다고 그러는데, 나의 경우는 (14)번을 먼저하고 (13)을 수행하였기에 그 에러를 못 만났는데, 다음을 수정해야 한다고 한다.
/etc/init.d 또는 /etc/rc.d/init.d
에 있는 httpd 파일의 “start” section 에 (실제로는 start section 시작 전에) 다음을 집어 넣는다.
export LD_PRELOAD=/home/oracle/product/8.1.7/lib/libclntsh.so.8.0
export LD_LIBRARY_PATH=/home/oracle/product/8.1.7/lib
(15) php.spec 파일 수정의 결론
설명의 전개를 내가 경험한 순서대로 쓰다가 여러 시행착오를 겪은 내용대로 설명이 되어, 쓰잘 데 없는 군더더기가 들어가게 되었는데, 결론을 총합하면, php.spec 의 수정 부분은 다음과 같다. 단 세가지.
--with-oci8=shared, /home/oracle/product/8.1.7
--enable-sigchild
--without-openssl
(16) 마무리
아파치 재시동.
그리고 점검, 홈페이지는 잘 뜨는지, 게시판은 잘 보이는지, phpinfo() 도 보고, 과거와 어떻게 달라졌는지.
Oracle SQL 은 여전히 잘되는지 등등.
이제 PHP 와 Oracle 을 사용할 차례.
bibaram