본문 바로가기

Network ♡/LINUX ¿

[수업] 아파치 서버 설치

1 장.  설치하기 전 준비 및 기본 절차

1.1  설치하기 전에 필요한 것들

    jdk117_v3

    jsdk2.0

    apache_1.3.9

    ApacheJServ-1.0

 위의 것들을 다운받아 적당한 위치에 풀어 놓는다.


 jdk    는 /usr/local/jdk117 디렉토리에

 jsdk   는 /usr/local/jsdk20 디렉토리에

 apache 는 /tmp/apache_1.3.9 디렉토리에

 ApacheJServ 는 /tmp/ApacheJServ-1.0 디렉토리에 있는 것으로 간주하고 아래를 설명.


1.2  리눅스에서 컴파일하여 설치하기

리눅스에서 컴파일해서 설치하는 대부분의 패키지는 보통 다음 세 가지 명령을

순서대로 하면 된다.

    # ./configure  .....필요한 옵션들.......

    # make

    # make install


./configure 는 환경에 맞게 여러가지 설정을 잡아 주는 것이고,

make 는 컴파일하는 과정이고, make install 은 설치 과정이다.


제 2 장.  아파치 웹서버의 설치

2.1  아파치에 필요한 jserv모듈의 복사

우선 apache_1.3.9 을 풀어놓은 디렉토리 /tmp/apache_1.3.9으로 이동한다.


    # cd /tmp/apache_1.3.9


디렉토리 src/modules/ 밑에 디렉토리 jserv 를 만들고, 이 디렉토리로 이동한다.


    # cd src/modules

    # mkdir jserv

    # cd jserv


/tmp/ApacheJServ-1.0/src/c/ 밑의 모든 파일을

현재 디렉토리(/tmp/apache_1.3.9/src/modules/jserv)에 복사한다.


    # cp /tmp/ApacheJServ-1.0/src/c/* .



다시 apache_1.3.9 의 기본 디렉토리로 이동한다.


    # cd ../../..


2.2  컴파일하기 전 환경 잡기

    # ./configure --enable-rule=SHARED_CORE \

                  --enable-module=so \

                  --prefix=/usr/local/apache \

                  --activate-module=src/modules/jserv/mod_jserv.c


위의 명령을 내릴 때는 한 줄씩 입력하고 각 줄의 끝에서 엔터 키를 누른다.


[참고]

아파치 웹서버를 디렉토리에 /usr/local/apache에 설치하기 위해

옵션 --prefix=/usr/local/apache를 주었는데 다른 곳에 설치하려면 이 옵션을 다르게 준다.

옵션 --prefix 의 사용법은 --prefix=...... 이고, ...... 부분에 실제 설치될 디렉토리를 적어 준다.

예를 들어, --prefix=/etc/apache 라고 적어 주면 아파치 웹서버가 /etc/apache 디렉토리에 설치된다.

실제 설치는 다음의 설치 순서 중 마지막 부분인 make install 을 실행한 후에야 이루어진다.


2.3  컴파일하기


    # make


2.4  설치하기


    # make install


제 3 장. ApacheJServ 의 설치

3.1  셸 환경변수 JAVA_HOME

필요하면 다음 명령을 미리 실행하여 환경변수 JAVA_HOME 의 값을 정해 둔다.

echo $JAVA_HOME 하여 이 환경변수의 값을 볼 수 있다.


  # JAVA_HOME="/usr/local/jdk117/"; export JAVA_HOME


환경변수 확인:

     # echo $JAVA_HOME


3.2  디렉토리 이동

이제 ApacheJServ 1.0 을 설치하기 위해 이를 풀어놓은 디렉토리

 /tmp/ApacheJServ-1.0로 이동한다.


    # cd /tmp/ApacheJServ-1.0


3.3  컴파일 하기 전 환경 잡기


    # ./configure --with-apache-install=/usr/local/apache \

                  --prefix=/usr/local/jserv --enable-apache-conf \

                  --with-jsdk=/usr/local/jsdk20/lib/jsdk.jar


[참고 1]

옵션 중에 --prefix=...... 부분에는 jserv 모듈이 설치될 디렉토리를 적어 준다.

[참고 2]

--with-apache-install=...... 부분에는 앞의 절차에 따라 아파치 웹서버가 설치된

디렉토리를 적어준다.

이 예에서는 /usr/local/apache 라고 하였다.

[참고 3]

--with-jsdk=...... 부분에는 이미 설치되어 있는

JSDK 2.0 의 jsdk.jar 의 (파일명을 포함한) 전체 경로를 적어 준다.

이 예에서는 /usr/local/jsdk20/jsdk.jar 라고 하였다.


3.4  컴파일하기


    # make


3.5  설치하기


    # make install


제 4 장. 아파치 웹서버의 동작 확인

4.1  기존의 웹 서비스의 중지

만일 80 포트를 사용하는 웹서버가 이미 떠 있다면 이를

중지시켜야 한다.  이를 위해 다음 명령 중하나를 실행한다.


    # kill

    # /etc/rc.d/init/httpd stop

    # /etc/httpd stop

    # /usr/local/apache/bin/apachectl stop


[참고]

리눅스를 설치하면서 자동으로 함께 설치된 아파치 웹서버의

PID 파일은 디렉토리 /var/run 에 있다.

이 파일의 존재 유무로 기존의 웹서버가 동작하는지 앞으로 새로 설치된

웹서버가 동작하는지 확인할 수 있다.

리눅스가 재부팅되면 새로 설치된 웹서버가 아니라 기존의 웹서버가 동작할 경우가 있기     때문이다.


4.2  새 아파치 웹서버의 서비스 시작

 이제 새로 설치된 아파치 웹서버를 가동시킨다.


   # /usr/local/apache/bin/apachectl start


4.3  웹 브라우저로 확인

  웹 브라우저로 다음을 방문하여 아파치웹서버가 작동하는지 확인한다,


  URL 주소:   http://localhost/   또는  http://호스트주소/


4.4  새 아파치웹서버의 PID 확인

 아파치웹서버가 설치된 디랙토리 /usr/local/apache 로 이동한다.


    # cd /usr/local/apache


아파치웹서버가 작동되면 ./logs/ 디렉토리에  PID 파일 httpd.pid 이

생성된다. ls 명령과 more 명령으로 이를 확인한다.


    # ls ./logs

    # more ./logs/httpd.pid


4.5  아파치 웹서버의 중지

 이제 아파치 웹서버를 중지시켜 본다.


    # ./bin/apachectl stop


  PID 파일 httpd.pid 이 없어졌는지 확인한다.

  아파치웹서버를 중지시켰으면 이 PID 파일이 없는 것이 정상이다.


    # ls ./logs




제 5 장. 서블릿 동작시키기

5.1 디렉토리 이동

다시 아파치웹서버가 설치된 디렉토리로 이동한다.

현재 디렉토리가 /usr/local/apache 이면 이 과정은 필요 없다.


    # cd /usr/local/apache


이제 conf 파일과 peroperties 파일을 카피하고 몇 군데 고쳐 주어야 한다.

./conf 디렉토리로 이동한다.


    # cd conf


5.2  http.conf 의 수정

ApacheJServ 1.0 를 풀어놓고 컴파일 하던 그 디렉토리 밑에 conf 디렉토리 밑에 있는 httpd.conf 파일을 현재 디렉토리 밑에 jserv.conf 라는 새 이름으로 카피한다.

왜냐하면 현재 디렉토리에 httpd.conf 라는 파일이 이미 존재하기 때문이다.

또 /tmp/ApacheJServ-1.0/conf 디렉토리 밑에 있는 파일 jserv.properties 와 zone.peoperties 를 현재 디렉토리로 카피한다.


    # cp /tmp/ApacheJServ-1.0/conf/httpd.conf jserv.conf

    # cp /tmp/ApacheJServ-1.0/conf/jserv.* .

    # cp /tmp/ApacheJServ-1.0/conf/zone.* .


httpd.conf 와 jserv.conf 의 내용을 합친 것이  httpd.conf 가

되도록 한다.  이를 위해 편집기를 써도 되고 셸에서 다음 명령을

실행해도 된다.


    # cat jserv.conf >> httpd.conf


[참고]

여기서 출력 리디렉션을 반드시 >> 로 해야만 jserv.conf 의 내용이 httpd.conf 의 됫 부분에 추가된다.

이제 httpd.conf 파일을 읽어서 몇 가지를 확인하고 수정한다.

편집기에서 mod_jerv 라는 글자를 찾으면 수정할 곳으로 빨리

찾아갈 수 있다.

우선

   ApJServMount /servlets /root 라고 된 곳을 찾아

  #ApJServMount /servlets /root

   ApJServMount /servlets /example로 고친다.


   

[참고]

이는 나중에 Hello.class 라는 서블릿 클래스를 웹 상에서 방문할 때 URL 주소를

http://호스트주소/servlets/Hello로 적기 위함이다.

오른 쪽에 적어준 /example 이라는 것은 ApacheJServ 1.0 beta 이후 새로 도입된 zone     이라는 것으로서 zone 의 이름이 example 임을 의미한다.

zone 이란 서블릿 들의 묶음이라고 보면 된다.

나중에 파일 jserv.properties 를 고칠 때 example 이라는 이름의 zone 에 대해

설정해야 한다.

만일 이곳을 ApJServMount /example /example이라고 적어 주면 웹 상에서

방문하는 URL은 http://호스트주소/example/Hello이다.

또 이곳을 ApJServMount /hong/myServlet /example이라고 할 경우에는

방문할 URL이 http://호스트주소/hong/myServlet/Hello이다.


5.3  파일 jserv.properties 의 수정

ApacheJServ 는 아파치웹서버의 설치 디렉토리를 기준으로 파일 ./conf/jserv.properties 를 가장 먼저 읽고, 이 파일에서 설정해 준 것을 기준으로 동작한다.

zone 에 관한 것도 이 파일을 읽음으로써 인식한다,

그 이유는 파일 ./conf/mod_hserv.conf 에서 ApJServProperties 디렉티브가

다음처럼 되어 있기 때문이다.


 ApJServProperties ./conf/jserv.properties


다음에는 example 이라는 이름의 zone 을 만들고, 이 zone의 서블릿 클래스 파일들이 있는 곳(디렉토리)를 지정하고, 이 zone 에 대한 프로퍼티 파일이 어느 것인지 설정한다.

현재 디렉토리가 /usr/local/apache/conf 인지 확인하고, 파일 jserv.properties를

편집기로 열어서 다음처럼 몇 군데를 수정한다.


우선 example 이라는 이름의 zone 을 만들기 위해  zones=root로 된 곳을 찾아


    #zones=root

    zones=example


로 고친다. 또 example 이라는 이름의 zone 의 프로퍼티 파일을 알려 주기 위해


    #root.properties=/tmp/ApacheJServ-1.0/conf/zone.properties


로 된 곳을 찾아 아래와 같이 고친다.


    #root.properties=/tmp/ApacheJServ-1.0/conf/zone.properties

    example.properties=/tmp/ApacheJServ-1.0/example/example.properties


[참고]

 /tmp/ApacheJServ-1.0/example/example.properties 라는 파일에는

 repositories=/tmp/ApacheJServ-1.0/example

라고 된 곳이 있는데 이곳에는 서블릿 클래스를 실제로

갖다 둘 디렉토리를 적어 준다.

적는 규칙은 다음과 같다.

 

    repositories=[repository],[repository]...

여기서 지정한 디렉토리는 ApacheJServ 가 서블릿을 로딩할 때 기본 디렉토리로 인식하는 것이다. 즉, CLASSPATH 와 비슷한 기능을 한다고 보면 된다.


5.4  파일 example.properties 에 대한 이해


파일 /tmp/ApacheJServ-1.0/example/example.properties 에는

repositories=.... 외에도 다음 것들이 정해져 있는데 이는

프로퍼티 파일을 만들 때 자주 참조되는 내용이다.


       autoreload.file=true

       init.timeout=10000

       destroy.timeout=10000

       session.timeout=1800000

       session.checkFrequency=30000

       singleThreadModelServlet.initialCapacity=5

       singleThreadModelServlet.incrementCapacity=5

       singleThreadModelServlet.maximumCapacity=10


       ###################

       # 자동으로 시작하는 서블릿 설정.

       # Syntax: servlets.startup=[classname or alias],[classname or alias],...

       # Default: NONE

       ###################

       # servlets.startup=hello,snoop,org.fool.Dummy


       ##################

       # 서블릿에 별명(alaias) 정하기.

       # Syntax: servlet.[alias].code=[classname] (String)

       # Default: NONE

       ##################

       # servlet.snoop.code=SnoopServlet

       # servlet.hello.code=org.fool.Dummy

       ######################

       # 모든 서블릿에 전달될 전역 초기값 설정하기.

       # Syntax: servlets.default.initArgs=[name]=[value],[name]=[value],...

       # Default: NONE

       ######################

       # servlets.default.initArgs=common.to.everybody=Hi everybody!


       ######################

       # Syntax: servlet.[classname].initArgs=[name]=[value],[name]=[value],...

       # Default: NONE

       ######################

       # servlet.org.fool.Dummy.initArgs=message=I'm a dummy servlet


       ######################

       # 별명(alias)을 갖는 서블릿의 초기값 설정하기.

       # Syntax: servlet.[alias].initArgs=[name]=[value],[name]=[value],...

       ######################

       # servlet.snoop.initArgs=message=I'm a snoop servlet

       # servlet.hello.initArgs=message=I say hello world to everyone


제 6 장.  설치한 후 에러 해결


에러 1.  jserv.logs 파일을 생성하지 못하는 에러


브라우저로 http://localhost/servlets/Hello를 방문하니 에러가 나고,

에러 로그 파일 logs/error_log 에 다음 에러 메세지가 여러 개 있다.


    java.io.IOException: Directory not writable: /usr/local/apache/logs

            at org.apache.java.io.LogWriter.(LogWriter.java:286)

            at org.apache.java.io.LogWriter.(LogWriter.java:202)

            at org.apache.jserv.JServLog.(JServLog.java:76)

            at org.apache.jserv.JServ.start(JServ.java:218)

            at org.apache.jserv.JServ.main(JServ.java:153)

    ApacheJServ/1.0: Error opening log file: java.io.IOException: Directory

    not writable: /usr/local/apache/logs


[해결하기]

이는 아파치웹서버의 디폴트 접속 사용자(nobody)의 권한으로

로그파일 ./logs/jserv.log 파일을 생성시키지 못해서 생기는 에러이다.

이를 해결할려면 ./logs 디렉토리에서 jserv.log 파일을 하나 만든다.

그 다음 파일의 소유자를 변경한다.

          # chown nobody jserv.log

          # chown .nobody jserv.log


확인 :  ls -al 하여 jserv.log 의 소유자 및 그룹이 nobody로 되어 있는지 확인한다.


에러 2.  example.properties 를 찾지 못하는 에러

브라우저로 http://localhost/servlets/Hello를 방문하니 에러가 나고,

에러 로그 파일 logs/error_log 에 다음 에러 메세지가 있다.


      ApacheJServ/1.0: No configuration file named

      "example.properties" for servlet zone example


[해결하기]

 파일 ./conf/jserv.properties 에서 zone 의 설정 부분을 확인한다.


 확인 내용:

             zones=example

             example.properties=/tmp/ApacheJServ-1.0/example/example.properties


에러 3.  localhost 가 인식되지 못해 일어나는 에러

이 에러는 보통은 발생하지 않으므로 별로 상관이 없으나

필자의 경우에는 리눅스 시스템이 localhost 를 인식하지 못하는

관계로 Apache & ApacheJServ 를 여러 달 동안 설치 못하다가

겨우 그 원인과 해결책을 찾아내어 성공적으로 설치하였다.

localhost 가 인식되지 못하는 시스템에서는 일반적인 html 파일을 읽을 때는 잘 되는데

서블릿을 방문하면 에러가 발생한다.

이는 아파치와 jserv가 내부적으로 apjv11 이라는 프로토콜로 통신할 때

로컬 IP 주소 127.0.0.1을 사용하기 때문이다.

 이 경우에는 http://localhost/servlets/Hello 를 방문할 때

error_log 파일에 다음 메세지가 기록된다.


        ApacheJServ/1.0: Exception creating the server socket:

        java.net.BindException: Address already in use


더구나 아파치의 stop, start, restart 가 제대로 동작하지 않는다.


 [에러 해결]

 localhost 확인하기:


            # /bin/ping localhost

            (또는 # /sbin/route -n)

 /sbin/route -n 으로 확인할 때 다음이 나오지 않으면 localhost가 잡혀 있지 않다.       

localhost 에러를 해결하려면 리눅스의 넷트웍이 localhost를 인식하도록 해 주어야 한다.  우선 파일 /etc/hosts 에 다음 줄이 잘 있는지 확인한다. 

없으면 편집기로 그 파일을 열어 써 주어야 한다.


            127.0.0.1    localhost     localhost.localdomain


localhost 는 loopback 디바이스 lo 를 사용한다.

먼저 ifconfig 명령으로 디바이스 lo 의 인터페이스를 설정하고,

그 다음 route 명령으로 그 IP 에 연결할 길을 알려 준다.


            # /sbin/ifconfig lo 127.0.0.1

            # /sbin/route add 127.0.0.1


          [주] 필자가 이 문제를 해결하는데 하이텔의 linux 동호회에

             김도한(하이텔 ID: elemia)님이 남겨 놓았던 글이

             도움이 되었다.


제 7 장.  설치와 동작의 마지막 확인

 이제 많은 산을 넘어 왔으니 브라우저로


      http://localhost/servlets/Hello


를 방문해 본다.


              Example Apache JServ Servlet


      Congratulations, Apache JServ is working!


라는 문구가 나오면 성공이다.

http://soback.kornet.net/~dure707/pub/apache/installjserv.html

'Network ♡ > LINUX ¿' 카테고리의 다른 글

Beep음 끄기 (linux)  (0) 2008.06.13
BIND  (0) 2008.06.13
[참고] httpd.conf  (0) 2008.06.13
[수업] 웹서버 설정  (0) 2008.06.13
[수업] 네임서버 설정  (0) 2008.06.13