일상의 정리

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