2009. 7. 15. 15:02

레드헷 리눅스에서 Apache + Oracle + PostgreSQL + MySQL + PHP + Tomcat + JAVA 서버구성2

기본적 APM과 Oracle,PostgreSQL까지 구성이 끝났다. 지금 상태에서도 왠만한 사이트와 프로젝트는 수행할 능력이 된다. Oracle과 PostGreSQL을 제외한 APM만으로도 충분히 웹서버의 기능을 할수있다.

한동안 웹용 언어(CGI)로서 인기가 많았던 PHP의 경우 인기가 시들어가고 있다. 물론 지금도 PHP소스는 강력하다. 전세계용 웹어플리케이션인 Moodle이나 우리나라 웹사이트들이 많이 사용하는 제로보드,그누보드,테터툴즈,설치형 블로그등은 모두 PHP로 작성된 언어들이다. APM은 설치법이 다른 서버류보다 많이 일반화 되어 있고 한번에 설치해주는 툴도 많이 나와있다. 또한 리눅스,유닉스,윈도우즈 버젼으로 대개의 운영체제로 지원되기 때문에 유포형 웹솔루션으로서는 APM용 솔루션이 가장 적합하다.

그만큼 PHP는 나름 대중화 되어 있는 웹언어라고 할수 있다.
C를 약간 접한 사람이라면 PHP가 매우 친숙하다. PHP는 문법의 틀이 C의 구조와 매우 비슷하기 때문이다.

ASP는 MicroSoft사에서 개발한 웹용언어이다. ASP는 일단 Windows NT용이라는 생각이 머리에 꽂히게 된다. 보통의 APM이 Windows나 Linux와 유닉스에서도 모두 쓸수있다는 장점이 있지만, NT를 사용하지 않는 유져들은 ASP를 접할 기회가 드물다. 물론 Windows XP에서도 ASP는 돌릴수는 있다. 하지만 개인용 XP에 웹서버를 운영한다는것이 바로 자원의 낭비라는것을 곧바로 알게될것이다.

MS용 웹어플리케이션으로는 Apache에 대응하는 IIS가 있고, MySQL에 대응하는 MSSQL이 있다. ASP는 IIS와 MSSQL에 연동해 많이 쓰인다.

각설하고, 이 포스팅은 레드헷 계열(CentOS, Fedora, RHE)에서 서버구성의 발자취..즉 노트를 만드는 일이다.
그럼 지금 쓰는 포스팅.. JSP는 무엇인가?

JSP는 PHP와 ASP와 같은 스크립트 언어이다.
PHP가 C를 따르고 ASP가 비주얼베이직을 따랐다면, JSP는 Java를 따르고 있다.
제작사도 Java를 만드는 Sun사이다.

JSP는 PHP로 코딩하는것보다 더 어렵다. 많은 사람이 이치만 깨우치면 쉽다라고 하지만, 모든 표현을 객체화하여 표현하기 때문에 라이브러리 중심의 PHP보다 참조나 변형이 어렵다는것을 금방 알게된다. 또한 서블릿이라는 java로 컴파일한 객체를 사용할수 있다고 하는데 이분야는 좀더 연구를 해봐야겠다. 연구를 하면서 서블릿에 대한 포스팅도 시작하여야 겠다.

이제 그만 잡소리하고..설치를 해보도록 하자.

JAVA (jdk)
다운로드: 
http://www.snowrice.com/freepds/1103
http://java.sun.com/javase/downloads/


jdk-6u14-linux-i586-rpm.bin
jdk는 jdk와 jre로 구성되어있다. jdk는 한마디로 개발툴이고 jre는 자바용 프로그램들을 시스템에서 구현해주는 툴이라고 보면 된다. jdk설치로 두 가지다 설치된다.

[root@localhost Desktop]# chmod +x jdk-6u14-linux-i586-rpm.bin
[root@localhost Desktop]# ./jdk-6u14-linux-i586-rpm.bin
2. LICENSE TO USE. Subject to the terms and conditions of
this Agreement, including, but not limited to the Java

Do you agree to the above license terms? [yes or no]
yes
엔터계속
물음에 모두 yes로 답한다
Unpacking...
Checksumming...
Extracting...
UnZipSFX 5.50 of 17 February 2002, by Info-ZIP (
Zip-Bugs@lists.wku.edu).
  inflating: jdk-6u14-linux-i586.rpm
  inflating: sun-javadb-common-10.4.2-1.1.i386.rpm
  inflating: sun-javadb-core-10.4.2-1.1.i386.rpm
  inflating: sun-javadb-client-10.4.2-1.1.i386.rpm
  inflating: sun-javadb-demo-10.4.2-1.1.i386.rpm
  inflating: sun-javadb-docs-10.4.2-1.1.i386.rpm
  inflating: sun-javadb-javadoc-10.4.2-1.1.i386.rpm
준비 중...               ########################################### [100%]
   1:jdk                    ########################################### [100%]
Unpacking JAR files...
        rt.jar...
        jsse.jar...
        charsets.jar...
        tools.jar...
        localedata.jar...
        plugin.jar...
        javaws.jar...
        deploy.jar...
Installing JavaDB
준비 중...               ########################################### [100%]
   1:sun-javadb-common      ########################################### [ 17%]
   2:sun-javadb-core        ########################################### [ 33%]
   3:sun-javadb-client      ########################################### [ 50%]
   4:sun-javadb-demo        ########################################### [ 67%]
   5:sun-javadb-docs        ########################################### [ 83%]
   6:sun-javadb-javadoc     ########################################### [100%]

Java(TM) SE Development Kit 6 successfully installed.

Product Registration is FREE and includes many benefits:
* Notification of new versions, patches, and updates
* Special offers on Sun products, services and training
* Access to early releases and documentation

Product and system data will be collected. If your configuration
supports a browser, the Sun Product Registration form for
the JDK will be presented. If you do not register, none of
this information will be saved. You may also register your
JDK later by opening the register.html file (located in
the JDK installation directory) in a browser.

For more information on what data Registration collects and
how it is managed and used, see:
http://java.sun.com/javase/registration/JDKRegistrationPrivacy.html

Press Enter to continue.....


Done.


이것으로 Java의 설치는 끝이다.
확인을 위해서 아래의 사항을 점검한다.
[root@localhost Desktop]# rpm -qa | grep jdk
java-1.6.0-openjdk-1.6.0.0-0.25.b09.el5
jdk-1.6.0_14-fcs
[root@localhost Desktop]# java
Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)
where options include:
    -d32          use a 32-bit data model if available
    -d64          use a 64-bit data model if available
    -client       to select the "client" VM
    -server       to select the "server" VM
    -hotspot      is a synonym for the "client" VM  [deprecated]
                  The default VM is client.

    -cp <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
                  A : separated list of directories, JAR archives,
                  and ZIP archives to search for class files.
    -D<name>=<value>
                  set a system property
    -verbose[:class|gc|jni]
                  enable verbose output
    -version      print product version and exit
    -version:<value>
                  require the specified version to run
    -showversion  print product version and continue
    -jre-restrict-search | -jre-no-restrict-search
                  include/exclude user private JREs in the version search
    -? -help      print this help message
    -X            print help on non-standard options
    -ea[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions with specified granularity
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions with specified granularity
    -esa | -enablesystemassertions
                  enable system assertions
    -dsa | -disablesystemassertions
                  disable system assertions
    -agentlib:<libname>[=<options>]
                  load native agent library <libname>, e.g. -agentlib:hprof
                  see also, -agentlib:jdwp=help and -agentlib:hprof=help
    -agentpath:<pathname>[=<options>]
                  load native agent library by full pathname
    -javaagent:<jarpath>[=<options>]
                  load Java programming language agent, see java.lang.instrument
    -splash:<imagepath>
                  show splash screen with specified image
See
http://java.sun.com/javase/reference for more details.



jdk의 설치는 무난히 끝났다. 모두 그렇지만 윈도우 프로그램처럼 setup.exe만 실행시킨후 모든게 끝나면 얼마나 좋겠냐만은, 작은 설정이 필요하다.
 [root@localhost Desktop]# ls /usr/java
default  jdk1.6.0_14  latest
[root@localhost Desktop]# ln -s /usr/java/jdk1.6.0_14 /usr/local/jdk
[root@localhost Desktop]# vi /etc/profile
# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

pathmunge () {
        if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
           if [ "$2" = "after" ] ; then
              PATH=$PATH:$1
           else
              PATH=$1:$PATH
           fi
        fi
}

# ksh workaround
if [ -z "$EUID" -a -x /usr/bin/id ]; then
        EUID=`id -u`
        UID=`id -ru`
fi

# Path manipulation
if [ "$EUID" = "0" ]; then
        pathmunge /sbin
        pathmunge /usr/sbin
        pathmunge /usr/local/sbin
fi

# No core files by default
ulimit -S -c 0 > /dev/null 2>&1

if [ -x /usr/bin/id ]; then
        USER="`id -un`"
        LOGNAME=$USER
        MAIL="/var/spool/mail/$USER"
fi

HOSTNAME=`/bin/hostname`
HISTSIZE=1000

if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
    INPUTRC=/etc/inputrc
fi

export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        . $i
    fi
done

unset i
unset pathmunge

export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib/tools.jar:.

[root@localhost Desktop]# ls -la /etc/profile
-rw-r--r-- 1 root root 1049  7월 16 00:07 /etc/profile
[root@localhost Desktop]# chmod 755 /etc/profile(실행권한설정)
[root@localhost Desktop]# /etc/profile (갱신된 profile을 적용) 
[root@localhost Desktop]# javac (설치가 잘되었나 확인)
Usage: javac <options> <source files>
where possible options include:
  -g                         Generate all debugging info
  -g:none                    Generate no debugging info
  -g:{lines,vars,source}     Generate only some debugging info
  -nowarn                    Generate no warnings
  -verbose                   Output messages about what the compiler is doing
  -deprecation               Output source locations where deprecated APIs are used
  -classpath <path>          Specify where to find user class files and annotation processors
  -cp <path>                 Specify where to find user class files and annotation processors
  -sourcepath <path>         Specify where to find input source files
  -bootclasspath <path>      Override location of bootstrap class files
  -extdirs <dirs>            Override location of installed extensions
  -endorseddirs <dirs>       Override location of endorsed standards path
  -proc:{none,only}          Control whether annotation processing and/or compilation is done.
  -processor <class1>[,<class2>,<class3>...]Names of the annotation processors to run; bypasses default discovery process
  -processorpath <path>      Specify where to find annotation processors
  -d <directory>             Specify where to place generated class files
  -s <directory>             Specify where to place generated source files
  -implicit:{none,class}     Specify whether or not to generate class files for implicitly referenced files
  -encoding <encoding>       Specify character encoding used by source files
  -source <release>          Provide source compatibility with specified release
  -target <release>          Generate class files for specific VM version
  -version                   Version information
  -help                      Print a synopsis of standard options
  -Akey[=value]              Options to pass to annotation processors
  -X                         Print a synopsis of nonstandard options
  -J<flag>                   Pass <flag> directly to the runtime system


 

APACHE-TOMCAT
jdk만으로 설정이 끝나느냐? 아니다. jsp를 구현하기 위해서는 apache-tomacat을 설치해 주어야 한다.
다운로드
http://www.snowrice.com/freepds/1108
http://mirror.apache-kr.org/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.tar.gz
 [root@localhost Desktop]# wget http://mirror.apache-kr.org/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.tar.gz
--00:03:52--  http://mirror.apache-kr.org/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.tar.gz
Resolving mirror.apache-kr.org... 211.174.58.187
Connecting to mirror.apache-kr.org|211.174.58.187|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5998298 (5.7M) [application/x-gzip]
Saving to: `apache-tomcat-6.0.20.tar.gz'

100%[=======================================================================================================================================================================>] 5,998,298   1.32M/s   in 4.3s

00:03:57 (1.33 MB/s) - `apache-tomcat-6.0.20.tar.gz' saved [5998298/5998298]

[root@localhost Desktop]#


wget을 통해서 apache-tomacat을 다운받았다.

 [root@localhost Desktop]# tar -xvf apache-tomcat-6.0.20.tar.gz
[root@localhost Desktop]# mv apache-tomcat-6.0.20 /usr/local/tomcat
[root@localhost Desktop]# cd /usr/local
[root@localhost local]# ls
bin  etc  games  httpd  include  jdk  lib  libexec  mysql  pgsql  php  sbin  share  src  tomcat
[root@localhost local]# vi /etc/profile
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin
[root@localhost local]# source /etc/profile
[root@localhost local]# system-config-securitylevel-tui (system-config-firewall-tui)
8080:tcp 8080번 포트를 열어준다.
[root@localhost bin]# /usr/local/tomcat/bin/catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:       /usr/local/jdk



로칼에서 http://ip:8080으로 접속하여 보자


설치는 제대로 잘되었다. 여기서 확실히 개념을 잡아야 할것은..
일반 http://domain으로 접속을 하였을때는 apache의 본래의 기능으로 접속을 하고

http://ip:8080으로 접속을 하면 위의 고양이 나오는 그림과 같이 jsp페이지가 떠야한다는것이다.

여기서 개념을 잡아야 할것이 있다.
일반 html으로 접속한것은 아파치의 본래의 기능으로 접속하고 jsp로 접속한것은 tomcat을 이용하여 8080번으로 접속을 한다는 이야기다.

톰캣과 아파치를 연동하면 http://domain을 연결하면 /usr/local/tomcat/webapps의 index.jsp나 index.html을 찾는다. 그러나 이렇게 하면 아파치의 고유기능인 virtual hosting과 어떻게 적절히 움직일수 있느냐 하는 의문점이 남는다.

자 그럼, 우선 계정 사용자를 염두해두지 않고, http://ip식으로 접속하면 루트 사용자만을 위한 /usr/local/httpd/htdocs가 아닌 /usr/local/tomcat/webapps에 접속하는 아파치-톰캣 연동을 하자.

APACHE-TOMCAT CONNECTOR
다운로드
http://www.apache.org/dist/tomcat/tomcat-connectors/jk/source/jk-1.2.28/tomcat-connectors-1.2.28-src.tar.gz
 [root@localhost Desktop]# wget http://www.apache.org/dist/tomcat/tomcat-connectors/jk/source/jk-1.2.28/tomcat-connectors-1.2.28-src.tar.gz
--01:26:20--  http://www.apache.org/dist/tomcat/tomcat-connectors/jk/source/jk-1.2.28/tomcat-connectors-1.2.28-src.tar.gz
Resolving www.apache.org... 140.211.11.130
Connecting to
www.apache.org|140.211.11.130|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1541956 (1.5M) [application/x-gzip]
Saving to: `tomcat-connectors-1.2.28-src.tar.gz'

100%[=============================================================>] 1,541,956    588K/s   in 2.6s

01:26:23 (588 KB/s) - `tomcat-connectors-1.2.28-src.tar.gz' saved [1541956/1541956]

[root@localhost Desktop]# tar -xvf tomcat-connectors-1.2.28-src.tar.gz
[root@localhost Desktop]#cd tomcat-connectors-1.2.28-src
[root@localhost tomcat-connectors-1.2.28-src]# cd native
[root@localhost native]# ls
BUILDING.txt  Makefile.in  STATUS.txt  apache-1.3    common        docs  netscape
CHANGES       NEWS         TODO.txt    apache-2.0    configure     iis   nt_service
Makefile.am   README.txt   aclocal.m4  buildconf.sh  configure.in  jni   scripts
[root@localhost native]# ./configure --with-apxs=/usr/local/httpd/bin/apxs
[root@localhost native]# make && make install
make[2]: `install-exec-am'를 위해 할 일이 없습니다
make[2]: `install-data-am'를 위해 할 일이 없습니다
make[2]: Leaving directory `/root/Desktop/tomcat-connectors-1.2.28-src/native'
make[1]: Leaving directory `/root/Desktop/tomcat-connectors-1.2.28-src/native'
[root@localhost native]# ls /usr/local/httpd/modules/mod_jk.so
/usr/local/httpd/modules/mod_jk.so


연동 설정을 위하여 httpd.conf와 workers.properties파일을 수정 생성하자.
 [root@localhost native]# vi /usr/local/httpd/conf/httpd.conf
LoadModule jk_module          modules/mod_jk.so
#Tomcat-connector
JkWorkersFile conf/workers.properties
JkLogFile logs/jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %y]"
JkMount /*.jsp loadbalancer
JkMount /*.do loadbalancer
JkMount /*.html loadbalancer
JkMount /servlet/* loadbalancer
JkMount /* loadbalancer
JkMount /*.gif loadbalancer


#Load Module 맨뒤에 위와같이 추가한다.
ServerName 192.168.123.132

#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/usr/local/httpd/htdocs"

#
# Each directory to which Apache has access can be configured with respect
# to which services and features are allowed and/or disabled in that
# directory (and its subdirectories).
#
# First, we configure the "default" to be a very restrictive set of
# features.
#


#서버네임에 자신의 도메인이나, IP를 입력하고 위와같이 삽입한다.


workers.properties파일을 새로 생성하고 위와 같이 삽입한다.
[root@localhost conf]# vi /usr/local/httpd/conf/workers.properties
worker.list=loadbalancer
worker.tomcat1.type=ajp13
worker.tomcat1.host=127.0.0.1
worker.tomcat1.port=8008
worker.tomcat1.lbfactor=1
worker.tomcat2.type=ajp13
worker.tomcat2.host=127.0.0.1
worker.tomcat2.port=8009
worker.tomcat2.lbfactor=1
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1,tomcat2

[root@localhost conf]# /usr/local/httpd/bin/httpd -k restart
[root@localhost conf]# /usr/local/tomcat/bin/catalina.sh stop
[root@localhost conf]# /usr/local/tomcat/bin/catalina.sh start

아파치와 톰캣을 재시동한다.
http://ip로 접속

아파치와 톰캣의 연동이 성공적으로 끝났다.
하지만.. 앞서 설치한 PHP는 이제부터 쓸수없게 된다!
예로 <?php phpinfo(); ?> php태그를 이용하여 test.php를 작성하여 읽어보자..
웹서버는 test.php를 출력하지 않고 브라우져는 해당파일을 웹페이지로 인식못하고 다운로드 받게 된다.
그러므로 jsp이외의 php파일은 정상적으로 tomcat의 영향을 받지 않고 출력해줘야 한다.

httpd.conf에서
JkMount /* loadbalancer
이부분을 지우고 웹서버를 재가동하면 JkMount부분에서 지정하지 않은 확장자는 모두 본래의 아파치디렉토리에서 정상적으로 읽게된다.

웹호스팅을 기획하지 않고 단일 웹서버로 쓰이는 머신은 여기까지 세팅하면 된다.
작은 사이트의 경우, 거의 모든 플랫폼이 APM에 맞춰있기 때문에 jsp까지 세팅하지 않고 APM+Oracle서버로도 매우 훌륭하다. 

하지만 기필코 jsp와 php 모두 웹호스팅에 적용하고 싶으면 다음 포스팅 +3에서 이어진다.