Centos7 / Apache - Tomcat - JK Connector 연동하기

Updated:

WEB 과 WAS 의 차이와 개념을 정확하게 모르신다면 WEB / WAS 의 차이 포스트를 보시면 됩니다.

AJP 프로토콜의 개념은 AJP Protocol 포스트를 보시면 됩니다.

Version

사용한 버전은 아래와 같습니다.

  • Vagrant : 2.2.6
  • Java : openjdk-1.8.0
  • Apache Tomcat : 9.0.34
  • Apache httpd : 2.4.43
  • Tomcat Connectors : 1.2.48

Vagrant

저는 VM 을 자동으로 관리하기 위해 Vagrant 를 사용했습니다. Vagrantfile 은 아래와 같습니다.

Vagrant.configure("2") do |config|
  vm_num = 1
  node_cpu = 2 # 1Core
  node_memory = "2048" # 2G Memory
  node_network = "10.30.30"
  node_prefix = "centos7"

  config.vm.box = "centos/7"
  config.vm.box_version = "1905.1"
  config.vm.box_check_update = false
  #config.disksize.size = "10GB" # > 10GB

  (1..vm_num).each do |i|
    config.vm.define "#{node_prefix}-#{i}" do |node|
      hostname = "#{node_prefix}-#{i}"
      hostip = "#{node_network}.#{i + 1}"

      node.vm.hostname = hostname
      node.vm.network "private_network", ip: hostip

      node.vm.provider "virtualbox" do |vb|
        vb.name = "#{node_prefix}-#{i}"
        vb.gui = false
        vb.cpus = node_cpu
        vb.memory = node_memory
      end
    end
  end
end

Vagrantfile 이 있는 경로에서 vagrant up 명령어를 치면 VM 이 생성됩니다.

$ vagrant up

=> vagrant: A new version of Vagrant is available: 2.2.7 (installed version: 2.2.6)!
==> vagrant: To upgrade visit: https://www.vagrantup.com/downloads.html

Bringing machine 'centos7-1' up with 'virtualbox' provider...
==> centos7-1: Clearing any previously set forwarded ports...
==> centos7-1: Clearing any previously set network interfaces...
==> centos7-1: Preparing network interfaces based on configuration...
    centos7-1: Adapter 1: nat
    centos7-1: Adapter 2: hostonly
==> centos7-1: Forwarding ports...
    centos7-1: 22 (guest) => 2222 (host) (adapter 1)
==> centos7-1: Running 'pre-boot' VM customizations...
==> centos7-1: Booting VM...
==> centos7-1: Waiting for machine to boot. This may take a few minutes...
    centos7-1: SSH address: 127.0.0.1:2222
    centos7-1: SSH username: vagrant
    centos7-1: SSH auth method: private key
==> centos7-1: Machine booted and ready!
==> centos7-1: Checking for guest additions in VM...
    centos7-1: No guest additions were detected on the base box for this VM! Guest
    centos7-1: additions are required for forwarded ports, shared folders, host only
    centos7-1: networking, and more. If SSH fails on this machine, please install
    centos7-1: the guest additions and repackage the box to continue.
    centos7-1:
    centos7-1: This is not an error message; everything may continue to work properly,
    centos7-1: in which case you may ignore this message.
==> centos7-1: Setting hostname...
==> centos7-1: Configuring and enabling network interfaces...
==> centos7-1: Rsyncing folder: /Users/has3ong/Desktop/solaris10/ => /vagrant
==> centos7-1: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> centos7-1: flag to force provisioning. Provisioners marked to run always will still run.

vagrant ssh centos7-1 을 입력하면 VM 에 접속할 수 있습니다.

$ vagrant ssh centos7-1

Last login: Mon Apr 27 05:08:17 2020 from 10.0.2.2
[vagrant@centos7-1 ~]$

VM 을 종료시키려면 vagrant halt 를 입력합니다.

$ vagrant halt

==> centos7-1: Attempting graceful shutdown of VM...

VM 을 제거하려면 vagrant destroy 를 입력하면 됩니다.

$ vagrant destroy

    centos7-1: Are you sure you want to destroy the 'centos7-1' VM? [y/N]

Install JDK

설치 가능한 Java 버전을 살펴보겠습니다.

$ yum list java*jdk-devel

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
 * extras: mirror.kakao.com
 * updates: mirror.kakao.com
Available Packages
java-1.6.0-openjdk-devel.x86_64            1:1.6.0.41-1.13.13.1.el7_3             base
java-1.7.0-openjdk-devel.x86_64            1:1.7.0.251-2.6.21.0.el7_7             updates
java-1.8.0-openjdk-devel.i686              1:1.8.0.242.b08-0.el7_7                updates
java-1.8.0-openjdk-devel.x86_64            1:1.8.0.242.b08-0.el7_7                updates
java-11-openjdk-devel.i686                 1:11.0.6.10-1.el7_7                    updates
java-11-openjdk-devel.x86_64               1:11.0.6.10-1.el7_7                    updates

여기서 OpenJDK 1.8.0 버전을 설치하겠습니다.

$ yum install java-1.8.0-openjdk-devel.x86_64

OpenJDK 설치를하고 아래 명령어를 쳤을때 정확하게 출력이되면 정상적으로 설치가 된것입니다.

$ java -version

openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

그리고 Java 경로를 알아보겠습니다. which 를 사용하면 아래와 같이 찍히지만 보통 JAVA_HOME 은 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64 이런식으로 잡힙니다.

$ which javac
/usr/bin/javac
$ which java
/usr/bin/java
$JAVA_HOME

/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64

Install Tomcat

제일 먼저 Apache 홈페이지에서 필요한 파일을 설치하기 위한 wget 패키지를 설치합니다.

$ yum install -y wget

먼저 WAS 인 Apache Tomcat 을 다운로드 받겠습니다. 압축을 풀고난 후 /opt 경로에다가 옮겨놓습니다. TOMCAT_HOME=/opt/tomcat

$ wget http://mirror.apache-kr.org/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz
$ tar xvzpf apache-tomcat-9.0.34.tar.gz
$ mv apache-tomcat-9.0.34 /opt
$ cd /opt
$ mv apache-tomcat-9.0.34/ tomcat

tomcat user 와 group 을 만들고 파일의 소유권을 변경시킵니다.

$ useradd tomcat
$ groupadd tomcat
$ chown -R tomcat:tomcat tomcat

그리고 systemd 가 tomcat 데몬을 제어하도록 등록시키겠습니다.

$ vi /etc/systemd/system/tomcat.service

tomcat.service 파일에는 아래 내용을 등록합니다.

# cat /etc/systemd/system/tomcat.service
# Systemd unit file for tomcat
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target
 
[Service]
Type=forking
 
Environment=JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'
 
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/bin/kill -15 $MAINPID
 
User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always
 
[Install]
WantedBy=multi-user.target

정확하게 작동하는지 tomcat 을 시작해보겠습니다.

$ systemctl daemon-reload
$ systemctl start tomcat

tomcat 의 디폴트 포트는 8080 이므로 netstat 으로 8080 포트가 작동하는지 확인해보겠습니다.

$ ss -nlp | grep tcp
tcp    LISTEN     0      128       *:111                   *:*
tcp    LISTEN     0      128       *:22                    *:*
tcp    LISTEN     0      100    127.0.0.1:25                    *:*
tcp    LISTEN     0      1        [::ffff:127.0.0.1]:8005               [::]:*
tcp    LISTEN     0      128    [::]:111                [::]:*
tcp    LISTEN     0      100    [::]:8080               [::]:*
tcp    LISTEN     0      128    [::]:22                 [::]:*
tcp    LISTEN     0      100       [::1]:25                 [::]:*

http://10.30.30.2:8080/ 접속시 톰캣 화면이 나타나면 정상적으로 설치가 된것입니다.

image

아래 명령어를 사용하면 다시 종료시킬 수 있습니다.

$ systemctl stop tomcat

만약 접속이 안된다면 방화벽을 확인하면 됩니다. firewalld 를 설치하겠습니다.

$ yum install firewalld
$ systemctl start firewalld
$ systemctl enable firewalld

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

방화벽을 확인해보면 아무 포트도 열려있지 않은것을 확인할 수 있습니다. 8080 포트를 열어보겠습니다.

$ firewall-cmd --permanent --zone=public --add-port=8080/tcp
success
$ firewall-cmd --reload
success

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: dhcpv6-client ssh
  ports: 8080/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

8080 포트가 열린것을 볼 수 있습니다. WEB Server 도 설치해야 하니 http 도 열어주겠습니다.

$ sudo firewall-cmd --permanent --zone=public --add-service=http
success
$ sudo firewall-cmd --reload
success
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: dhcpv6-client http ssh
  ports: 8080/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Install Apache Web Server

아래와 같이 간단하게 설치할 수 있지만 httpd 파일을 다운로드 받아 컴파일하는 방식으로 설치해보겠습니다.

$ yum install httpd
$ systemctl start httpd

컴파일을 해야하기 때문에 사전에 필요한 패키지들을 설치하겠습니다.

$ yum -y install gcc make gcc-c++ pcre-devel expat-devel

httpd, apr, apr-utilwget 을 이용하여 다운로드 받고 압축을 해제한 다음 /usr/local/src 폴더로 이동시킵니다.

APR(아파치 포터블 런타임)는 아파치 HTTP 서버 2.x.의 핵심이며 휴대용 라이브러리입니다. 이런 APR은 고급 IO 기능(예:sendfile, epoll and OpenSSL 등)에 대한 접근을 포함하여 OS 수준의 기능 (난수 생성, 시스템 상태), 그리고 기본 프로세스 처리(공유 메모리, NT 파이프와 유닉스 소켓) 등 많은 용도로 사용되고 있습니다.

$ wget http://mirror.navercorp.com/apache/httpd/httpd-2.4.43.tar.gz
$ tar xvzpf httpd-2.4.43.tar.gz
$ wget http://mirror.apache-kr.org/apr/apr-1.6.5.tar.gz
$ tar xvzpf apr-1.6.5.tar.gz
$ wget http://mirror.apache-kr.org/apr/apr-util-1.6.1.tar.gz
$ tar xvzpf apr-util-1.6.1.tar.gz

$ mv httpd-2.4.43 /usr/local/src
$ mv apr-1.6.5 /usr/local/src
$ mv apr-util-1.6.1 /usr/local/src

먼저 apr 부터 컴파일합니다.

$ cd /usr/local/src/apr-1.6.5

$ ./configure --prefix=/usr/local/src/apr-1.6.5

$ make
$ make install

그 다음 apr-util 을 컴파일합니다.

$ cd /usr/local/src/apr-util-1.6.1

$ ./configure --prefix=/usr/local/src/apr-util-1.6.1 --with-apr=/usr/local/src/apr-1.6.5

$ make 
$ make install

마지막으로 httpd 를 컴파일합니다. 명령어가 너무 길어서 보기편하게 나눠놨으니 사용하실 때는 한번에 입력하시면 됩니다.

$ cd /usr/local/src/httpd-2.4.43

#./configure --prefix=/usr/local/apache24 --enable-modules=most --enable-mods-shared=all --enable-so --with-apr=/usr/local/src/apr-1.6.5 --with-apr-util=/usr/local/src/apr-util-1.6.1

./configure 
--prefix=/usr/local/apache24 
--enable-modules=most 
--enable-mods-shared=all 
--enable-so
--with-apr=/usr/local/src/apr-1.6.
--with-apr-util=/usr/local/src/apr-util-1.6.1

$ make 
$ make install

--prefix=/usr/local/apache24 이 경로에 WEB Server 가 설치됩니다. 컴파일이 끝나면 httpd.conf 파일로 들어가 ServerName 의 주석을 해제해줍니다.

$ vi /usr/local/apache24/conf/httpd.conf
<!-- ServerName 127.0.0.1:80 -->
$ /usr/local/apache24/bin/httpd -k start

netstat 명령어를 보면 80 포트가 열린것을 확인할 수 있습니다.

$ ss -nlp | grep tcp
tcp    LISTEN     0      128       *:111                   *:*
tcp    LISTEN     0      128       *:22                    *:*
tcp    LISTEN     0      100    127.0.0.1:25                    *:*
tcp    LISTEN     0      1        [::ffff:127.0.0.1]:8005               [::]:*
tcp    LISTEN     0      128    [::]:111                [::]:*
tcp    LISTEN     0      128    [::]:80                 [::]:*
tcp    LISTEN     0      100    [::]:8080               [::]:*
tcp    LISTEN     0      128    [::]:22                 [::]:*
tcp    LISTEN     0      100       [::1]:25                 [::]:*

정상적으로 설치가 완료되면 http://10.30.30.2/ 접속시 It Works ! 라는 문구가 출력됩니다.

image

마찬가지로 systemd 에서 사용할 수 있게 등록 시켜주겠습니다.

$ vi /etc/systemd/system/httpd.service

httpd.service 파일에 아래 내용을 등록해줍니다.

[Unit]
Description=The Apache HTTP Server
 
[Service]
Type=forking
PIDFile=/usr/local/apache24/logs/httpd.pid
ExecStart=/usr/local/apache24/bin/apachectl start
ExecReload=/usr/local/apache24/bin/apachectl graceful
ExecStop=/usr/local/apache24/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

Install JK Connector

마지막으로 WEB Server 와 WAS 를 연동시켜줄 JK Connector 를 설치하겠습니다. 여러가지 커넥터가 있는데 mod_jk 를 사용하겠습니다.

마찬가지로 apxs 를 미리 설치해주고 경로를 확인해보겠습니다.

apxs 는 Apache 하이퍼텍스트 전송 프로토콜 (HTTP) 서버의 확장모듈을 컴파일하고 설치하는 도구입니다. 이 도구는 여러 소스와 오브젝트파일을 가지고, mod_soLoadModule 지시어로 실행중에 아파치 서버로 읽어들일 수 있는 동적공유객체(DSO)를 만들어줍니다.

$ yum install -y httpd-devel
$ which apxs
/usr/bin/apxs

wget 으로 tomcat-coonect 를 다운로드 받고 압축을 해제시킨다음 컴파일 하겠습니다.

$ wget http://mirror.navercorp.com/apache/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
$ tar xvzpf tomcat-connectors-1.2.48-src.tar.gz
$ cd tomcat-connectors-1.2.48-src/native/
$ which apxs
/bin/apxs
$ ./configure --with-apxs=/usr/bin/apxs
$ make
$ make install

정상적으로 컴파일이 되었다면 mod_jk.so 파일이 위에서 설치한 WEB Server 경로의 modules 에 생깁니다. 하지만 제대로 설치가 되지 않은 경우에는 아래 명령어를 사용하여 직접 옮겨주면 됩니다.

$ cp apache-2.0/mod_jk.so /usr/local/apache24/modules/

Apache - mod_jk - Tomcat 연동하기

WEB Server 에 설정파일을 수정하겠습니다.

$ vi /usr/local/apache24/conf/httpd.conf

httpd.conf 에 아래 내용을 추가해줍니다.

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkShmFile logs/mod_jk.shm
JkMount /* worker1

그리고 workers.properties 파일을 만들어줍니다.

$ vi /usr/local/apache24/conf/workers.properties

workers.properties 에는 아래 내용을 등록합니다.

이는 localhost:8009 주소로 AJP1.3 프로토콜을 이용하여 WEB Server 와 WAS 를 연동하겠다는 의미입니다.

즉, http 80 포트로 접속을 하면 AJP 프로토콜을 이용해서 8009, WAS 8080 포트로 접속됩니다.

worker.list=worker1

worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009

마지막으로 Tomcat 의 server.xml 에서 AJP 프로토콜을 수신할 수 있도록 아래 내용을 추가해줍니다.

$ vi /opt/tomcat/conf/server.xml
<Connector protocol="AJP/1.3"
               address="::1"
               port="8009"
               redirectPort="8443" />

추가로 tomcat 8.5, 9.0 버전은 secretRequired = "false" 을 추가해줘야합니다.

<Connector protocol="AJP/1.3"
               address="::1"
               port="8009"
               redirectPort="8443"
               secretRequired="false"/>

설정이 끝나고 http://10.30.30.2/ 를 접속하면 바로 Tomcat 화면이 뜨면 정상적으로 작동하고 있습니다.

image

다음은 설치한 환경을 바탕으로 Tomcat Multi Instance 를 구성해본 뒤 Load Balance 를 해보겠습니다.

Leave a comment