본문 바로가기

솔라리스 10, 솔라리스 익스프레스에서 SAMP (솔라리스, 아파치 2, MySQL 5, 그리고 PHP 5) 설정하기

솔라리스10 상에서 SAMP 서버의 사용법에 대한 많은 글들이 인터넷 상에 존재 합니다. 그러나 이러한 글들 중 대부분은 구 버전의 소프트웨어를 사용하거나 PHP를 포함하고 있지 않습니다. 몇몇 글들은 이러한 과정을 이해하는데 도움을 줄 수 있는 자세한 설명이나 예시들이 부족합니다.

시작하기에 앞서 솔라리스10 혹은 솔라리스 익스프레스에는 아파치 2.0.x 와 MySQL 4 가 설치 되어 있음을 먼저 밝혀 둡니다. 솔라리스10 컴패니언 시디는 PHP 4 또한 포함하고 있고 현재 솔라리스는 PHP 5 혹은 MySQL 5를 번들하지 않습니다.

이 글은 기술자가 어떻게 최신 PHP 5 를 구축하고, 이것을 Blastwave 의 MySQL 5로 통합시키며, 솔라리스에서 번들되는 아파치2 와 결합시키는지 알아 봅니다. 혹시 어떠한 소프트웨어도 컴파일 하기를 원치 않거나 썬의 고성능, 최적화 된 빌드의 패키지를 원한다면 썬의 "Ready to Run" 쿨 스택 패키지를 http://cooltools.sunsource.net/coolstack/index.html 혹은 http://sunfreeware.com/coolstack.html 에서 찾아보시기 바랍니다.

위 패키지들을 이용한 SAMP 서버 설정에 대한 예전 문서는 BigAdmin 포털 에 커뮤니티 제출물 중에서 찾으실 수 있습니다. 또한 상세한 설명이 조금 부족하고 구버전인 아파치 1.3 을 사용하기는 하지만 Mel Lester 의 글 역시 꽤 상세한 정보를 제공하는 참고할 만한 잘 쓰여진 문서중에 하나 입니다. Lester의 글 중 딱 한가지의 예외는 바로 우리가 선호하는 현재 MySQL의 버전 5.0 이 아닌 솔라리스에 번들된 MySQL4 버전을 사용한다는 것입니다.

많은 수의 사람들이 소프트웨어를 재구축 하는 첫번째 이유는 퍼포먼스의 향상, 버그 및 보안 패치, 다양한 PHP 웹 어플리케이션을 위한 컴파일 타임의 옵션 지정등을 하기 위함입니다.

이 글에서는 다음과 같은 소프트웨어를 설치에 사용합니다:

  • 솔라리스 설치시 제공되는 아파치
  • Blastwave.org 에서 MySQL 5를 받아와서 사용, pkg-get 을 이용해 인스톨
  • php.net 에서 최신 버전 PHP 5를 다운로드 받은 후 컴파일

우리는 32-비트 모드에서 구축 할 것이며, 대부분의 경우 GNU 툴 체인을 사용할 것입니다.

아래는 이러한 어플리케이션들을 통합함으로써 솔라리스10, 아파치, PHP 5 그리고 MySQL 5 웹 어플리케이션을 사용할 준비를 하는 과정입니다.

그 단계는 다음과 같습니다:

1. 솔라리스10, 솔라리스 익스프레스/네바다 혹은 오픈 솔라리스를 설치합니다.

2. 시스템을 네트워크에 연결해서 정적인 IP 주소를 가지고 인터넷에 접근 할 수 있도록 합니다. 만약 네트워크 설정에 도움이 필요하다면 다음의 문서를 참고하시기 바랍니다: System Administration Guide: IP Services.

3. 우리는 MySQL5를 Blastwave.org 로 부터 설치하기를 원합니다. 웹 브라우저를 열고 Blastwave.org's step-by-step guide 를 확인한 다음 단계 1 부터 7을 수행하는 간단한 작업을 거치면 됩니다. 이제 여러분은 pkg-get 커맨드를 이용해서 MySQL 5 같은 패키지들을 네트워크를 통해 인스톨할 준비가 되었습니다.

4. 이제 MySQL 5를 설치할 준비가 되었습니다. 콘솔 혹은 xterm 윈도우에서 root 로 로그인 한 후에 다음과 같은 커맨드를 입력합니다:

# /opt/csw/bin/pkg-get -i mysql5 mysql5client mysql5devel mysql5rt
# /opt/csw/bin/pkg-get -i mysql5test

주의: mysql5devel 패키지를 설치하는 것이 매우 중요하며, 설치 하지 않을 경우 후에 PHP 5를 구축하는데 어려움을 겪을 것입니다.

5. 이제 MySQL 5를 설정합니다.

Blastwave.org 에 가이드가 있습니다: http://www.blastwave.org/packages.php/mysql5 에 가서 "View news and info about the software package" 라고 써있는 회색 버튼을 클릭 합니다. 이 글에는 동일한 가이드를 반복하고 몇가지 주제들은 더 확장하여 다룰 것입니다. (문서를 우리와 공유해준 Blastwave 에게 감사의 말씀을 드립니다.)

A. 설정 파일 /opt/csw/mysql5/my.cnf 을 다음과 같이 만듭니다: /opt/csw/mysql5/share/mysql/my-*.cnf 파일들 중 하나를 /opt/csw/mysql5/my.cnf 로 카피 하고 InnoDB 활성화 같이, 환경에 맞게 이 파일을 수정합니다. /opt/csw/mysql5/var 는 더이상 사용 되지 않는다는 점을 주의하십시오. 만약 어떠한 파일을 카피해야 할지 확신이 서지 않으면 my-small.cnf 을 사용하기 바랍니다.

B. 다음 단계에서 데이타베이스를 초기화 하기 전에 MySQL 사용자와 그룹을 설정하는것이 중요 합니다. 이것은 Blastwave 패키지 인스톨 스크립트에 의해 자동으로 진행됩니다. 그러나 만약 소스를 통해 구축 한다면 다음과 같이 사용자와 그룹을 생성해야 합니다:

# groupadd mysql
# useradd -c "MySQL Server" -d /dev/null -g mysql -s /bin/false mysql 

C. 데이타베이스를 초기화 하고 허가권한을 수정합니다:

cd /opt/csw/mysql5
./bin/mysql_install_db
chown -R mysql:mysql ./var

주의: 만약 위의 chown 단계를 무시하면 MySQL은 시작하지 않을 것입니다.

D. MySQL 5 를 시작시킵니다. 간단히 서버를 시작하여 위의 단계가 올바로 행해졌는지 알아보기 위해 다음의 커맨드를 이용할 수 있습니다:

# cd /opt/csw/mysql5 ; /opt/csw/mysql5/bin/mysqld_safe &

ps 커맨드를 이용해서 시작이 됐는지 확인할 수 있습니다. 그리고 kill 커맨드와 PID 를 이용해서 중지시킬 수 있습니다.

주의: 다음 단계로 진행하기 전에 이 전에 언급됐었던 프로세스들을 모두 삭제하시기 바랍니다. 그렇지 않을 경우 다음 단계들에서 SMF 를 활성화 했을때 MySQL이 제대로 시작되지 못합니다.

다음의 명령어가 동작해야 합니다:

# pkill mysql

재부팅시에 자동으로 시작하기 위해 이후의 내용을 계속 읽어보시기 바랍니다.

주의: 솔라리스 익스프레스, 네바다, 솔라리습10 업데이트등의 최신 빌드들은 mysql 같은 데몬을 시작시키기 위해 SMF를 사용합니다. 아래의 과정은 유동적일 수 있습니다. 만약 SMF를 사용하는 솔라리스 버전을 가지고 있다면 아래에서 보여진대로 svcadm 커맨드를 통해 MySQL 5 를 시작/중지 시킬 수 있습니다.

구시대의 RC 파일 방법:

 # /etc/init.d/cswmysql5 start

새로운 SMF 방법:

만약 MySQL 5 패키지를 RC 파일 대신 SMF를 사용하는 솔라리스 버전에 설치했다면 패키지가 MySQL 을 위한 기본 SMF manifest 를 설치 했음을 알 수 있습니다. 다음의 커맨드를 이용해서 서비스의 상태를 살펴 봅시다:

 # svcs -a | grep mysql
 disabled 13:36:01 svc:/network/cswmysql5:default
MySQL 서버를 시작하는 것을 확인하기위해(재부팅시에도 마찬가지로) 다음의 커맨드를 실행시킵니다:
# svcadm enable svc:/network/cswmysql5:default

동일한 커맨드를 반복하여 확인합니다:

# svcs -a | grep mysql
online 15:12:43 svc:/network/cswmysql5:default

# svcadm disable svc:/network/cswmysql5:default 를 사용하여 서버를 중지 시킬 수 있고 svcadm enable 커맨드를 실행시키기 전까지는 재부팅 시에도 역시 시작되지 않습니다.

E. MySQL 루트 유저의 패스워드를 반드시 지정하시기 바랍니다!

이것은 절대 솔라리스의 루트 사용자 패스워드와 같아서는 안됩니다. 이렇게 하기 위해 서버를 시작하고 다음의 명령어를 실행시킵니다:

로컬 패스워드를 지정합니다:

# /opt/csw/mysql5/bin/mysqladmin -u root password 'new-password'
	
# /opt/csw/mysql5/bin/mysqladmin -u root -h <YOUR-HostName-Here> \
password 'new-password'

(마지막 커맨드는 보안 옵션에서 네트워크 접근을 비활성화 시켰을때 실패 메세지를 나타낼 것이고 또한 필요하지도 않습니다. 자세한 사항은 아래의 Step 5, part I 를 참고 바랍니다.)

좀 더 자세한 정보는 MySQL 5 documentation 를 참고 바랍니다.

F. 선택사항: 이것은 시간이 좀 걸립니다.다음의 커맨드를 이용해서 MySQL 데몬의 테스트 스윗을 실행시킬 수 있습니다:

# cd /opt/csw/mysql5/mysql-test
# ./mysql-test-run

G. 설치가 잘 됐는지 체크합니다:

# ./bin/mysql -p

MySQL 루트 패스워드를 입력하라고 요구합니다. mysql 프롬프트가 꼭 보여야 합니다. STATUS 같은 명령어를 이용해서 서버가 응답하는지 확인합니다. 그 다음 mysql 프롬프트에서 테스트 쿼리를 실행해 봅니다:

show databases;

mysql 과 테스트 데이타베이스가 결과값으로 리턴됩니다.

quit

주의: 스타트 옵션은 /opt/csw/mysql5/etc/mysql5rc 혹은 /etc/opt/csw/mysql5rc 을 생성, 편집함으로써 오버라이드 될 수도 있습니다.

mysql5rc 의 템플릿은 /opt/csw/mysql5/share/mysql 에 존재합니다. 반드시 이 템플릿을 이용해서 rc 파일을 생성 해야 합니다. 예를 들어:

  1. # mkdir -p /etc/opt/csw
    다음과 같은 퍼미션을 사용함: chown root:bin /etc/opt/csw and chmod 0755 /etc/opt/csw.
  2. # cp /opt/csw/mysql5/share/mysql/mysql5rc /etc/opt/csw/
    만약 어떠한 mysql5rc 파일도 사용가능하지 않다면 데몬은 기본으로 시작 됨. 오직 테스트를 위한 시스템에서 이러한 일이 발생한다면 신경 쓰지 말것; 이것은 선택사항임.

H. 참고 문서:

I. MySQL 보안은 이 글의 주재를 벗어 납니다. 그러나 몇가지 고려해야할 기본 사항을 제시합니다:

  • MySQL 루트 사용자가 패스워드를 지정했고 이것이 호스트 시스템의 루트 패스워드와 달라야 함.
  • 오직 MySQL 사용자 만이 데이타베이스 디렉토리에 대한 읽기 쓰기 권한을 가지고 있음.
  • 만약 PHP 웹서버에서 MySQL을 사용하고 있다면(그래서 오직 PHP/아파치 와 MySQL 간에 localhost 접속만이 필요하다면), /opt/csw/mysql5/my.cnf 설정 파일의 [mysqld] 섹션에 skip-networking 줄을 추가 시킴. 이것은 MySQL 데몬으로의 외부 TCP/IP 접근을 차단함.
  • SQL 인젝션 등의 공격이 일어 났을때 권한이 없는 파일들을 읽을 수 있도록 해주는 LOAD DATA LOCAL INFILE 커맨드의 사용을 비활성화 시킴. my.cnf 파일의 [mysqld] 섹션에 set-variable=local-infile=0 을 추가시킴.
  • 사용자 테이블에서 익명 사용자 어카운트를 제거함.

위에서 설명한 사항들은 정말 기본만을 다룬 것이지만 설치후에 해볼 수 있는 좋은 예제들 입니다. 인터넷 검색창에 "Securing MySQL" 을 입력하여 MySQL의 보안 관련 자료들을 읽어 보시기 바랍니다.

6. MySQL 5 의 설치과 테스트가 끝났으면 다음 단계로 PHP 5 를 구축 합니다. Mel Lester 의 허가를 통해 Mel Lester's 웹 사이트 에서 상당량의 정보를 차용 합니다. 우리는 조금 다른 옵션과 경로를 사용하기 때문에 몇몇 PHP 설정 정보를 수정할 수 있습니다.

특별히 우리는 Blastwave MySQL 5 의 경로인 /opt/csw/mysql5 을 사용 하여 컴파일 하기 전에 PHP 5의 설정을 변경하고 몇몇 옵션들을 추가할 것입니다. 또한 이 과정에서 PHP 5 를 구축하기 위해 필요한 GNU 툴들이 설치 되었는지도 확인할 것입니다.

A. 글로벌 존을 루트 로 접속한 후 /opt/csw/bin/usr/sfw/bin$PATH 에 다음 처럼 포함되어 있는지 확인합니다:

global# echo $PATH
  /opt/csw/bin:/usr/sfw/bin:/usr/sbin:/usr/bin:/usr/openwin/bin: \
  /usr/dt/bin:/usr/ccs/bin

자 이제 처음 단계로써 우리는 root.profile 이나 / 디렉토리가 쓸때 없는 내용으로 채워지길 바라지 않습니다. 필자는 솔라리스10, 솔라리스 익스프레스 혹은 오픈솔라리스를 사용하는 유저들을 위해 /root디렉토리를 만들고 /etc/passwordbash 혹은 ksh 쉘을 이용하는 또다른 root 계정을 만든 다음, 이 계정의 홈 디렉토리를 /root 로 사용할 것을 제안합니다. 이것은 오직 제안에 불과 하므로 여러분들과 구글을 위한 주제로 남겨 두도록 하겠습니다. 어떠한 방법을 걸정하던지 간에 경로에 위의 두 디렉토리가 포함되었는지 반드시 확인 후에 진행하도록 합니다.

B. Blastwave.org 의 pkg-get 커맨드(위의 Step 3 에서 설치된)를 사용하여 GNU autoconf, automake, 그리고 gsed 패키지를 설치하도록 합니다. 아래의 소프트웨어 버전들은 비슷하거나 상대적으로 더 최신 버전이어야 합니다.

global# pkg-get -i autoconf
...
global# which autoconf && autoconf --version | head -2
/opt/csw/bin/autoconf
autoconf (GNU Autoconf) 2.59
Written by David J. MacKenzie and Akim Demaille.

global# pkg-get -i automake
...
global# which automake && automake --version | head -2
/opt/csw/bin/automake
automake (GNU automake) 1.8.3
Written by Tom Tromey <tromey@redhat.com>.

global# pkg-get -i gsed
...
global# which gsed && gsed --version | head -2
/opt/csw/bin/gsed
GNU sed version 4.1.4
Copyright (C) 2003 Free Software Foundation, Inc.

C. PHP 를 설치 하는데 요구되는 오픈 소스 소프트웨어들이 사용가능한지 확인 합니다. (원한다면 PHP 메뉴얼의 Solaris specific installation tips 섹션을 참고하실 수도 있습니다) 다음 소프트웨어들의 버전은 상대적으로 비슷하거나 최신이어야 합니다:

global# which gcc && gcc --version | head -2
/usr/sfw/bin/gcc
gcc (GCC) 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
Copyright (C) 2004 Free Software Foundation, Inc.

global# which gmake && gmake --version | head -2
/usr/sfw/bin/gmake
GNU Make 3.80
Copyright (C) 2002 Free Software Foundation, Inc.

global# which flex && flex --version | head -2
/usr/sfw/bin/flex
flex version 2.5.4

global# which bison && bison --version | head -2
/usr/sfw/bin/bison
bison (GNU Bison) 1.875
Written by Robert Corbett and Richard Stallman.

global# which gm4 && gm4 --version | head -2
/opt/csw/bin/gm4
GNU M4 1.4.3
Written by Rene' Seindal.

global# which perl && perl -v | head -2
/opt/csw/bin/perl

This is perl, v5.8.7, built for sun4-solaris-thread-multi

global# which gunzip && gunzip -V | head -2
/usr/bin/gunzip
gunzip 1.3.3-patch.1
(2002-03-08)

global# which gtar && gtar --version | head -2
/usr/sfw/bin/gtar
tar (GNU tar) 1.14
Copyright (C) 2004 Free Software Foundation, Inc.

D. libxml2 을 소스로 부터 빌드함으로써 오픈 소스 툴들을 테스트 합니다.

xmlsoft 의 최신 버전을 다운로드 받습니다.

우리의 경우엔 다음의 파일을 사용합니다:

# wget ftp://xmlsoft.org/libxml2/libxml2-2.6.26.tar.gz

다음의 단계를 실행할 디렉토리는 직접 정하시기 바랍니다:

global# gunzip -cd libxml2-2.6.26.tar.gz | gtar xvpf -
global# cd libxml2-2.6.26
global# ./configure
...
global# gmake
...
global# gmake install
...

libxml2 소프트웨어의 구축과 설치가 끝났으며, 그것을 /usr/local 에서 확인하실 수 있습니다.

주의: 솔라리스 네베다 빌드 42 혹은 그 이후의 버전에서 libxml2 패키지의 업데이트 된 버전을 가지고 있음을 확인 할 수 있습니다. 그러므로 솔라리스 네바다 빌드 42 그리고 네바다 빌드 42 이상의 기반하고 있는 오픈 솔라리스는 libxml2 (Part 6D) 을 빌드할 필요가 없고 PHP 5 설정 파일을 다음과 같이 변경해 주면 됩니다:

--with-libxml-dir=/usr/local

으로:

--with-libxml-dir=/usr 

E. 만약 /etc/apache2/httpd.conf 파일이 존재하지 않는다면 다음을 이용합니다:

global#cp /etc/apache2/httpd.conf-example /etc/apache2/httpd.conf

/etc/apache2/httpd.conf 을 텍스트 에디터로 편집합니다:

  • ServerName 을 필요에 따라 호스트 네임으로 변경함 (기본값은 127.0.0.1).
  • ServerAdmin 에 유효한 이메일 주소를 설정함.

F. www.php.net 에서 최신 버전의 PHP 를 다운로드 받고 컴파일 하기 위해 /src 혹은 /build 혹은 직접 지정한 디렉토리등을 선택합니다. 이글을 쓰는 시점에서 PHP 5의 최신 버전은 http://www.php.net/downloads.php#v5 에서 다운로드 받을 수 있었습니다. gzip으로 압축된 파일을 골라 다운로드 했으므로 다음의 커맨드를 사용할 수 있습니다:

global# gunzip -cd php-5.1.6.tar.gz | gtar xvpf -
...
global# cd php-5.1.6

이것이 본래 웹페이지(Mel Lester)의 내용과 다른 점입니다. 원본은 /usr/sfw 에 있는 구버전의 MySQL 4를 이용했고 우리들은 /opt/csw/mysql5 에 존재하는 현재의 MySQL 5 버전을 사용합니다. 그러므로 우리의 설정 옵션들은 다음과 같습니다:

 global# ./configure --with-apxs2=/usr/apache2/bin/apxs --enable-dbase \
 --with-libxml-dir=/usr/local --with-config-file-path=/etc/apache2 \
 --with-mysql=shared,/opt/csw/mysql5 \
 --with-mysqli=shared,/opt/csw/mysql5/bin/mysql_config \
 --with-xpm-dir=/usr --with-gd --with-tiff-dir=/usr --with-bz2=/usr/lib \
 --with-jpeg-dir=/usr --with-png-dir=/usr --with-zlib --enable-mbstring \
 --enable-calendar--enable-bcmath --enable-ftp --enable-exif

위의 설정 옵션들은 간단한 서버 설정을 위해 충분합니다. 다른 많은 옵션들도 존재하지만 이것들은 여러분이 선택하실 수 있도록 문서로 남겨 두겠습니다. 몇몇 옵션들은 # ./configure --help 혹은 PHP 웹사이트의 Appendix F. Configure options 에서 열람하실 수 있습니다.

주의: 만약 openssl 를 활성화 하려고 한다면 아파치와 MySQL 을 동일한 openssl 라이브러리를 가지도록 재컴파일 해줘야 할 것입니다. 그렇지 않을 경우 PHP에서 MySQL로의 접속이 실패할 것입니다. 만약 세션들을 위해 쿠키를 사용할 예정이라면 mcrypt 라이브러리를 시스템에 추가시킴으로써 퍼포먼스의 향상을 얻을 수 있습니다. --with-mycrpt 컴파일 옵션을 사용하면 됩니다.

흥미로운 점: 만약 다른 사람들이 사용하고 있는 config 옵션이 궁금하다면 phpinfo() 를 인터넷 검색 엔진에 입력해 보시기 바랍니다. :-)

자 이제 구축 과정을 시작합니다:

 ...
 global# gmake
 ...
 global# gmake install

 ...
 Installing PHP SAPI module: apache2handler
 /var/apache2/build/instdso.sh SH_LIBTOOL='/var/apache2/build/libtool' libphp5.la 
/usr/apache2/libexec
 /var/apache2/build/libtool --mode=install cp libphp5.la /usr/apache2/libexec/
 cp .libs/libphp5.so /usr/apache2/libexec/libphp5.so
 chmod +x /usr/apache2/libexec/libphp5.so
 cp .libs/libphp5.lai /usr/apache2/libexec/libphp5.la
 libtool: install: warning: remember to run 'libtool --finish /build/php-5.1.2/libs'
 chmod 755 /usr/apache2/libexec/libphp5.so
 [activating module 'php5' in /etc/apache2/httpd.conf]
 Installing PHP CLI binary: /usr/local/bin/
 Installing PHP CLI man page:/usr/local/man/man1/
 Installing build environment: /usr/local/lib/php/build/
 Installing header files: /usr/local/include/php/
 Installing helper programs: /usr/local/bin/
  program: phpize
  program: php-config
 Installing man pages: /usr/local/man/man1/
  page: phpize.1
  page: php-config.1
 Installing PEAR environment:/usr/local/lib/php/
 [PEAR] Archive_Tar - installed: 1.3.1
 [PEAR] Console_Getopt - installed: 1.2
 pear/PEAR can optionally use package "pear/XML_RPC" (version >= 1.4.0)
 [PEAR] PEAR - installed: 1.4.6
 Wrote PEAR system config file at: /usr/local/etc/pear.conf
 You may want to add: /usr/local/lib/php to your php.ini include_path
 Installing PDO headers: /usr/local/include/php/ext/pdo/
 #
G. php.ini-distphp-5.1.6소스 디렉토리에서 아파치의 config 디렉토리로 카피합니다:
global# cp php.ini-dist  /etc/apache2/php.ini

만약 아피치 웹서버를 존에서 설정한다면 다음과 같은 예제 경로를 가질 것입니다 (존에 따라 달라짐):

global# cp php.ini-dist /zones/zone0/root/etc/apache2/php.ini

다음단계로 우리는 설정 파일들을 수정하고 전체 소프트웨어 스택을 테스트해 볼것입니다.

H. 설정 파일들을 수정합니다.

/etc/apache2/php.ini 파일을 PHP 옵션들을 지정하도록 수정합니다.

PHP 5는 더이상 MySQL 인터페이스 모듈을 자동으로 로딩하지 않습니다.

사용자가 명시적으로 이러한 모듈과 필요한 확장 모듈을 지정해 줘야 합니다. 이렇게 하기 위해서는 php.ini 파일에 아래의 두가지 단계를 추가합니다:

1. 사용자에게 필요한 PHP 5 모듈들이 정상적으로 생성되었는지 확인:

# ls -l /usr/local/lib/php/extensions/no-debug-non-zts-20050922/  
total 1088
-rwxr-xr-x1 root root103144 Aug 29 21:48 mysql.so
-rwxr-xr-x1 root root429948 Aug 29 21:48 mysqli.so

php.ini 파일 내용 중에 아래와 같이 시작되는 줄을 찾음:

; Directory in which the loadable extensions (modules) reside.
extension_dir =

다음과 같이 수정:

extension_dir = "/usr/local/lib/php/extensions/no-debug-non-zts-20050922/"

만약 PHP 5 를 다른 장소에 설치 했다면 해당 설정에 맞게 변경.

2. 다음에 php.ini 파일에서 다음과 같은 블럭을 찾음:

  ;;;;;;;;;;;;;;;;;;;;;;
  ; Dynamic Extensions ;
  ;;;;;;;;;;;;;;;;;;;;;;

다음과 같은 라인을 추가 시킴:

  
extension=mysql.so

이제 아파치/PHP 5가 MySQL에 왜 연결이 안되는지 알아보느라 고생하는 일은 없을 것입니다.

3. 다음단계로, /etc/apache2/httpd.conf 파일을 수정해서 PHP 모듈을 로드하도록 합니다.

Find the line that contains php5_module 을 포함하고 있는 줄을 찾습니다. LoadModule 선언 오른쪽의 경로는 시스템상의 PHP 모듈 경로를 정확하게 가르켜야 합니다. 이 경로는 시스템의 /usr/apache2 디렉토리의 상대경로 입니다. (그러므로 실제로는 /usr/apache2/libexec/libphp5.so 을 가르키는 것임) PHP 5를 gmake 로 설치 했을 경우 위의 설정들이 이미 적용되어 있을 것입니다. 그러나 반드시 다시 한번 확인 해 보시기 바랍니다.

LoadModule php5_module libexec/libphp5.so

우리는 아파치가 .php 확장자를 가진 웹페이지 파일 이름을 PHP 로 해석하기를 원합니다. /etc/apache2/httpd.conf 파일의 AddType 섹션을 찾아서 다음과 같은 줄을 추가 시킵니다:

AddType application/x-httpd-php .php

몇몇 사용자들은 위의 라인을 httpd.conf 에서 생략시키고 대신 application/x-httpd-php php phtml/etc/apache2/mime.types 파일에 추가시키는 것을 선호하기도 합니다. 두가지 방법 모두 괜찮습니다.

I. 아파치 2를 기동시키고 테스트 합니다.

주의: 만약 이전에 다른 SAMP 문서를 통해, 컴패니언 CD의 스크립트를 통해서, 혹은 직접적으로 아파치 1.3 버전을 활성화 시켰다면 이러한 단계를 밟아 나갈때 충돌이 생길 수 것입니다. 진행하기 전에 아파치 1.3을 비활성화 시키는 것이 중요 합니다.

아파치 1.3이 비활성화 됐음을 확인 합니다:

 #svcs -a | grep apache
 legacy_run Sep_11lrc:/etc/rc3_d/S50apache
이것은 아파치 1.3의 레가시 rc 시작 스크립트가 /etc/rc3_d/S50apache 임을 보여 줍니다. 스크립트는 아파치의 설정파일 /etc/apache/httpd.conf 의 존재를 찾습니다. 그리고 만약 파일이 존재 하지 않으면 아파치 1.3은 기동되지 않습니다. 아파치 1.3을 비활성화 하려면 이전에 언급했던 패스에 파일이 존재하지 않음을 확인 하던지 혹은 시작 스크립트의 이름을 바꿔 버립니다. 이름을 다음에서:
 /etc/rc3_d/S50apache

다음으로 바꿔줍니다:

/etc/rc3.d/OFF-S50apache

"S" 로 시작하는 스크립트들 만이 실제로 부팅시에 시작 됩니다.

아파치 2 기동시키기:

# svcadm enable apache2
# svcs | grep -i apache2
online   18:07:10 svc:/network/http:apache2

만약 아파치 2가 성공적으로 기동 되면 ps 커맨드를 사용하여 아래와 같은 몇몇 프로세스들을 확인할 수 있어야 합니다\:

# ps -ef | grep http
webservd 18592 38020Sep 11 ? 0:03 /usr/apache2/bin/httpd -k start
webservd 13093 38020Sep 08 ? 0:07 /usr/apache2/bin/httpd -k start

10개 이상의 이와 같은 프로세스들을 발견하더라도 놀라지 말기 바랍니다. 또한 다음과 같은 프로세스에도 놀라지 마십시오:

root 49810 Jul 17 ? 1:28 /usr/apache/bin/httpd  \
                 -f /etc/apache/httpd-standalone-ipp.conf

이것은 간단히 예전의 아파치 1.3이 네트워크 포트 631번에서 IPP(Internet Print Protocol)에 의해 사용되고 있음을 나타냅니다. 포트 80번에서 동작하지 않기 때문에 이 글에서 설정하는 웹서버의 충돌은 일어나지 않을 것입니다.

7. 다음단계로 아파치 2 웹서버의 DocumentRoot 디렉토리에 테스팅을 위한 유용한 페이지를 넣어 봅시다. 적절한 에디터를 사용하여 다음과 같은 파일을 만들고 이것을 phpinfo.php 이라고 합시다:

<html>
<body>
      <p>Hello World</p>
      <?php phpinfo(); ?>
  </body>
</html> 

아파치 httpd.conf 파일에서 정의한대로 DocumentRoot 디렉토리에 파일을 위치시킵니다. 만약 웹브라우저에서 http://your-host-name/phpinfo.php 에 접속했고 잘 동작한다면 PHP와 아파치 MySQL의 상세한 설정 정보를 볼 수 있을 것입니다.

주의: 테스트가 끝난 다음에는 파일을 제거하거나 HTTP 인증등의 방법으로 파일을 보호하시기 바랍니다. 사이트에 대한 상당한 양의 정보를 제공되어 공격자에게 매우 유용한 정보가 될 수 있기 때문입니다.

이제 여러분은 위의 phpinfo 웹 페이지는 오직 아파치와 PHP 가 제대로 상호 동작할 때에만 제대로 테스트 된다는 것을 아셨을 것입니다. 비록 출력이 MySQL 클라이언트가 활성화 되었다는 정보를 보여주었지만, 사실 실제적으로 MySQL 서버와 테스트 접속을 해본 것은 아닙니다. 여기까지 왔으면 99% 이상의 사용자는 간단히 PHP/MySQL 어플리케이션을 설치할 수 있으며 정상동작을 기대할 수 있습니다. 그러나 만약 당신이 정말로 지나칠 정도로 신중한 타입의 사람이라서 최고의 정확성을 기하여 모든 부분을 테스트해 보고자 한다면, 다음의 간단한 PHP 웹 페이지가 그 일을 해줄 것입니다:

  1. PHP 페이지에서 MySQL 컨넥션을 연다.
  2. 모든 MySQL 설치가 끝난 다음에 존재하는 mysql 데이타베이스 이름을 선택한다.
  3. mysql 데이타베이스 내에 존재하는 테이블 이름들의 리스트를 확인한다.

대부분의 코드는 PHP 메뉴얼의 함수 사용법 예제에서 가져온 것입니다. 아래의 PHP 코드를 복사해서 파일(웹 페이지)로 만든 다음 simple-test.php 같은 이름을 지정 합니다. 파일을 수정하고 MySQL 서버에 접속하기 위해 패스워드를 삽입 합니다. 이 파일을 웹 서버의 DocumentRoot 에 위치 시킵니다(앞에서 phpinfo.php 를 넣었었던 바로 그 장소).

PHP 코드 입니다:

<?php
$db_username = "root";// EDIT if needed: The username for mysql.
$db_password = "insert-yours-here"; // EDIT ME
    // Above is YOUR password used for mysql admin access.
$db_hostname = "localhost";
$db_name = "mysql";  // Install creates this admin database.

if (!mysql_connect($db_hostname, $db_username, $db_password)) {
   echo "Can't connect to MySQL Server";
   exit;
}else{
   echo "Connection to Mysql server succeeded.";
   echo "<br>";
}

// Now query the db and get the list of tables.
$result = mysql_db_query($db_name, "SHOW TABLES");

if (!$result) {
   echo "DB Error, could not list tables\n";
   echo 'MySQL Error: ' . mysql_error();
   exit;
}

echo "<p>The selected database is name is mysql</p>";
echo "<p>Here is the list of tables</p>";
while ($row = mysql_fetch_row($result)) {
   echo "Table: {$row[0]} <br>";
}

mysql_free_result($result);
?>

위의 파일을 정확하게 복사 했고 소프트웨어가 올바르게 설정 되었다면 웹브라우저에서 http://yourserver.com/simple-test.php 에 접속했을때 다음과 같은 결과를 확인할 수 있어야 합니다:

Connection to Mysql server succeeded.
The selected database is name is mysql.

Here is the list of tables

Table: columns_priv 
Table: db 
Table: func 
Table: help_category 
Table: help_keyword 
Table: help_relation 
Table: help_topic 
Table: host 
Table: proc 
Table: procs_priv 
Table: tables_priv 
Table: time_zone 
Table: time_zone_leap_second 
Table: time_zone_name 
Table: time_zone_transition 
Table: time_zone_transition_type 
Table: user 

8. PHP 보안에 대해 살펴 봅시다.

이제 모든 것이 잘 동작하기 때문에 PHP의 기본 설치와 php.ini 의 기본 옵션들이 오직 개발시에만 안전할 뿐 실제 네트워크상에 노출 되는 상용 서버에서는 안전하지 않다는 것에 주의하셔야 합니다. 다음의 주의 사항을 꼭 읽어보시기 바랍니다:

A. 위의 Step 7 에서 만들었던 phpinfosimpletest PHP 웹페이지를 꼭 삭제하시기 바랍니다. (혹은 디렉토리에 HTTP 인증 과 같은 타입의 잠금 장치를 즉각 걸어 놓으시기 바랍니다.)

B. 아래와 같은 PHP 보안 문서들을 꼭 읽어 보시기를 권장합니다:

만약 읽어볼 시간이 없다면 최소한 PHP 소스 코드 디렉토리에 있는 좀 더 안전한 설정이라고 제안되고 있는 php.ini-recommended 라도 살펴보시기 바랍니다. 이 두개의 파일을 비교하여 실제 사이트에서 보안과 퍼포먼스를 위해 어떠한 수정을 가했는지 살펴보시기 바랍니다.

(# diff php.ini-dist php.ini-recommended | less)

필자는 이 글이 SAMP 에 대한 질문들에 대한 해답과 유용한 팁들이 되었기를 바랍니다. 솔라리스의 SAMP 서버를 즐기셨으면 합니다.


출처 : http://cafe.naver.com/smsecuritynew.cafe

728x90

댓글