반응형

Apache와 Tomcat을 연동시키는 방법에 대해 알아 보겠다. 연동에는 "mod_proxy_ajp"를 사용한다.


먼저 Tomcat 단독으로 동작하도록 설정한다. 간단히 Tomcat에서 "Tomcat Page"라고만 표시하는 JSP를 Apache 통해 작동시키는 것을 목표로 한다.

이번에 만들 웹 프로그램은 "{Tomcat 설치 디렉토리}/webapps"안에 hello라는 디렉토리를 만든다,

C:\apache\apache-tomcat-9.0.29\webapps>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: XXXX-XXXX

 C:\apache\apache-tomcat-9.0.29\webapps 디렉터리

2019-12-08  오전 02:38    <DIR>          .
2019-12-08  오전 02:38    <DIR>          ..
2019-12-07  오전 02:19    <DIR>          docs
2019-12-07  오전 02:19    <DIR>          examples
2019-12-08  오전 02:40    <DIR>          hello <------------------ 새로 생성한 디렉토리이다.
2019-12-07  오전 02:19    <DIR>          host-manager
2019-12-07  오전 02:19    <DIR>          manager
2019-12-07  오전 02:19    <DIR>          ROOT
               0개 파일                   0 바이트
               8개 디렉터리  450,057,445,376 바이트 남음

C:\apache\apache-tomcat-9.0.29\webapps>

생성된 디렉토리에 "{Tomcat 설치 디렉토리}/webapps/hello/WEB-INF/web.xml" 설정 파일을 생성하여, 아래와 같이 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>

그러고 화면에 표시할 "{Tomcat 설치 디렉토리}/webapps/hello/index.jsp" 파일도 생성하여, 아래와 같이 작성한다.

<html>
<body>
<h1>Tomcat Page</h1>
</body>
</html>

이제 톰켓을 기동하기 위해 "{Tomcat 설치 디렉토리}/bin/startup.bat" 명령 파일을 실행시킨다. 그러면 아래와 같이 콘솔창이 표시될 것이다.


화면이 표시되는지 브라우저에서 "http://localhost:8080/hello/"에 액세스 해본다.

위와 같이 표시되었다면 준비가 완료 되었다.

반응형
반응형

가상 호스트 별칭 설정 (ServerAlias)

이름 기반 가상 호스트의 설정이 되었을 때, 등록되지 않은 호스트명으로 액세스된 경우에 어떻게 되는 보도록 하겠다.

예를 들어, DNS (또는 hosts 파일)의 다음과 같은 작성이 되어 있다고 하자.

127.0.0.1 localhost
127.0.0.1 ww1.devkuma.com
127.0.0.1 ww2.devkuma.com

이에 대해 가상 호스트가 "ww1.devkuma.com"과 "ww2.devkuma.com"만 설정이 되어 있다고 하자.

<VirtualHost *:80>
    ServerName     ww1.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww1"
    CustomLog      logs/ww1.access.log common
    ErrorLog       logs/ww1.error.log
</VirtualHost>

<VirtualHost *:80>
    ServerName     ww2.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww2"
    CustomLog      logs/ww2.access.log common
    ErrorLog       logs/ww2.error.log
</VirtualHost>

이러한 경우에 "http://localhost"에 대한 액세스가 되면, 먼저 등록되어 있는 가상 호스트 설정인 기본값으로 적용된다.


여기서는 먼저 등록된 가상 호스트 "ww1.devkuma.com"가 표시되었다.

이러한 때, 가상 호스트 설정이 되어 있지 않은 호스트에 대해 기본이 아닌 호스트의 설정을 적용할 수 있다. "ServerAlias"를 사용하여 가상 호스트 설정에 별칭으로 등록한다.

ServerAlias 호스트명1 호스트명2 ...

여러 호스트명을 등록하고자하는 경우에는 공백으로 구분 이어서 작성한다.

실습

그럼 실제 실습을 해보도록 하겠다. "http://localhost/"에 대한 액세스도 "ww2.devkuma.com "설정이 적용되도록 ww2.devkuma.com"에 ServerAlias으로 "localhost"를 등록한다.

<VirtualHost *:80>
    ServerName     ww1.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww1"
    CustomLog      logs/ww1.access.log common
    ErrorLog       logs/ww1.error.log
</VirtualHost>

<VirtualHost *:80>
    ServerName     ww2.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww2"
    CustomLog      logs/ww2.access.log common
    ErrorLog       logs/ww2.error.log
    ServerAlias    localhost
</VirtualHost>

이제 준비는 완료하였다. Apache를 재시작한 후 다시 "http://localhost/"에 액세스해 본다.


이번에는 기본 설정이 아닌 별칭 설정된 "ww2.devkuma.com"가 표시되었다.

반응형
반응형

이름 기반 가상 호스트

이름 기반의 경우 IP 주소는 한개가 아니어도 된다. 이름 기반의 경우는 클라이언트의 요청에 포함된 Hosts 헤더를 보고 어떤 호스트에 액세스할 것인지를 결정한다.

먼저 "VirtualHost"를 사용하여 ServerName마다 설정하고 있다.

<VirtualHost IP주소:포트-번호>
    ServerName www1.devkuma.com
    ....
</VirtualHost>

<VirtualHost  IP주소:포트-번호>
    ServerName www2.devkuma.com
    ....
</VirtualHost>

요청(request)에 포함된 Hosts 헤더를 참조하여 "ServerName"와 일치하는 블록을 찾는다. 일치하는 블록이 발견되면 그 블록의 설정이 적용된다.

좀 더 구체적으로 설명을 하자면, "ww1.devkuma.com"과 "ww1.devkuma.com" 두 호스트를 1개 이상의 IP 주소에 할당하고, 각각에 대한 액세스에 대해 다른 동작을 하게 하려면 다음과 같이 설정한다.

<VirtualHost *:80>
    ServerName     ww1.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww1"
    CustomLog      logs/ww1.access.log common
    ErrorLog       logs/ww1.error.log
</VirtualHost>

<VirtualHost *:80>
    ServerName     ww2.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww2"
    CustomLog      logs/ww2.access.log common
    ErrorLog       logs/ww2.error.log
</VirtualHost>

※ 위의 "*:80"이라고 지정되어 있는 부분은 "192.168.1.2:80"와 같이 명시적으로 IP 주소를 지정해도 된다.

실습

그럼 실제 실습을 해보도록 하겠다. 먼저 2개의 호스트에 대한 DNS 등록한다. 여기서는 DNS 대신에 "hosts" 파일에 다음과 같이 작성한다. (※ "hosts"파일에 대해서는 "호스트 접근 설정 (hosts 파일)"를 참조한다.)

127.0.0.1 ww1.devkuma.com
127.0.0.1 ww2.devkuma.com

다음은 "httpd.conf" 설정이다. 가상 호스트에 대한 설정은 "httpd-vhosts.conf" 파일에 작성하도록 하겠다.

먼저 "httpd-vhosts.conf" 파일을 사용합니다. "httpd.conf" 파일에서 "httpd-vhosts.conf"로 검색해 보면, 다음과 같은 내용을 찾을 수 있을 것이다.

# Virtual hosts
#Include conf/extra/httpd-vhosts.conf

"Include" 앞에 있는 '#'를 제거하고 "httpd-vhosts.conf"을 읽도록 설정한다.

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

다음은 "httpd-vhosts.conf" 파일을 수정한다. "(Apache 설치 디렉토리)Apache24\conf\extra"디렉토리에 있다.

다음과 같이 샘플로 작성되어 있을 것이다. (주석은 생략한다.)

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "${SRVROOT}/docs/dummy-host.example.com"
    ServerName dummy-host.example.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "logs/dummy-host.example.com-error.log"
    CustomLog "logs/dummy-host.example.com-access.log" common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "${SRVROOT}/docs/dummy-host2.example.com"
    ServerName dummy-host2.example.com
    ErrorLog "logs/dummy-host2.example.com-error.log"
    CustomLog "logs/dummy-host2.example.com-access.log" common
</VirtualHost>

여기서는 다음과 같이 변경한다.

<VirtualHost *:80>
    ServerName     ww1.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww1"
    CustomLog      logs/ww1.access.log common
    ErrorLog       logs/ww1.error.log
</VirtualHost>

<VirtualHost *:80>
    ServerName     ww2.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww2"
    CustomLog      logs/ww2.access.log common
    ErrorLog       logs/ww2.error.log
</VirtualHost>

※ "httpd-vhosts.conf " 파일은 "Include"에 의해 "httpd.conf "파일에 로드된다. 그러므로 위의 로그 형식명을 지정하고 있는 "common"은 "httpd.conf" 파일에 정의된 "common"형식이 사용도 된다.

또한 위에서 설정한 대로 도큐먼트 루트를 각각 생성하고, 별도의 HTML 파일을 아래와 같이 각각 작성하여 넣는다.

{Apache 설치 디렉토리}/htdocs-ww1/index.html

<html>
<body>
<h1>WW1 Page</h1>
</body>
</html>

{Apache 설치 디렉토리}/htdocs-ww2/index.html

<html>
<body>
<h1>WW2 Page</h1>
</body>
</html>

"httpd.conf" 파일에서 아래와 같이 이 두 도큐먼트 루트에 적절한 권한을 설정한다.

<Directory "${SRVROOT}/htdocs-ww1">
    Require all granted
</Directory>

<Directory "${SRVROOT}/htdocs-ww2">
    Require all granted
</Directory>

이제 준비는 완료하였다. 우선 "http://ww1.devkuma.com"에 액세스해 본다.

"ww1.devkuma.com"용의 도큐먼트 루트에 포함된 HTML 파일이 표시된다.

다음은 "http://ww2.devkuma.com/"에 액세스해 본다.

"ww2.devkuma.com"용의 도큐먼트 루트에 포함된 HTML 파일이 표시된다.

이것으로 하나의 IP 주소와 Apache를 사용하여 여러 도메인을 사용하여 호스트에 대해 별도의 페이지를 반환하는 방법에 대해 알아보았다.

반응형
반응형

1대의 서버를 사용하여 여러 도메인을 사용한 Web 서버로서의 기능을 제공하는 방법에 대해 설명한다. 서버가 여러 인터페이스를 가지고 있고 IP 주소가 여러개를 할당할 수있는 경우와 하나의 IP 주소에 호스트을 보고 배분 방법이 있다.


IP 기반 가상 호스트

IP 기반은 하나의 서버에 여러 개의 LAN 카드가 장착되어 있어, 여러 IP 주소를 있는 경우에 각각의 IP 주소에 대한 가상 호스트를 지정한다.

IP 기반 가상 호스트를 할당하려면 "VirtualHost"를 사용한다.

<VirtualHost IP주소1:포트번호>
  ...
  ...
</VirtualHost>

<VirtualHost IP주소2:포트번호>
  ...
  ...
</VirtualHost>

예를 들어, "192.168.1.1"와 "192.168.1.2" 2개의 IP 주소가 할당되어 있다면 DNS에 "ww1.devkuma.com"을 "192.168.1.1"으로 등록하고, "ww2.devkuma.com"을 "192.168.1.2"을 등록한다.

하나의 Apache에서 2개의 호스트에 대한 설정을 하려면 "httpd.conf" 혹은 "http-vhosts.conf" 파일에 다음과 같이 작성한다. (관리 측면으로 본다면 "httpd.conf" 보다는 "http-vhosts.conf"에 작성하는 것이 맞을 것이다. 상세한 내용은 "이름 기반 가상 호스트"를 참조한다.)

<VirtualHost 192.168.1.1:80>
    ServerName     ww1.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww1"
    CustomLog      logs/ww1.access.log common
    ErrorLog       logs/ww1.error.log
</VirtualHost>

<VirtualHost 192.168.1.2:80>
    ServerName     ww2.devkuma.com
    ServerAdmin    devkuma@devkuma.com
    DocumentRoot   "${SRVROOT}/htdocs-ww2"
    CustomLog      logs/ww2.access.log common
    ErrorLog       logs/ww2.error.log
</VirtualHost>

IP 주소마다 필요한 설정해야 한다. 예를 들어, "ww1.devkuma.com"에 액세스하게 되면 "192.168.1.1"에 설정된 도큐먼트 루트 "${SRVROOT}/htdocs-ww1"에 있는 내용이 반환된다.

VirtualHost마다 개별 설정을 작성할 수 있으므로 필요한 설정을 하도록 한다. 위에 작성된 것처럼 "ServerName"과 "DocumentRoot" 그리고 로그 관계는 개별적으로 설정하기를 추천한다. 물론 필수는 아니기에 공통된 설정하여도 상관은 없다.

그 외에도 각 도큐먼트 루트 액세스 권한 설정이 필요하다. "httpd.conf" 파일에서 아래와 같이 이 두 도큐먼트 루트에 적절한 권한을 설정한다.

<Directory "${SRVROOT}/htdocs-ww1">
    Require all granted
</Directory>

<Directory "${SRVROOT}/htdocs-ww2">
    Require all granted
</Directory>

실습

※ IP 기반 가상 호스트의 테스트가 가능한 환경이 없어서실제로 실습 및 확인 테스트을 못하고 작성되었다. 참고하길 바란다.

반응형
반응형

로그는 별도로 지정하지 않으면 하나의 파일에 기록을 이어간다. 따로 설정을 하게 되면 로그를 일정 기간마다 별도의 파일로 전환될 수 있게 할 수 있다. 예를 들어 하루 단위로 별도의 로그 파일로 기록하도록 하면 관리도 편해진다.

로그 로테이션 (rotetalogs)

로그를 순환하는 유틸리티 프로그램을 Apache에서는 제공하고 있다. "{Apache 설치 디렉토리}/Apache24/bin" 디렉토리에 들어있는 "rotatelogs" 프로그램을 사용한다.

사용법은 다음과 같다.

rotatelogs 대상-로그-파일 지정-시간

지정 시간은 초 단위로 로그를 분할하는 시간을 지정한다. 1 일 단위라면 "60 × 60 × 24 = 86400 "으로 지정한다.

로그 로테이션은 "httpd.conf"로 설정하여 자동으로 할 수 있다. 설정하려면 "CustomLog"에 대해 다음과 같이 설정한다.

CustomLog "| rotatelogs 대상-로그-파일 지정=시간" 로그-형식명

예를 들어 "common" 로그 포맷을 사용하여 1일 단위의 로그 회전을 설정하려면 다음과 같이 작성한다.

CustomLog logs/access.log common
CustomLog "|bin/rotatelogs.exe logs/access.log 86400" common

Windows 운영체제에선 반드시 rotatelogs 다음에 .exe 를 붙여주어야 한다.

이것으로 로그가 저장될 때 지정된 시간이 경과할 때마다 다른 로그 파일을 생성하여 기록하게 된다.

그럼 실제로 해보록 하자. 앞에서의 설정을 "httpd.conf"로 설정하고 Apache를 재시작한다. 그리고 Apache에서 공개된 파일에 액세스한다.

C:\apache\Apache24\logs>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: XXXX-XXXX

 C:\apache\Apache24\logs 디렉터리

2019-12-07  오전 01:40    <DIR>          .
2019-12-07  오전 01:40    <DIR>          ..
2019-12-07  오전 01:40               427 access.log
2019-12-07  오전 01:40                 0 access.log.1575590400
2019-12-07  오전 01:40               532 error.log
2019-12-07  오전 01:40                 6 httpd.pid
               4개 파일                 965 바이트
               2개 디렉터리  450,662,526,976 바이트 남음

C:\apache\Apache24\logs>

위와 같이 새로 "access.log.1575590400"라는 파일이 생성되어 로그가 저장되어 있다. 뒤에 붙어있는 ".1575590400"는 1970년 1월 1일 이후의 시간을 초단위로 표시한다.

그러면 클라이언트에 설정되어있는 날짜를 2일 진행 후 다시 Apache의 파일에 액세스해 본다.

C:\apache\Apache24\logs>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: XXXX-XXXX

 C:\apache\Apache24\logs 디렉터리

2019-12-09  오전 01:51    <DIR>          .
2019-12-09  오전 01:51    <DIR>          ..
2019-12-07  오전 01:40               427 access.log
2019-12-07  오전 01:41               475 access.log.1575590400
2019-12-09  오전 01:51                 0 access.log.1575763200
2019-12-07  오전 01:40               532 error.log
2019-12-07  오전 01:40                 6 httpd.pid
               5개 파일               1,440 바이트
               2개 디렉터리  450,650,722,304 바이트 남음

C:\apache\Apache24\logs>

이전 생성된 로그에서 86400 초 이상 경과하여, 새 로그 파일이 생성되고 기록이 되고 있다.

로그 파일의 형식을 지정

별로 설정을 하지 않으면 로그 파일 뒤에 1970년 1월 1일 이후의 시간을 초단위로 표시된다. 이대로는 알아 보기 어렵기 때문에 로그를 구별하기 위해 붙는 부분의 포맷을 지정할 수 있다. 예를 들어, 시간(초)가 아닌 날짜를 표시하도록 하려면 다음과 같이 작성한다.

CustomLog "| ¥"D : / Apache Group / Apache2.2 / bin / rotatelogs ¥ "¥"D : / Apache Group / Apache2.2 / logs / access.log % Y- % m- % d ¥ "86400" common

CustomLog "|bin/rotatelogs.exe logs/access.log.%Y-%m-%d 86400" common

대상 로그 파일명 뒤에 마침표(.)를 입력 후 포맷을 지정한다. 이번에는 날짜를 "-"으로 구분된 형식으로 지정하였다.

그럼 실제로 해보도록 하겠다. 위에 설정을 "httpd.conf"에 설정하고 Apache를 재시작한다. 그리고 뭔가 Apache에서 공개된 파일에 액세스한다.

C:\apache\Apache24\logs>dir
 C 드라이브의 볼륨에는 이름이 없습니다.
 볼륨 일련 번호: XXXX-XXXX

 C:\apache\Apache24\logs 디렉터리

2019-12-07  오전 02:05    <DIR>          .
2019-12-07  오전 02:05    <DIR>          ..
2019-12-07  오전 02:04               122 access.log
2019-12-07  오전 02:04               122 access.log.2019-12-06
2019-12-07  오전 02:05             1,287 error.log
               3개 파일               1,531 바이트
               2개 디렉터리  450,652,733,440 바이트 남음

C:\apache\Apache24\logs>

이번에는 지정된 형식의 형식으로 날짜가 추가되었다.

참조


반응형

+ Recent posts