flowerspring

아파치 웹서버는 기본적으로 80포트를 사용한다.

하지만 1024 이하의 포트를 사용하는 프로그램은 RFC 규약에 의하여 root가 아닌 일반 계정으로 실행을 할 수가 없다.

해당 프로그램의 사용 포트를 1024이상의 포트를 사용하던지 그렇지 않을 경우 다음 방법으로 계정으로 일반 계정으로 실행한다.


순서는 디렉터리의 소유권을 바꾸고, root로 실행해야 하는 파일을 실행권한 및 소유권을 바꿔서 실행하는 순서이다.


먼저 다음과 같은 환경이라고 과정하고 설명한다.


환경 : Centos 7.3 

설치 디렉터리 : /app/web/apache24

실행계정 : webadmin01

실행그룹 : webadmingroup


cd /app/web/

chown -R webadmin01:webadmingroup apache24

cd apache24/bin

chown root:webadmingroup httpd

chmod +s httpd






 


 

Comment +0

1. 데몬(daemon) 이란?
 주기적인 서비스 요청을 처리하기 위해서 커널상에 백그라운드 모드로 실행되는 프로세스로, 메모리 관리 방법에 따라 단독 데몬과 xinetd로 분리된다.

단독데몬
 항상 백그라운드 모드로 실행되고 메모리를 상대적으로 많이 소비한다. 그러나 서비스(응답속도)가 빠르다. httpd와 같은 웹서비스 데몬이 대표적.
xinetd(슈퍼데몬)
 요청이 있을때마다 xinetd가 서비스를 싱행시켜주므로 메모리 소비가 적다. 그러나 단독데몬에 비해 상대적으로 서비스 속도가 느리다.


 2. 간단한 자바 데몬 만들기
 nohup을 이용해서 java를 실행시킨다.

 터미널이 종료될 때(쉘이 종료될 때) 프로세스가 죽는 이유는 해당 프로세스가 쉘의 자식 프로세스 이기 때문이다. 따라서, 부모 프로세스가 죽을대 던지는 SIGHUP을 자식 프로세스가 받게 된다.

 nohup은 부모 프로세스가 죽을때 자식 프로세스에게 SIGHUP을 던지지 않는 프로세스를 말한다.
$ nohup java 클래스명 &

  
 사용하기 편한 장점은 있으나, 문제는 중지를 시킬수 없다. 즉, 해당 프로세스 ID를 찾아내 kill하는 수 밖에 없다. 물론 파일 체크 기법, 소켓을 이용한 제어 방법등을 사용할 수 있지만 스스로 구현해야 하는 번거로움이 있다.


 3. apache commons daemon 이용하기
 Java는 UNIX의 시그널 처리를 할수 없기때문에, 중지 신호(TERM signal)를 처리하기 위해서는 따로 구현을 해야한다. 이런 번거로움을 해결하기 위해 자카르타의 하위 프로젝트중의 commons daemon을 이용한다. commons daemon은 중지 신호를 받으면 미리 지정된 메소드를 실행한다.

 ** 다운로드: http://commons.apache.org/daemon/

 UNIX용 Jsvc와 윈도우용 Procrun 있다.
 여기서는 Jsvc를 이용해보도록 하겠다.

 

 commons daemon을 다운로드해 압축을 해제하면 위 그림과 같다.
 commons-daemon.jar 파일은 Java프로젝트 lib폴더에 복사해둔다.

 


 bin폴더의 압축파일을 해제하면 jsvc-src라는 폴더가 나온다.
 폴더의 내용은 위와 같다.
 commons daemon을 사용하기 위해서는 바로 여기서 jsvc를 빌드해줘야 한다.
 빌드환경은 다음과 같다.(리눅스에서 빌드해야한다.)

GNU AutoConf(at least 2.53)
ANSI-C compliant compiler(GCC is good)
GNU Make
A Java Platform 2 compliant SDK

 여기서부터는 ubuntu 8.10 환경에서 진행하도록 한다.

 먼저 JDK가 설치되어 있지 않다면 JDK를 설치한다.
 $ sudo apt-get install sun-java6-jdk


 JDK가 설치되는 경로는 /usr/lib/jvm/java-6-sun 이다.

 gcc 및 make 가 설치되있지 않다면 아래 명령를 이용해 한방에 설치한다.
 $ sudo apt-get install build-essential


 AutoConf가 설치되있지 않다면 AutoConf를 설치한다.
 $ sudo apt-get install autoconf


 Jsvc를 빌드하는 방법은 다음과 같다.

support/buildconf.sh
./configure --with-java=/usr/lib/jvm/java-6-sun
make


참고 방법

mkdir /root/commons-daemon

cd /root/commons-daemon

wget http://www.apache.org/dist/commons/daemon/binaries/1.0.5/commons-daemon-1.0.5.jar
wget http://mirror.apache-kr.org//commons/daemon/source/commons-daemon-1.0.5-src.tar.gz
tar zxvf commons-daemon-1.0.5-src.tar.gz
cd commons-daemon-1.0.5-src/src/native/unix/
support/buildconf.sh
./configure --with-java=/opt/jdk1.6.0_24/
make
mv jsvc /root/commons-daemon

 

 빌드가 성공적으로 이루어졌다면 위 그림과 같이 jsvc가 만들어진것을 확인할 수 있다. 이후 이 파일을 가지고 Java 데몬을 실행한다.

 Java 데몬을 만들려면 org.apache.commons.daemon.Daemon 인터페이스의 init, start, stop, destory 메소드를 구현해야 한다.


샘플

package com.bagesoft.test.daemon;
 
import org.apache.commons.daemon.Daemon;
import org.apache.commons.daemon.DaemonContext;
import org.apache.commons.daemon.DaemonInitException;
 
public class TestDaemon implements Daemon, Runnable {
    private String status = "";
    private int no = 0;
    private Thread thread = null;
 
    @Override
    public void init(DaemonContext context) throws DaemonInitException,
            Exception {
        System.out.println("init...");
        String[] args = context.getArguments();
        if (args != null) {
            for (String arg : args) {
                System.out.println(arg);
            }
        }
        status = "INITED";
        this.thread = new Thread(this);
        System.out.println("init OK.");
        System.out.println();
    }
 
    @Override
    public void start() {
        System.out.println("status: " + status);
        System.out.println("start...");
        status = "STARTED";
        this.thread.start();
        System.out.println("start OK.");
        System.out.println();
    }
 
    @Override
    public void stop() throws Exception {
        System.out.println("status: " + status);
        System.out.println("stop...");
        status = "STOPED";
        this.thread.join(10);
        System.out.println("stop OK.");
        System.out.println();
    }
 
    @Override
    public void destroy() {
        System.out.println("status: " + status);
        System.out.println("destroy...");
        status = "DESTROIED";
        System.out.println("destroy OK.");
        System.out.println();
    }
 
    @Override
    public void run() {
        while (true) {
            System.out.println(no);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (no > 1000) {
                break;
            }
            no++;
        }
    }
}


init에서 초기화, start에서 처리할 작업을 별도의 쓰레드로 생성해서 실행한다. start 메소드 호출후 반드시 return 되어야 데몬이 시그널 처리를 제대로 할 수 있다.
 stop, destroy 는 중지 신호가 오면 차례되로 호출된다.


 이제 실행/중지 스크립트를 작성한다.
 Jsvc를 싱행하는데 필요한것은 실행하는 계정(user), JAVA_HOME(-home), 프로세스ID 파일(-pidfile), 출력지정(-outfile, -errfile), 클래스파일(-cp) 등이 있다.


JAVA_HOME=/opt/jdk1.6.0_24
JSVC=/root/commons-daemon/jsvc
USER=root
 
DAEMON_HOME=/root/commons-daemon
PID_FILE=$DAEMON_HOME/daemon.pid
OUT_FILE=$DAEMON_HOME/daemon.out
#ERR_FILE=$DAEMON_HOME/daemon.err
 
CLASSPATH=\
$DAEMON_HOME/commons-daemon-1.0.5.jar:\
$DAEMON_HOME/BageSoft.jar
 
MAIN_CLASS=com.bagesoft.test.daemon.TestDaemon
case "$1" in
  start)
    #
    # Start Daemon
    #
    rm -f $OUT_FILE
    $JSVC \
    -user $USER \
    -java-home $JAVA_HOME \
    -pidfile $PID_FILE \
    -outfile $OUT_FILE \
    -errfile $OUT_FILE \
    -cp $CLASSPATH \
    $MAIN_CLASS
    #
    # To get a verbose JVM
    #-verbose \
    # To get a debug of jsvc.
    #-debug \
    exit $?
    ;;
 
  stop)
    #
    # Stop Daemon
    #
    $JSVC \
    -stop \
    -nodetach \
    -java-home $JAVA_HOME \
    -pidfile $PID_FILE \
    -outfile $OUT_FILE \
    -errfile $OUT_FILE \
    -cp $CLASSPATH \
    $MAIN_CLASS
    exit $?
    ;;
 
  *)
    echo "[Usage] TestDaemon.sh start | stop"
    exit 1;;

esac 

 

이제 Java 데몬을 실행하기 위한 모든 준비를 마쳤다.

위에서 작성한 스크립트 파일을 이용해 Java 데몬을 실핸한다.
 정상적으로 데몬이 시작된다면 PID_FILE에 지정한 파일이 생성된것을 확인할 수 있다.

 

 

데몬을 중지하려면 start 대신 stop을 입력으로 스크립트를 실행하면 된다.


[출처] http://ultteky.egloos.com/10877963

'DEVELOPMENT > Java' 카테고리의 다른 글

자바 정규표현식  (0) 2012.05.17
대용량 데이터 처리를 위한 JAVA Tunning(튜닝)  (0) 2012.05.17
Apache Daemon 사용하기  (0) 2012.05.17
Quartz 문서  (0) 2011.07.13
[JAVA] 동적 캐스팅  (0) 2011.06.10
log4jdbc를 활용하여 쿼리 로그 남기기  (0) 2011.06.01

Comment +0

package client;

import java.io.File;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

public class CommonClient
{
public static void main(String[] args)
{
String dir = "D:\\temp";
File dirFile = new File(dir);
String[] extensions = {"txt", "html"};

try {
// StringUtils
System.out.println("StringUtils.isEmpty : " +
(StringUtils.isEmpty(null) && StringUtils.isEmpty("")));
System.out.println("StringUtils.isBlank : " +
StringUtils.isBlank(" \n\t"));
System.out.println("StringUtils.substringAfterLast : " +
StringUtils.substringAfterLast("일.이.삼.사", "."));
System.out.println("StringUtils.substringBeforeLast : " +
StringUtils.substringBeforeLast("일.이.삼.사", "."));
String[] splitArr = StringUtils.split("일.이.삼.사", '.');
for (int i = 0, n = splitArr.length; i < n; i++ ) {
System.out.println("split : " + splitArr[i]);
}
System.out.println("StringUtils.leftPad : " +
StringUtils.leftPad("1", 5, '0'));
// FileUtils
// 문자열을 해당 파일에 카피
File file1 = new File(dir, "file1.txt");
String filename = file1.getAbsolutePath();
FileUtils.writeStringToFile(file1,
filename, "UTF-8");

// 파일을 읽어 문자열로 출력
String file1contents = FileUtils.readFileToString(file1, "UTF-8");
System.out.println("file1contents : " + file1contents);
System.out.println("list dir : " +
FileUtils.listFiles(dirFile, extensions, false));

// 해당 문자열을 파일에 저장
File file2 = new File(dir, "file2.txt");
String filename2 = file2.getAbsolutePath();
FileUtils.writeStringToFile(file2, filename2,
"UTF-8");
String file2contents =
FileUtils.readFileToString(file2, "UTF-8");
System.out.println("file2contents : " + file2contents);

// 디렉토리 강제 할당
File testFile = new File(dir, "subdir");
FileUtils.forceMkdir(testFile);
System.out.println("list dir : " +
FileUtils.listFiles(testFile,
extensions, false));

// 파일 카피
File testFile2 = new File(dir, "testFile1Copy.txt");
File testFile1 = new File(dir, "testFile1.txt");
FileUtils.copyFile(testFile1, testFile2);
//IOUtils.copy(inputStream, outputStream); 와 같음
FileUtils.forceDelete(testFile2);
System.out.println("list dir : " +
FileUtils.listFiles(dirFile, extensions, false));

File directory = new File(dir, "subdir");
FileUtils.copyFileToDirectory(testFile1, directory);

// 파일 읽어서 문자열로 리턴
String readFile = FileUtils.readFileToString(file1, "UTF-8");
//String readFile = IOUtils.toString(inputStream);
System.out.println("readFile : " + readFile);

// 라인 별로 파일 내용 읽기
List<String> readList = FileUtils.readLines(file1, "UTF-8");
//List<String> readList = IOUtils.readLines(inputStream);
for (int j = 0, sl = readList.size(); j < sl ; j++) {
System.out.println("readList : " + readList.get(j));
}

long size = FileUtils.sizeOfDirectory(dirFile);
System.out.println(size + " bytes");
System.out.println(FileUtils.byteCountToDisplaySize(size));

} catch (Throwable e) {
e.printStackTrace();
}
}
}


출처 : http://mimul.com/pebble/default/2008/10.html

'DEVELOPMENT > Java' 카테고리의 다른 글

[JAVA] 동적 캐스팅  (0) 2011.06.10
log4jdbc를 활용하여 쿼리 로그 남기기  (0) 2011.06.01
Commons-lang, Commons-io 사용 샘플  (0) 2011.06.01
JAVA Tip  (0) 2011.04.13
JNI 라이브러리 파일의 경로 동적 설정  (0) 2011.02.25
Velocity의 기본 문법  (0) 2011.02.11

Comment +0


다수의 도메인 연결 방법

이전에 글인 경우는 하나의 도메인과 하나의 톰캣과의 연동법을 설명한 것이다. 하지만 위와 같은 경우가 아닌 하나의 아파치에 여러대의 tomcat을 사용하는 경우가 있을것이고 여러개의 도메인을 연결해서 사용해야 하는 경우도 있다. 아래 부분은 그 부분에 대해서 설명을 한다.
위에 내용과 연결되지 않으니 아파치 톰캣이 설치 되어 있다면 위에 부분은 건너 뛰고 아래 부분 부터 적응을 하면 된다.

일단 설치가 되지 않았다면 해당 URL에서 다운을 받으면 된다.

apahce 2.2 : http://httpd.apache.org/download.cgi
tomcat 6.x : http://tomcat.apache.org/download-60.cgi
mod_jk 1.2.28 : http://tomcat.apache.org/download-connectors.cgi

mod_jk-1.2.28-httpd-2.2.3.so 모듈을 modules 디렉터리로 복사를 했다면 httpd.conf 파일을 열고 다음 부분을 추가해준다. 제일 마지막 라인에 추가해주면 된다.

일단 해당 apahce 설치 폴더는 D:\SERVER\Apache2.2 에 설치를 했다.

httpd.conf
#
# Use name-based virtual hosting.
#
# 해당 아이피
NameVirtualHost 210.112.167.232 
# jk_module 추가
LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.3.so
# workers.properties 파일 추가
JkWorkersFile "D:\SERVER\Apache2.2\conf\workers.properties"
# virtualhost 설정 추가
include "conf/vhosts/*.conf"

위와 같이 수정을 해 줬다면 workers.properties 파일을 생성해준 다음 아래 부분을 복사해서 붙여 넣는다.

workers.properties
# the list of workers
# 톰캣 경로
#workers.tomcat_home=D:\WAS\tomcat-6.0.20 //
# jdk 경로
#workers.java_home=C:\Java\jdk1.6.0_16

ps=\
worker.list=dev,dev2

#test.domain.pe.kr
worker.dev.host=test.domain.pe.kr
worker.dev.port=8009
worker.dev.lbfactor=1
worker.dev.type=ajp13

#test2.domain.pe.kr
worker.dev2.host=test2.domain.pe.kr
worker.dev2.port=8010
worker.dev2.lbfactor=1
worker.dev2.type=ajp13

# loadbalancer 설정
#worker.loadbalancer.type=lb
#worker.loadbalancer.balanced_workers=dev, dev2
#worker.inprocess.type=jni
#worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar
#worker.inprocess.cmd_line=start
#worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout
#worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stde

위에 내용에서 라인 앞줄에 #이 되어 있는 부분은 여기에서는 필요 하지 않으니 신경을 쓸 필요가 없다.이 과정까지 완료 되었다면 이제 도메인에 대한 설정을 해주면 된다. 

httpd.conf 파일에 include "conf/vhosts/*.conf" 라인을 입력 했었다.
conf/vhosts 폴더에 .conf 확장자로 된 모든 파일을 읽어 들이라고 정의를 했으니 해당 파일을 생성해 보자

지금은 vhosts  폴더가 없기 때문에 conf 하위에 vhosts 폴더를 하나 생성해 준다.
그리고  vhosts  아래에 해당 도메인명.conf  파일을 생성해 준후 아래 내용을 복사해서 붙여 넣는다. 해당 부분은 각자 사용자에 따라서 다르기 때문에 경로나 아이피는 적당하게 수정해준다.

test.domain.pe.kr.conf
<VirtualHost 210.112.167.232:80>
    ServerName test.domain.pe.kr   
DocumentRoot D:\webapps\test.domain.pe.kr
    
    ErrorLog logs/dev-error.log
    CustomLog logs/dev.log common
<Directory "D:\webapps\test.domain.pe.kr">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.2/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks
    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None
    #
    # Controls who can get stuff from this server.
    #
#    Order allow,deny
#    Allow from all
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Allow from all
</Directory>
# 아파치로 접근 하는 거중 확장자가 ok 만  톰캣으로 하고
# 나머지는 아파치 즉  workers.properties 의 이름 worker.list=sample 로 보낸다.
    JkMount /*.jsp  dev
    JkMount /*.do  dev
    JkMount /servlet/*  dev
</VirtualHost>


 위에 파일을 생성을 했다면 test2.domain.pe.kr에 대한 파일도 위와 같은 방법으로 하나 생성해준다.

여기까지 작업이 되었다면 아파치에 대한 설정은 끝났다. 이제 톰캣만 설정하면 되는데 톰캣이 설치 되었다면 해당 도메인에 지정된 톰캣 폴더/conf/에서 server.xml 파일을 수정해준다.

지금 현재의 필자의 경로는
D:\WAS\tomcat-6.0.20_test\conf,
D:\WAS\tomcat-6.0.20_test2\conf
로 되어 있다. 각각 해당 폴더를 열고 server.xml 파일을 열어서 다음 부분을 수정해준다. 

D:\WAS\tomcat-6.0.20_test\conf\server.xml

해당 부분은 수정할것이 없다. 기본적으로 톰캣은 8080 포트를 쓰지만 여러개의 톰캣을 사용하려면 이부분이 수정이 되어야 된다.

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

그리고 다음 라인도 찾아 보자. 하지만 이 부분도 여기서는 수정해줄 필요가 없다.
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
</Host>

이부분도 찾아보자  이 부분은 기본적으로 톰캣 폴더가 ROOT로 되어 있다.
하지만 아파치의 경로는 현재 D:\webapps\test.domain.pe.kr으로 되어 있다.
이럴 경우 정적 리소스의 경우는 D:\webapps\test.domain.pe.kr에 저장이 되고
jsp, class의 경우는 D:\WAS\tomcat-6.0.20_test\webapps\ROOT에 저장을 해줘야 한다. 이렇게 분리하는것도 다른건 아니지만 그게 귀찮다면 아래 부분을 추가해준다.

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="D:\webapps\test.domain.pe.kr" path="" reloadable="false"/>
</Host>

이렇게 되면 같은 폴더를 사용하게 된다.

이제는 D:\WAS\tomcat-6.0.20_test2\conf\server.xml를 수정하도록 하자
위에 파일과 다를것이 없으므로 변경 부분만 강조를 하도록 하겠다.

D:\WAS\tomcat-6.0.20_test2\conf\server.xml
<Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="D:\webapps\test2.domain.pe.kr" path="" reloadable="false"/>
</Host>

위와 같이 적용이 되었다면 완료가 되었다..

적용된 도메인은 2개가 된다.

아파치
http://test.domain.pe.kr
http://test2.domain.pe.kr

톰캣
http://test.domain.pe.kr:8080
http://test2.domain.pe.kr:8081

참고)
도메인이 없는 경우 테스트를 할려면 host 파일에 설정을 해줘야 한다.

Comment +0

Windows에서 mod_jk모듈을 통한 Apache와 Tomcat 연동에 대해서 적어본다.

기본적으로 Apache와 Tomcat 이 설치가 되어 있다는 과정하에 설명하도록 하겠다.
Apache 버전은 2.2, Tomcat버전은 5.5 설치파일이 아닌 압축 버전으로 설치를 하였다.

mod_jk 모듈은 다운받아서 Apache 폴더 하위에 있는 modules폴더에 넣는다.

톰캣부분은 따로 설정한 부분이 없다.
다만 아파치만 설정을 하면 되는데 httpd.conf 파일을 열어서 mod_jk 모듈을 추가해준다.

httpd.conf
LoadModule jk_module     modules/mod_jk-1.2.27-httpd-2.2.10.so

128 라인 정도에 모듈 마지막 즈음이 될듯하니 거기에 추가해주면 될것이다.

httpd.conf
<IfModule mod_jk.c> 
     JkWorkersFile conf/workers.properties 
     JkLogFile logs/mod_jk.log 
     JkLogLevel    info 
     JkMountFile   conf/uriworkermap.properties
</IfModule>

httpd.conf 제일 하단부분에 다음과 같은 부분을 추가해준다.

아래와 같은 파을을  Apache/conf 폴더에 생성한다.

workers.properties
uriworkermap.properties

workers.properties
worker.list=worker1
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1

uriworkermap.properties
/*.do=worker1
/*.jsp=worker1

해당 파일안에 위 내용을 넣어준후에 테스트를 해본다.

정적인 파일은 아파치 해당 폴더에 D:\WAS\Apache2.2\htdocs (각자 설치에 따라 다름)
동적인 파일은 톰캣 ROOT 폴더에  D:\WAS\tomcat-5.5\webapps\ROOT (각자 설치에 따라 다름)
옮긴 후에 테스트를 해본다.

http://localhost:80/index.html
http://localhost:8080/index.jsp



2009-11-11 추가

다수의 도메인 연결 방법

위에 경우는 하나의 도메인과 하나의 톰캣과의 연동법을 설명한 것이다. 하지만 위와 같은 경우가 아닌 하나의 아파치에 여려대의 tomcat을 사용하는 경우가 있을것이고 여러개의 도메인을 연결해서 사용해야 하는 경우도 있다. 아래 부분은 그 부분에 대해서 설명을 한다.
위에 내용과 연결되지 않으니 아파치 톰캣이 설치 되어 있다면 위에 부분은 건너 뛰고 아래 부분 부터 적응을 하면 된다.

mod_jk-1.2.28-httpd-2.2.3.so 모듈을 modules 디렉터리로 복사를 했다면 httpd.conf 파일을 열고 다음 부분을 추가해준다. 제일 마지막 라인에 추가해주면 된다.

일단 해당 apahce 설치 폴더는 D:\SERVER\Apache2.2 에 설치를 했다.

httpd.conf
#
# Use name-based virtual hosting.
#
# 해당 아이피
NameVirtualHost 210.112.167.232 
# jk_module 추가
LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.2.3.so
# workers.properties 파일 추가
JkWorkersFile "D:\SERVER\Apache2.2\conf\workers.properties"
# virtualhost 설정 추가
include "conf/vhosts/*.conf"

위와 같이 수정을 해 줬다면 workers.properties 파일을 생성해준 다음 아래 부분을 복사해서 붙여 넣는다.

workers.properties
# the list of workers
# 톰캣 경로
#workers.tomcat_home=D:\WAS\tomcat-6.0.20 //
# jdk 경로
#workers.java_home=C:\Java\jdk1.6.0_16

ps=\
worker.list=dev,dev2

#test.domain.pe.kr
worker.dev.host=test.domain.pe.kr
worker.dev.port=8009
worker.dev.lbfactor=1
worker.dev.type=ajp13

#test2.domain.pe.kr
worker.dev2.host=test2.domain.pe.kr
worker.dev2.port=8010
worker.dev2.lbfactor=1
worker.dev2.type=ajp13

# loadbalancer 설정
#worker.loadbalancer.type=lb
#worker.loadbalancer.balanced_workers=dev, dev2
#worker.inprocess.type=jni
#worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar
#worker.inprocess.cmd_line=start
#worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout
#worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stde

위에 내용에서 라인 앞줄에 #이 되어 있는 부분은 여기에서는 필요 하지 않으니 신경을 쓸 필요가 없다.이 과정까지 완료 되었다면 이제 도메인에 대한 설정을 해주면 된다. 

httpd.conf 파일에 include "conf/vhosts/*.conf" 라인을 입력 했었다.
conf/vhosts 폴더에 .conf 확장자로 된 모든 파일을 읽어 들이라고 정의를 했으니 해당 파일을 생성해 보자

지금은 vhosts  폴더가 없기 때문에 conf 하위에 vhosts 폴더를 하나 생성해 준다.
그리고  vhosts  아래에 해당 도메인명.conf  파일을 생성해 준후 아래 내용을 복사해서 붙여 넣는다. 해당 부분은 각자 사용자에 따라서 다르기 때문에 경로나 아이피는 적당하게 수정해준다.

test.domain.pe.kr.conf
<VirtualHost 210.112.167.232:80>
    ServerName test.domain.pe.kr   
DocumentRoot D:\webapps\test.domain.pe.kr
    
    ErrorLog logs/dev-error.log
    CustomLog logs/dev.log common
<Directory "D:\webapps\test.domain.pe.kr">
    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.2/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks
    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None
    #
    # Controls who can get stuff from this server.
    #
#    Order allow,deny
#    Allow from all
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Allow from all
</Directory>
# 아파치로 접근 하는 거중 확장자가 ok 만  톰캣으로 하고
# 나머지는 아파치 즉  workers.properties 의 이름 worker.list=sample 로 보낸다.
    JkMount /*.jsp  dev
    JkMount /*.do  dev
    JkMount /servlet/*  dev
</VirtualHost>


 위에 파일을 생성을 했다면 test2.domain.pe.kr에 대한 파일도 위와 같은 방법으로 하나 생성해준다.

여기까지 작업이 되었다면 아파치에 대한 설정은 끝났다. 이제 톰캣만 설정하면 되는데 톰캣이 설치 되었다면 해당 도메인에 지정된 톰캣 폴더/conf/에서 server.xml 파일을 수정해준다.

지금 현재의 필자의 경로는
D:\WAS\tomcat-6.0.20_test\conf,
D:\WAS\tomcat-6.0.20_test2\conf
로 되어 있다. 각각 해당 폴더를 열고 server.xml 파일을 열어서 다음 부분을 수정해준다. 

D:\WAS\tomcat-6.0.20_test\conf\server.xml

해당 부분은 수정할것이 없다. 기본적으로 톰캣은 8080 포트를 쓰지만 여러개의 톰캣을 사용하려면 이부분이 수정이 되어야 된다.

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

그리고 다음 라인도 찾아 보자. 하지만 이 부분도 여기서는 수정해줄 필요가 없다.
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
</Host>

이부분도 찾아보자  이 부분은 기본적으로 톰캣 폴더가 ROOT로 되어 있다.
하지만 아파치의 경로는 현재 D:\webapps\test.domain.pe.kr으로 되어 있다.
이럴 경우 정적 리소스의 경우는 D:\webapps\test.domain.pe.kr에 저장이 되고
jsp, class의 경우는 D:\WAS\tomcat-6.0.20_test\webapps\ROOT에 저장을 해줘야 한다. 이렇게 분리하는것도 다른건 아니지만 그게 귀찮다면 아래 부분을 추가해준다.

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="D:\webapps\test.domain.pe.kr" path="" reloadable="false"/>
</Host>

이렇게 되면 같은 폴더를 사용하게 된다.

이제는 D:\WAS\tomcat-6.0.20_test2\conf\server.xml를 수정하도록 하자
위에 파일과 다를것이 없으므로 변경 부분만 강조를 하도록 하겠다.

D:\WAS\tomcat-6.0.20_test2\conf\server.xml
<Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="D:\webapps\test2.domain.pe.kr" path="" reloadable="false"/>
</Host>

위와 같이 적용이 되었다면 완료가 되었다..

적용된 도메인은 2개가 된다.

아파치
http://test.domain.pe.kr
http://test2.domain.pe.kr

톰캣
http://test.domain.pe.kr:8080
http://test2.domain.pe.kr:8081

Comment +3

  • 제 글이 검색이 되나 해서 찾아보다가 트랙백 하나 남기고 갈께요~^^

  • 이해가 안가는부분이 있는데요
    D:\webapps\test.domain.pe.kr
    여기에 소스가 들어있는건가요 톰캣은
    D:\WAS\tomcat-6.0.20\ 여기에 설치된거같은데 하기 두폴더는
    D:\WAS\tomcat-6.0.20_test\conf,
    D:\WAS\tomcat-6.0.20_test2\conf
    어떻게 생성된건가요????????

  • 일반적으로 설정을 안할 경우는 tomcat-6.0.20\webapps\ROOT\ 하위에 소스를 올리면 됩니다.
    하지만 위에는 특정 디렉터리를 지정한 것이므로
    test.domain.pe.kr 도메인은 D:\webapps\test.domain.pe.kr
    test2.domain.pe.kr 도메인은 D:\webapps\test2.domain.pe.kr
    server.xml에 특정 디렉터리를 소스경로로 지정을 한 것입니다.