일상의 정리

CentOS/RHEL 8에 Hadoop 설치하기

Hadoop/설치

Hadoop은 머신 클러스터에서 대규모 데이터 세트를 저장하고 처리하는 데 사용되는 무료 오픈 소스 및 Java 기반 소프트웨어 프레임 워크입니다. HDFS를 사용하여 데이터를 저장하고 MapReduce를 사용하여 이러한 데이터를 처리합니다. 주로 데이터 마이닝 및 머신 러닝에 사용되는 빅 데이터 도구의 생태계입니다. Hadoop Common, HDFS, YARN 및 MapReduce와 같은 네 가지 주요 구성 요소가 있습니다.

RHEL/CentOS 8에 Apache Hadoop을 설치하는 방법을 정리해 봅니다.

1. 서버 기본 설정

각각의 서버에서 공통적으로 해야 하는 설치 및 설정입니다

1.1 고정IP 설정

각각의 서버에 고정IP를 설정해 줍니다. (고정IP는 각각의 서비스 상황에 맞게 IP를 설정합니다. 여기서는 81~84를 부여합니다)

고정IP 설정을 위해 아래 명령으로 파일을 수정합니다:

vi /etc/sysconfig/network-scripts

수정할 내용은 아래와 같습니다:

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"                            <-- dhcp 를 none로 변경
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="enp1s0"
UUID="d5f41bf4-de0a-43b3-b633-7e2ec6212e58"
DEVICE="enp1s0"
ONBOOT="yes"

IPADDR=192.168.122.81                       <-- 여기서 아래 부분 추가 
PREFIX=24
GATEWAY=192.168.122.1
DNS1=192.168.122.1
DNS2=1.1.1.1

파일을 저장한 후 위의 DEVICE 부분의 인터페이스를 재시작 해서 IP를 변경내용을 적용합니다.

ifdown enp1s&& ifup enp1s0

바뀐 IP가 제대로 적용되었는 지 아래 명령으로 확인합니다.

ip addr | grep enp1s0

2.2 hostname 설정

서비스를 구성하는 각각의 서버의 서버명을 설정합니다. (여기서는 4대의 서버로 hadoop01 ~ hadoop04로 설정합니다)

아래 명령으로 각각의 서버명을 설정해 줍니다:

hostnamectl set-hostname hadoop01

hostname 설정이 되었다면 이제 각 서버마다 host명으로 접근이 가능하도록 /etc/hosts 파일에 추가해 줍니다.

다음 명령으로 /etc/hosts 파일을 수정합니다.

vi /etc/hosts

아래와 같이 수정해 줍니다.

127.0.0.1   localhost

192.168.122.81 hadoop01
192.168.122.82 hadoop02
192.168.122.83 hadoop03
192.168.122.84 hadoop04

1.3 Java 설치

Hadoop 은 Java로 작성되었고 최신 버전은 Java11도 지원하지만 아직은 Java 8에서 안정적입니다. 아래와 같이 DNF를 이용해서 OpenJDK 8을 설치합니다:

dnf install java-1.8.0-openjdk.x86_64 ant -y

설치 후 아래 명령으로 제대로 설치 되었는 지를 테스트 합니다:

java -version

다음 출력이 나오면 OK:

openjdk version "1.8.0_262" 
OpenJDK Runtime Environment (build 1.8.0_262-b10) 
OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode)

1.4 Hadoop 사용자 생성

보안을 생각해서 별도의 Hadoop 사용자를 생성합니다.

아래 명령어로 새로운 사용자를 생성합니다:

useradd -m hadoop

다음으로 생성한 사용자의 암호를 설정해 줍니다:

passwd hadoop

아래와 같이 사용자에 대한 암호를 2번 입력합니다:

Changing password for user hadoop. 
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

1.5 Configure SSH Key-based Authentication

패스워드 없이 접속이 가능하도록 ssh 키를 설정합니다.

다음 명령으로 hadoop 유저로 로그인 합니다.

su - hadoop

다음 명령으로 공개키와 개인키를 생성합니다.

ssh-keygen -t rsa

아래와 같이 물어 보게 되는 데 엔터만 치면 됩다.

Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa): 
Created directory '/home/hadoop/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:a/og+N3cNBssyE1ulKK95gys0POOC0dvj+Yh1dfZpf8 hadoop@centos8
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|              .  |
|    .   o o o    |
| . . o S o o     |
| o = + O o   .   |
|o * O = B =   .  |
| + O.O.O + +   . |
|   +=*oB.+  o   E|
+----[SHA256]-----+

생성된 공개키를 로컬의 authorized_keys 에 추가하고 권한을 변경해 줍니다.

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 640 ~/.ssh/authorized_keys

다음 명령으로 패스워드 없이 접속이 되는 지 확인해 봅니다.

ssh localhost

처음 1번은 아래와 같이 호스트를 등록할 거냐고 물어 본니다. yes를 하고 엔터를 누르면 정상적으로 접속됩니다.

The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:0YR1kDGu44AKg43PHn2gEnUzSvRjBBPjAT3Bwrdr3mw.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Sat Feb 1 02:48:55 2020
[hadoop@centos8 ~]$

1.6 Hadoop 설치

다음 명령으로 hadoop 유저로 로그인 합니다.

su - hadoop

아래 명령어로 하둡 최신 버전(여기서는 3.3.0)을 다운 받습니다.

wget http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-3.3.0/hadoop-3.3.0.tar.gz

다운이 완료되면 아래 명령어로 압축을 풀어 줍니다.

tar -xvzf hadoop-3.3.0.tar.gz

아래와 같이 심볼릭 링크를 생성해 줍니다.

ln -s hadoop-3.3.0 hadoop

이제 시스템의 Hadoop 과 Java 환경 변수를 설정해 줍니다.

아래 명령으로 ~/.bashrc 파일을 편집해 줍니다.

vi ~/.bashrc

다음 라인을 추가해 줍니다.

export JAVA_HOME=/usr/lib/jvm/jre-1.8.0/
export HADOOP_HOME=/home/hadoop/hadoop 
export HADOOP_INSTALL=$HADOOP_HOME 
export HADOOP_MAPRED_HOME=$HADOOP_HOME 
export HADOOP_COMMON_HOME=$HADOOP_HOME 
export HADOOP_HDFS_HOME=$HADOOP_HOME 
export HADOOP_YARN_HOME=$HADOOP_HOME 
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native 
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin 
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"

파일을 저장하고 다음 명령으로 스크립트를 실행해 줍니다.

source ~/.bashrc

이번엔 하둡 환경변수 파일을 편집합니다.

vi $HADOOP_HOME/etc/hadoop/hadoop-env.sh

아래와 같이 JAVA_HOME 변수를 찾아 수정해 줍니다.

export JAVA_HOME=/usr/lib/jvm/jre-1.8.0/

저장하고 닫아 줍니다. 이걸로 환경 설정은 끝입니다.

2. Single Node Cluster (유사분산 모드)

2.1 Configure Hadoop

먼저 Hadoop 홈 디렉토리 아래 namenode and datanode 디렉토리를 생성해야 합니다.

아래 명령으로 2개의 디렉토리를 생성해 줍니다:

mkdir -p ~/hadoopdata/hdfs/namenode 
mkdir -p ~/hadoopdata/hdfs/datanode

다음은 core-site.xml 파일에서 시스템 호스트명을 설정해 줍니다.:

vi $HADOOP_HOME/etc/hadoop/core-site.xml

아래와 같이 자신의 시스템 호스트명을 설정해 줍니다.

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop01:9000</value>
        </property>
</configuration>

파일을 저장 후 hdfs-site.xml 파일을 수정합니다:

vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

아래 처럼 NameNode 와 DataNode 디렉토리를 설정해 줍니다:

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>1</value>
        </property>
        <property>
                <name>dfs.name.dir</name>
                <value>file:///home/hadoop/hadoopdata/hdfs/namenode</value>
        </property>
        <property>
                <name>dfs.data.dir</name>
                <value>file:///home/hadoop/hadoopdata/hdfs/datanode</value>
        </property>
</configuration>

파일을 저장합니다. mapred-site.xml 파일을 수정합니다:

vi $HADOOP_HOME/etc/hadoop/mapred-site.xml

아래처럼 수정합니다:

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>yarn.app.mapreduce.am.env</name>
                <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        </property>
        <property>
                <name>mapreduce.map.env</name>
                <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        </property>
        <property>
                <name>mapreduce.reduce.env</name>
                <value>HADOOP_MAPRED_HOME=$HADOOP_HOME</value>
        </property>
</configuration>

파일을 저장하고, 이번에는 yarn-site.xml 파일을 수정합니다:

vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

다음과 같이 변경합니다:

<configuration>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>
</configuration>

저장하면 이제 다 되었습니다.

2.2 Start Hadoop Cluster

Hadoop 클러스터를 시작하기 전에 먼저 hadoop 사용자로 Namenode를 포맷해야 합니다.

Namenode를 포맷하기 위해 아래 명령어를 실행합니다:

hdfs namenode -format

아래 내용이 표시되면 성공입니다:

2020-02-05 03:10:40,380 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0 
2020-02-05 03:10:40,389 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid=0 when meet shutdown. 
2020-02-05 03:10:40,389 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************ 
SHUTDOWN_MSG: Shutting down NameNode at hadoop.tecadmin.com/45.58.38.202
************************************************************/

Namenode 포맷 후에, 아래 명령으로 hadoop 클러스트를 시작합니다:

start-dfs.sh

HDFS 성공적으로 시작되면, 아래와 같은 내용이 표시됩니다:

Starting namenodes on [hadoop.tecadmin.com] 
hadoop.tecadmin.com: Warning: Permanently added 'hadoop.tecadmin.com,fe80::200:2dff:fe3a:26ca%eth0' (ECDSA) to the list of known hosts. 
Starting datanodes 
Starting secondary namenodes [hadoop.tecadmin.com]

다음으로 YARN 서비스를 시작합니다:

start-yarn.sh

아래와 같은 메시지가 출력됩니다:

Starting resourcemanager 
Starting nodemanagers

2.2 상태 및 동작 확인

jps 명령으로 Hadoop 서비스의 상태를 체크해 볼 수 있습니다:

jps

다음과 같이 실행중인 서비스가 표시됩니다:

7987 DataNode 
9606 Jps
8183 SecondaryNameNode
8570 NodeManager
8445 ResourceManager 
7870 NameNode

아래 명령을 실행해서 잘 동작하는 지 확인해 봅니다:

cd $HADOOP_HOME
yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar pi 16 1000

정상적으로 실행되었다면 아래와 같이 표시 됩니다.

Job Finished in 36.294 seconds
Estimated value of Pi is 3.14250000000000000000

2.3 Configure Firewall

Hadoop은 포트 9870 과 8088을 사용하므로 이 포트들을 방화벽에서 허용해 주어야 합니다.

아래 명령으로 방화벽에서 허용해 줍니다:

firewall-cmd --permanent --add-port=9870/tcp
firewall-cmd --permanent --add-port=8088/tcp

그리고 방화벽 규칙을 다시 로드해서 적용해 줍니다:

firewall-cmd --reload

2.4 Access Hadoop Namenode and Resource Manager

웹브라우저를 열어 http://your-server-ip:9870 으로 Namenode에 접속합니다. 그럼 아래와 같은 화면이 표시됩니다:

리소스 관리자에 접근하려면 http://your-server-ip:8088 로 접속합니다. 아래 화면이 표시됩니다:

2.5 Verify the Hadoop Cluster

Hadoop cluster 에 대한 설치 및 설정은 완료되었습니다. 이제 Hadoop을 테스트 하기 위해 HDFS 에 일부 디렉토리를 생성합니다.

다음 명령으로 테스트 디렉토리를 생성합니다:

hdfs dfs -mkdir /test1
hdfs dfs -mkdir /test2

그리고 아래 명령으로 위 디렉토리를 표시합니다:

hdfs dfs -ls /

다음과 같이 표시됩니다:

Found 2 items 
drwxr-xr-x - hadoop supergroup 0 2020-02-05 03:25 /test1 
drwxr-xr-x - hadoop supergroup 0 2020-02-05 03:35 /test2

웹의 Hadoop Namenode에서도 위 디렉토리가 표시되어야 합니다.

Namenode 웹페이지에서, Utilities => Browse the file system 을 클릭합니다. 아래와 같이 디렉토리가 표시되는 것을 확인할 수 있습니다:

2.6 분석 프로그램 실행

테스트를 위해 단어개수를 분석하는 예제를 실행합니다. 맵리듀스 job을 실행하기 위해서 HDFS 디렉토리를 생성합니다.

hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/root
hdfs dfs -mkdir /user/root/conf
hdfs dfs -mkdir /input
hdfs dfs -copyFromLocal $HADOOP_HOME/README.txt /input
hdfs dfs -ls /input

다음 명령으로 단어 개수를 분석하는 프로그램을 실행합니다:

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.0.jar wordcount /input/README.txt ~/wordcount-output

실행이 완료되면 아래 명령으로 결과를 확인합니다:

hdfs dfs -ls ~/wordcount-output
Found 2 items
-rw-r--r--   1 hadoop supergroup          0 2020-09-03 03:43 /home/hadoop/wordcount-output/_SUCCESS
-rw-r--r--   1 hadoop supergroup        188 2020-09-03 03:43 /home/hadoop/wordcount-output/part-r-00000

hdfs dfs -cat ~/wordcount-output/part-r-00000

다음과 같이 표시됩니다:

For     1
Hadoop, 1
about   1
and     1
at:     2
http://hadoop.apache.org/       1
https://cwiki.apache.org/confluence/display/HADOOP/     1
information     1
latest  1
our     2
please  1
the     1
visit   1
website 1
wiki,   1

2.7 Stop Hadoop Cluster

Hadoop Namenode 와 Yarn 서비스는 stop-dfs.sh  stop-yarn.sh 명령으로 중지할 수 있습니다.

아래 명령으로 Hadoop Namenode 서비스를 중지합니다:

stop-dfs.sh

아래 명령으로 Hadoop Resource Manager  서비스를 중지합니다:

stop-yarn.sh

3. Multi Node Cluster (완전 분산 모드)

지금까지의 작업으로 Single Node Cluster 로 동작하는 Hadoop 설치는 완료되었습니다. 이제는 여러대의 노드로 구성된 Hadoop 설정을 하도록 하겠습니다.

3.1 ssh 공개키 설정

아래 명령으로 master(hadoop01)의 공개키를 모든 datanode로 복사합니다:

scp -rp ~/.ssh/authorized_keys hadoop@hadoop02:~/.ssh/authorized_keys
scp -rp ~/.ssh/authorized_keys hadoop@hadoop03:~/.ssh/authorized_keys
scp -rp ~/.ssh/authorized_keys hadoop@hadoop04:~/.ssh/authorized_keys

3.2 하둡 설정

3.2.1 master (마스터 노드) 설정

master 노드에서 hdfs-site.xml 파일을 수정합니다.

vi $HADOOP_HOME/etc/hadoop/hdfs-site.xml

아래의 내용을 설정합니다.

<configuration>
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>/home/hadoop/hadoopdata/hdfs/namenode</value>
                <final>true</final>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>/home/hadoop/hadoopdata/hdfs/datanode</value>
                <final>true</final>
        </property>
</configuration>

master 노드에서 yarn-site.xml 파일을 수정합니다.

vi $HADOOP_HOME/etc/hadoop/yarn-site.xml

아래의 내용을 설정합니다.

<configuration>

<!-- Site specific YARN configuration properties -->
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop01</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.nodemanager.vmem-check-enabled</name>
                <value>false</value>
        </property>
        <property>
                <name>yarn.resourcemanager.address</name>
                <value>hadoop01:8032</value>
        </property>
        <property>
                <name>yarn.resourcemanager.scheduler.address</name>
                <value>hadoop01:8030</value>
        </property>
        <property>
                <name>yarn.resourcemanager.resource-tracker.address</name>
                <value>hadoop01:8031</value>
        </property>

</configuration>

아래 명령으로 workers 파일을 수정합니다.

vi $HADOOP_HOME/etc/hadoop/workers

아래와 같이 설정해 줍니다.

hadoop02
hadoop03
hadoop04

3.2.1 slaves (슬레이브 노드) 설정

Master 설정 파일을 모두 슬레이브로 복사해 주어야 합니다.

아래 명령으로 복사해 줍니다.

scp $HADOOP_HOME/etc/hadoop/* hadoop02:$HADOOP_HOME/etc/hadoop/
scp $HADOOP_HOME/etc/hadoop/* hadoop03:$HADOOP_HOME/etc/hadoop/
scp $HADOOP_HOME/etc/hadoop/* hadoop04:$HADOOP_HOME/etc/hadoop/

아래 명령으로 기존 HDFS 저장소를 제거해 줍니다.

rm -rf ~/hadoopdata/hdfs/*

3.3 방화벽 설정

Hadoop 은 내부적으로 랜덤하게 포트를 오픈하고 사용하므로, 다음 명령으로 같은 IP 대역에 대해 방화벽을 오픈해 줍니다. (Master/Slave 모두)

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address=192.168.122.0/24 port port="80-65535" protocol="tcp" accept'

다음 명령으로 방화벽을 다시 로드합니다.

firewall-cmd --reload

3.4 동작

다음 명령으로 마스터 노드에서 Hadoop을 실행합니다.

start-dfs.sh

정상적으로 실행되면 jps 명령으로 프로세스를 확인합니다. 정상이라면 아래와 같이 표시됩니다.

[hadoop@hadoop01 ~]$ jps
43112 SecondaryNameNode
43241 Jps
42876 NameNode

각가의 Slave에서도 jps 명령으로 프로세스를 확인합니다. 정상이라면 아래와 같이 표시됩니다.

[hadoop@hadoop02 ~]$ jps
36262 Jps
36207 DataNode

3.5 Multi Node 확인

웹브라우저에서 data node를 확인합니다. 아래처럼 3개가 표시되면 정상입니다.

 

Ubuntu 16.04.1 MariaDB + Tomcat 9 + Apache 2.4 + PHP 7.1 설치

리눅스/설치

1. MariaDB 설치

공식 미러를 통한 Maria DB 설치

아래 명령을 실행하여 공식 Repository로 부터 Maria DB를 설치한다.

# apt install software-properties-common
# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
# add-apt-repository 'deb [arch=amd64,i386] http://ftp.kaist.ac.kr/mariadb/repo/10.2/ubuntu xenial main'

키를 가져오고 저장소가 추가되었으면, 다음 명령으로 Maria DB를 설치한다.

# apt update

# apt install mariadb-server

Maria DB 보안 설정

설치 후 DB접속 전에 Maria DB의 보안을 설정한다. (익명 사용자 및 Test DB 제거)

# mysql_secure_installation

Maria DB 연결

Maria DB 인스턴스에 접속한다.

# mysql -u root -p

로컬 사용자 추가

mysql> create user 'user'@'localhost' identified by 'password';

로컬 및 원격 사용자 추가

mysql> create user 'user'@'%' identified by 'password';

DB권한 설정

    grant all privileges on [DB_NAME].* to 'user'@'%'; //특정 DB

    grant all privileges on *.* to 'user'@'%'; //모든 DB

    flush privileges;

Character set UTF-8설정

다음 내용을 /etc/mysql/my.cnf 에 추가한다.

[client]

default-character-set=utf8

[mysqld]

init_connect='SET collation_connection = utf8_unicode_ci'

init_connect='SET NAMES utf8'

character-set-server=utf8

collation-server=utf8_unicode_ci

Maria DB restart

# service mariadb restart


2. Tomcat 9 설치

관련 파일 다운로드

다음 파일을 다운로드 한다.

Tomcat 9.0 : http://tomcat.apache.org/download-90.cgi

Tomcat Native: http://tomcat.apache.org/download-native.cgi

Tomcat Connector : http://tomcat.apache.org/download-connectors.cgi

apr: http://apache.mirror.cdnetworks.com/apr/apr-1.6.2.tar.gz

사용자 추가

Tomcat 구동 사용자를 추가한다.

# useradd -s /bin/false -d /usr/local/tomcat tomcat

의존성 파일 설치

설치를 위해 아래 파일을 먼저 설치한다.

# apt install libssl-dev libexpat1-dev

APR 설치

# tar zxvf apr-1.6.2.tar.gz

# cd apr-1.6.2

# ./configure --prefix=/usr/local/apr

#make && make install


만약 cannot remove 'libtoolT': No such file or directory 에러 발생 시 아래 명령 후 다시 실행

cp -arp libtool libtoolT

JDK 설치

오라클 공식 Repository를 통해 JDK 를 설치한다.

# add-apt-repository ppa:webupd8team/java

# apt update

# apt install oracle-java9-installer

Tomcat 9.0 설치

tar xvzf apache-tomcat-9.0.0.M26.tar.gz

mv apache-tomcat-9.0.0.M26 /usr/local/

ln -s /usr/local/apache-tomcat-9.0.0.M26/ /usr/local/tomcat

Tomcat 사용자 권한 설정

chown -R tomcat:tomcat /usr/local/tomcat/

chmod -R g+r /usr/local/tomcat/conf

chmod g+x /usr/local/tomcat/conf

JAVA_HOME 확인

Tomcat Native 컴파일 시 JAVA_HOME을 지정해 주어야 한다. 다음 명령으로 확인한다.

update-java-alternatives -l

Tomcat Native 설치

tar xvzf tomcat-native-1.2.14-src.tar.gz

cd tomcat-native-1.2.14-src/native

./configure --with-apr=/usr/local/apr --with-java-home=/usr/lib/jvm/java-9-oracle

make && make install

환경파일 구성

/etc/profile 파일의 마지막에 다음 행 추가

export LD_LIBRARAY_PATH=/usr/local/apr/lib

export TOMCAT_HOME=/usr/local/tomcat

export PATH=$TOMCAT_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib

설치내용 확인

# source /etc/profile
# java -version
************* 다음 내용이 출력되면 성공 ***************************
java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
**********************************************************************

방화벽 포트 오픈

다음 명령으로 방화벽에서 8080 포트를 열어 준다.

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
# iptables-save > /etc/iptables.rules
/etc/network/interfaces 파일에 아래 라인 추가
pre-up iptables-restore < /etc/iptables.rules

Tomcat 시작

# /usr/local/tomcat/bin/startup.sh

Tomcat 동작 확인

웹브라우저에서 서버의 IP와 포트를 입력하여 접속되는 지 확인

http://server-ip:8080/

구동파일 생성

다음 명령으로 tomcat Service 파일 생성

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

/etc/systemd/system/tomcat.service

[Unit]
Description=Apache Tomcat Web Application Container
After=network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/java-9-oracle
Environment=CATALINA_PID=/usr/local/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/usr/local/tomcat
Environment=CATALINA_BASE=/usr/local/tomcat
Environment='CATALINA_OPTS=-Xms1024M -Xmx4096M -server -XX:+UseParallelGC'
Environment='JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'

ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target
구동파일 권한 설정
# chmod 755 /etc/systemd/system/tomcat.service
서비스 파일 reload
# systemctl daemon-reload

Tomcat 서비스 시작/종료

시작

# systemctl start tomcat

종료

# systemctl stop tomcat

부팅 시 Tomcat 서비스 시작

# systemctl enable tomcat

3. Apache 설치

관련 파일 다운로드

다음 파일을 다운로드 한다.
apr-iconv: http://apache.mirror.cdnetworks.com/apr/apr-iconv-1.2.1.tar.gz
apr-util: http://apache.mirror.cdnetworks.com/apr/apr-util-1.6.0.tar.gz
apache: http://apache.mirror.cdnetworks.com/httpd/httpd-2.4.27.tar.gz
pcre: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz

apr-iconv 설치

# tar zxvf apr-iconv-1.2.1.tar.gz

# cd apr-iconv-1.2.1

# ./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr

# make && make install

apr-util 설치

# tar zxvf apr-util-1.6.0.tar.gz
# cd apr-util-1.6.0
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv
# make && make install

pcre 설치

# tar zxvf pcre-8.41.tar.gz
# cd pcre-8.41/
# ./configure --libdir=/usr/local/lib
# make && make install

사용자 추가

apache 구동 사용자를 추가한다.

# useradd -s /bin/false -d /usr/local/apache apache

Apache 설치

# tar xvzf httpd-2.4.27.tgz
# cd httpd-2.4.27
# ./configure --prefix=/usr/local/apache \
--enable-authn-alias \
--enable-cache \
--enable-file-cache \
--enable-mem-cache \
--enable-disk-cache \
--enable-mods-shared=most \
--enable-proxy=shared \
--enable-proxy-ajp=shared \
--enable-proxy-ajp=shared \
--enable-dav=shared \
--with-apr=/usr/local/apr/ \
--with-apr-util=/usr/local/apr-util/ \
--enable-ssl \
--enable-dav \
--enable-cgi \
--with-mpm=event \
--enable-cgid \
--enable-vhost-alias \
--enable-rewrite \
--enable-forward=shared \
--enable-proxy-connect=shared \
--enable-proxy-http=shared \
--enable-deflate=shared \
--enable-so \
--enable-headers=shared \
--enable-include=shared \
--enable-rewrite=shared
# make&&make install
make 도중 undefined reference to `XML_GetErrorCode' 에러 발생 시
vi build/config_vars.mk 파일 수정해서
AP_LIBS = 시작하는 라인을 찾아
-lexpat를 추가 후 다시 make

Apache 구동 사용자 설정

vi /usr/local/apache/conf/httpd.conf 로 아래처럼 사용자 수정

User apache
Group apache

Apache 시작

아래 명령으로 아파치 시작

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

Apache 테스트

브라우저에서 서버에 접속 후 It works! 페이지가 표시 되는 지 확인

http://server-ip

구동 파일 설정

서버 실행 시 아파치 자동 실행을 위해 구동 파일을 설정한다.

vi /etc/systemd/system/httpd.service

[Unit]
Description=Apache Web Server
After=network.target

[Service]
Type=forking
#PIDFile=/run/httpd/httpd.pid
Environment=HTTPD_PID=/usr/local/apache/logs/httpd.pid
EnvironmentFile=/usr/local/apache/bin/envvars
ExecStart=/usr/local/apache/bin/apachectl -k start
ExecStop=/usr/local/apache/bin/apachectl -k graceful-stop
ExecReload=/usr/local/apache/bin/apachectl -k graceful
KillSignal=SIGCONT
PrivateTmp=true
LimitNOFILE=infinity
User=apache
Group=apache

[Install]
WantedBy=multi-user.target

구동파일 권한 설정

# chmod 755 /etc/systemd/system/httpd.service
서비스 파일 reload
# systemctl daemon-reload

실행파일 권한 설정

# chown -R apache:apache /usr/local/apache/bin/apachectl
# chown -R root:root /usr/local/apache/bin/httpd
# chmod +s /usr/local/apache/bin/httpd

Apache 서비스 시작/종료

시작

# systemctl start httpd

종료

# systemctl stop httpd

부팅 시 Apache 서비스 시작

# systemctl enable httpd

 4. PHP 설치

관련 파일 다운로드

php7을 다운로드 한다.

http://php.net/downloads.php

의존성 패키지 설치

php에서 사용할 의존성 패키지를 설치한다.

apt install libxml2-dev libbz2-dev libcurl4-openssl-dev libldap2-dev libmysqlclient-dev pkg-config libssl-dev libsslcommon2-dev libjpeg-dev libpng-dev libfreetype6-dev libldb-dev libsasl2-dev

의존성 링크 설정

php에서 라이브러리 의존성을 위해 링크를 설정한다.

ln -s /usr/lib/x86_64-linux-gnu/libldap.so /usr/lib/libldap.so
ln -s /usr/lib/x86_64-linux-gnu/liblber.so /usr/lib/liblber.so
ln -s /usr/lib/x86_64-linux-gnu/libmysqlclient.so /usr/lib/x86_64-linux-gnu/libmysqlclient_r.so

libmcrypt 설치

PHP에서 암호화 해독 알고리즘인 mcrypt를 사용하기 위해서 설치해야 한다.

tar xvzf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure --prefix=/usr/local --libdir=/usr/local/lib
make && make install
/sbin/ldconfig

cd libltdl/
./configure --enable-ltdl-install --libdir=/usr/local/lib
make && make install
cd ../../

mhash 설치

hash 암호화 알고리즘.

tar xvzf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9
./configure --prefix=/usr/local --libdir=/usr/local/lib
make && make install

mcrypt 설치

암호화 해독 알고리즘.

tar xvzf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8/
/sbin/ldconfig
./configure --prefix=/usr/local --libdir=/usr/local/lib
make && make install

php 설치

php 를 설치한다.

tar xvzf php-7.1.10.tar.gz
cd php-7.1.10
./configure --prefix=/usr/local/php \
--with-libdir=lib \
--with-config-file-path=/usr/local/php/etc \
--with-mysqli=/usr/bin/mysql_config \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-pear=/usr/share/php \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--disable-rpath \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-inline-optimization \
--enable-maintainer-zts \
--enable-opcache \
--with-curl \
--with-iconv=/usr/local \
--enable-mbregex \
--enable-fpm \
--enable-mbstring \
--with-mcrypt \
--with-gd \
--enable-gd-native-ttf \
--with-openssl \
--with-mhash \
--enable-pcntl \
--enable-sockets \
--with-ldap \
--with-ldap-sasl \
--with-xmlrpc \
--enable-zip \
--enable-soap \
--with-bz2 \
--enable-static \
--enable-intl \
--enable-exif \
--with-pdo-mysql=/usr \
--with-gettext
make && make install
make 도중 umachine.h:340:13: error: ‘char16_t’ does not name a type 에러 발생 시 Makefile 을 열어서 CXXFLAGS_CLEAN 항목에  -std=c++0x 구문을 추가 후 make

php.ini 생성

아래 명령으로 Php.ini 생성.

cp -f php.ini-production /usr/local/php/etc/php.ini

opcache 활성화

/usr/local/php/etc/php.ini 의 opcache 부분을 아래와 같이 변경.

[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
/usr/local/php/etc/php.ini 의 맨 끝에 아래와 같이 추가.
zend_extension=/usr/local/php/lib/php/extensions/no-debug-zts-20160303/opcache.so

5. PHP 확장모듈 설치

관련 파일 다운로드

ImageMagick 관련파일을 다운로드 한다.

https://www.imagemagick.org/download
http://pecl.php.net/package/imagick

의존성 패키지 설치

apt install autoconf libgtk2.0-dev

ImageMagicK 설치

ImageMagick은 TIFF, JPEG, GIF, PNG, PDF 및 기타 포토 CD 등 89가지 이상의 이미지의 읽기, 쓰기 및 처리하는 데 사용할 수 있는 개발 도구입니다.

# tar xvJf ImageMagick-7.0.7-4.tar.xz
# cd ImageMagick-7.0.7-4/
# ./configure --libdir=/usr/local/lib
# make && make install
# cd ..

imagick 설치

# tar xvzf imagick-3.4.3.tgz
# cd imagick-3.4.3
# /usr/local/php/bin/phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config
# make && make install
/usr/local/php/etc/php.ini 에 아래 라인 추가
extension=/usr/local/php/lib/php/extensions/no-debug-zts-20160303/imagick.so

php library 추가

# echo "/usr/local/php/lib" > /etc/ld.so.conf.d/php.conf
# ldconfig

php-cgi 프로세스 시작

# cd /usr/local/php/etc
# cp php-fpm.conf.default php-fpm.conf
# cp php-fpm.d/www.conf.default php-fpm.d/www.conf

www.conf 의 User와 Group 을 nobody --> apache 로 변경 후 php-fpm 실행
# /usr/local/php/sbin/php-fpm

Apache 에서 php 지원 추가

/usr/local/apache/conf/httpd.conf 파일을 열어서 php를 검색 후 아래 라인을 추가

AddType application/x-httpd-php .php .php3 .inc
AddType application/x-httpd-php-source .phps

Apache 재시작

service httpd restart

PHP 동작 테스트

# echo "<?php phpinfo(); ?>" > /usr/local/apache/htdocs/phptest.php

한 후 웹 브라우저에서 http://server-ip/phptest.php
해서 결과가 정상적으로 나오는 지 확인

6. Apache 와 Tomcat 통합

mod_jk 생성

tar xvzf  tomcat-connectors-1.2.42-src.tar.gz
cd tomcat-connectors-1.2.42-src/
cd native
./configure --with-apxs=/usr/local/apache/bin/apxs
make
cp ./apache-2.0/mod_jk.so /usr/local/apache/modules/

설정 파일 복사

cd ../conf
cp httpd-jk.conf /usr/local/apache/conf/mod_jk.conf
cp workers.properties /usr/local/apache/conf/

mod_jk.conf 설정

/usr/local/apache/conf/mod_jk.conf 파일에 아래 내용 추가

JkWorkersFile /usr/local/apache/conf/workers.properties
JkLogFile /usr/local/apache/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"

JkMount /servlet/* worker1
JkMount /*.jsp         worker1
JkMount /application/* worker1
JkMount /*.do          worker1
JkMount /*.class       worker1
JkMount /*.jar         worker1

설정 파일 해석

1. JkMount 위치는 Tomcat이 해석을 담당, JkUnMount는 반대임
2.  JkMount /test/* worker1 의 의미는 test 디렉토리 아래는 Tomcat이 처리를 담당
3. jsp와servlet은 tomcat이 처리, 그 외 그림이나 정적 파일은 Apache가 처리

Tomcat 프로퍼티 설정

/usr/local/apache/conf/workers.properties 에 다음 내용 추가

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=127.0.0.1
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300

Apache 설정파일 수정

/usr/local/apache/conf/httpd.conf 에 다음 내용 추가

Include /usr/local/apache/conf/mod_jk.conf

Tomcat 설정변경

/usr/local/tomcat/conf/server.xml에 다음 내용 수정 (docbase 경로는 원하는 위치로 변경)

<Host 를 찾음
(다음과 같음:  <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">)

다음 줄에 다음 내용을 추가:
<Context path="" docBase="/usr/local/tomcat/webapps"
 debug="0" reloadable="true" crossContext="true"/>

Apache / Tomcat 재시작

service httpd start
service tomcat restart

성공여부 확인

다음 명령으로 실행 여부 확인 해서 아래 메시지가 나오면 성공

# tail -f /usr/local/apache/logs/mod_jk.log
[Sun Oct 01 11:10:43 2017][22961:139625235212032] [info] init_jk::mod_jk.c (3595): mod_jk/1.2.42 initialized

연동 테스트

/usr/local/tomcat/webapps/test.jsp 파일에 다음 내용 추가 후

웹 브라우저에서 http://server-ip/test.jsp 해서 Hello World! 가 출력되면 성공

<html>
<h1>JSP test<hr>
<%out.println("Hello World!");%>
</html>

Tomcat port 차단

Apache를 통해 접속하므로 Tomcat 으로 직접 연결은 차단

/etc/iptables.rules 에서 8080 접속 관련 라인 삭제하고 아래 처럼 생성

*filter
:INPUT ACCEPT [377:27429]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [231:101581]
-A INPUT -i enp0s3 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i enp0s3 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i enp0s3 -j DROP
COMMIT

iptables rule reload

# iptables-restore < /etc/iptables.rules