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

Updated:

Wildfly Standalone 방식으로 설정하겠습니다.

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

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

Version

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

  • Vagrant : 2.2.6
  • Java : openjdk-1.8.0
  • Apache Wildfly : 19.0.2
  • 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]
$ yum install -y wget

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

만약 $JAVA_HOME 변수가 않으면 직접 등록하셔야 합니다.

Install Wildfly

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

$ yum install -y wget

Wildfly 최신 버전을 다운로드 한 뒤 압축을 풀고난 후 /opt 경로에다가 옮겨두겠습니다.

$ wget https://download.jboss.org/wildfly/19.0.0.Final/wildfly-19.0.0.Final.tar.gz
$ tar xvzpf wildfly-19.0.0.Final.tar.gz
$ mv wildfly-19.0.0.Final /opt/
$ mv wildfly-19.0.0.Final/ wildfly

옮기고 난 후 Mangement 계정을 만들겠습니다. 이는 Wildfly 관리 페이지에 접근할 때 사용됩니다.

$ /opt/wildfly/bin/add-user.sh

What type of user do you wish to add?
 a) Management User (mgmt-users.properties)
 b) Application User (application-users.properties)
(a): a

Enter the details of the new user to add.
Using realm 'ApplicationRealm' as discovered from the existing property files.
Username : root
Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file.
 - The password should be different from the username
 - The password should not be one of the following restricted values {root, admin, administrator}
 - The password should contain at least 8 characters, 1 alphabetic character(s), 1 digit(s), 1 non-alphanumeric symbol(s)
Password :
WFLYDM0098: The password should be different from the username
Are you sure you want to use the password entered yes/no? yes
Re-enter Password :
What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[  ]:
About to add user 'root' for realm 'ApplicationRealm'
Is this correct yes/no? yes
Added user 'root' to file '/opt/wildfly/standalone/configuration/application-users.properties'
Added user 'root' to file '/opt/wildfly/domain/configuration/application-users.properties'
Added user 'root' with groups  to file '/opt/wildfly/standalone/configuration/application-roles.properties'
Added user 'root' with groups  to file '/opt/wildfly/domain/configuration/application-roles.properties'
Is this new user going to be used for one AS process to connect to another AS process?
e.g. for a root host controller connecting to the master or for a Remoting connection for server to server EJB calls.
yes/no? yes
To represent the user add the following to the server-identities definition <secret value="c2xhdmU=" />

id 와 password 모두 root 로 했습니다.

다음으로 standalone.xml 를 수정하겠습니다. 현재 자기 자신의 접속만 허용이 되어 있는데 이를 모든 IP 에서 허용할 수 있게 만들어 주겠습니다.

$ vi /opt/wildfly/standalone/configuration/standalone.xml
<interfaces>
        <interface name="management">
                <any-address/>
<!--            <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>-->
        </interface>
        <interface name="public">
                <any-address/>
<!--            <inet-address value="${jboss.bind.address:127.0.0.1}"/>-->
        </interface>
    </interfaces>

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

$ vi /etc/systemd/system/wildfly.service
[Unit]
Description=WildFly Server
After=httpd.service
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/opt/wildfly/bin/standalone.sh

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

$ systemctl daemon-reload
$ systemctl start wildfly

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

$ 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      100    [::]:9990               [::]:*
tcp    LISTEN     0      128    [::]:22                 [::]:*
tcp    LISTEN     0      100       [::1]:25                 [::]:*

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

image

http://10.30.30.2:9990/ 도 접속해 보겠습니다. 사용자 계정과 비밀번호를 요구할 수 있는데 이전에 생성했던 root / root 를 입력하면 접속할 수 있습니다. wildfly 9990 포트는 WAS 관리를 위한 URL 입니다.

image

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

$ systemctl stop wildfly

만약 접속이 안된다면 방화벽을 확인하면 됩니다. 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, 9990 포트를 열어보겠습니다.

$ firewall-cmd --permanent --zone=public --add-port=8080/tcp
success
$ firewall-cmd --permanent --zone=public --add-port=9990/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 9990/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

8080, 9990 포트가 열린것을 볼 수 있습니다. 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 9990/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Install Apache Web Server

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

yum 을 이용하여 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을 이용하여 설치하는 자료들의 경로는 변경될 수 있는 사항이니 참고 부탁드립니다.

$ 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.5
--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      100    [::]:9990               [::]:*
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 파일에 아래 내용을 등록해줍니다. 참고로 apache 설치는 뒷부분에서 설명하겠습니다.

[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 Tomcat 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 - Wildfly 연동하기

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=127.0.0.1
worker.worker1.port=8009

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

$ vi /opt/wildfly/standalone/configuration/standalone.xml
                <server name="default-server">
                        <ajp-listener name="ajp" socket-binding="ajp"/> <!-- 추가 -->
                        <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
                        <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/>
                        <host name="default-host" alias="localhost">
                                <location name="/" handler="welcome-content"/>
                                <http-invoker security-realm="ApplicationRealm"/>
                        </host>
                </server>
                <servlet-container name="default">
                        <jsp-config/>
                        <websockets/>
                </servlet-container>
                <handlers>
                        <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
                </handlers>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:webservices:2.0" statistics-enabled="${wildfly.webservices.statistics-enabled:${wildfly.statistics-enabled:false}}">
            <wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host>
            <endpoint-config name="Standard-Endpoint-Config"/>
            <endpoint-config name="Recording-Endpoint-Config">
                <pre-handler-chain name="recording-handlers" protocol-bindings="##SOAP11_HTTP ##SOAP11_HTTP_MTOM ##SOAP12_HTTP ##SOAP12_HTTP_MTOM">
                    <handler name="RecordingHandler" class="org.jboss.ws.common.invocation.RecordingServerHandler"/>
                </pre-handler-chain>
            </endpoint-config>
            <client-config name="Standard-Client-Config"/>
        </subsystem>
        <subsystem xmlns="urn:jboss:domain:weld:4.0"/>
    </profile>
    <interfaces>
        <interface name="management">
            <any-address/>
        </interface>
        <interface name="public">
            <any-address/>
        </interface>
    </interfaces>
    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
        <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/> <!-- 추가 -->
        <socket-binding name="http" port="${jboss.http.port:8080}"/>
        <socket-binding name="https" port="${jboss.https.port:8443}"/>
        <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>
        <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>
        <socket-binding name="txn-recovery-environment" port="4712"/>
        <socket-binding name="txn-status-manager" port="4713"/>
        <outbound-socket-binding name="mail-smtp">
            <remote-destination host="localhost" port="25"/>
        </outbound-socket-binding>
    </socket-binding-group>
</server>

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

image

Leave a comment