[Rocky] 16. WEB(Apache) + WAS(Tomcat) + DB(MariaDB)
카테고리: ROCKY
01) WEB 구성요소

| 구성요소 | 설명 |
|---|---|
| WEB 서버 | 정적인 컨텐츠(문자, 그림, 오디오, 비디오 등)를 처리하는 서버 |
| WAS 서버 | 동적인 컨텐츠(사용자의 입력 값을 기반으로 프로그램의 동작이 달라 짐)를 처리하는 서버 |
| DB 서버 | 데이터베이스를 생성, 관리, 사용, 제어하는 서버 |
02) 서버 정보

03) 서버 구성
a) WAS Server - JAVA, Tomcat install
# /etc/hosts에 서버 IP 주소 정보 추가
$ cat <<EOF >> /etc/hosts
192.168.219.100 web
192.168.219.111 was01
192.168.219.200 db
EOF
# JAVA install - https://jdk.java.net/
$ yum -y install wget
$ {
wget https://download.java.net/openjdk/jdk8u43/ri/openjdk-8u43-linux-x64.tar.gz
tar xvzf openjdk-8u43-linux-x64.tar.gz
mkdir /usr/local/jvm
mv java-se-8u43-ri /usr/local/jvm/
}
$ cat <<EOF >> /etc/profile
JAVA_HOME=/usr/local/jvm/java-se-8u43-ri/
export JAVA_HOME
PATH=\$PATH:\$JAVA_HOME/bin
export PATH
EOF
$ source /etc/profile
# 확인
$ java -version
# Tomcat install - https://tomcat.apache.org/
$ {
wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.74/bin/apache-tomcat-9.0.74.tar.gz
tar xvzf apache-tomcat-9.0.74.tar.gz
mv apache-tomcat-9.0.74 /usr/local/tomcat9
}
$ cat <<EOF > /usr/lib/systemd/system/tomcat.service
[Unit]
Description=tomcat9
After=network.target syslog.target
[Service]
Type=forking
Environment=JAVA_HOME=/usr/local/jvm/java-se-8u43-ri/
User=root
Group=root
ExecStart=/usr/local/tomcat9/bin/startup.sh
ExecStop=/usr/local/tomcat9/bin/shutdown.sh
UMask=0007
RestartSec=10
Restart=always
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
EOF
# SELinux는 ExecStart에서 사용할 수 있는 바이너리를 system_u:object_r:bin_t:s0 속성이 설정된 경로(/usr/bin, /usr/sbin, /usr/libexec, /usr/local/bin)로 제한한다.
# 이 디렉토리 중 하나로 스크립트를 이동하거나 systemd가 원하는 바이너리를 사용하려면 selinux 정책을 변경해야 한다. (SELinux 비활성화하면 편함...)
# 참고 - https://serverfault.com/questions/1032597/selinux-is-preventing-from-execute-access-on-the-file-centos
$ chcon -R -t bin_t /usr/local/tomcat9/bin/
$ systemctl enable --now tomcat
$ netstat -anlp | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 2039/java
# 방화벽 설정
$ {
firewall-cmd --add-service=http
firewall-cmd --add-port=8080/tcp
firewall-cmd --add-port=8009/tcp
firewall-cmd --add-port=3306/tcp
firewall-cmd --runtime-to-permanent
# Apache가 SELinux를 통해 원격 데이터베이스에 연결하도록 허용
setsebool -P httpd_can_network_connect_db 1
}
b) WEB Server - Apache install and configuration
# /etc/hosts에 서버 IP 주소 정보 추가
$ cat <<EOF >> /etc/hosts
192.168.219.100 web
192.168.219.111 was01
192.168.219.200 db
EOF
# Tomcat Connectors (mod_jk) Downloads
# https://tomcat.apache.org/download-connectors.cgi
$ {
yum -y install httpd httpd-devel gcc gcc-c++ wget redhat-rpm-config make
wget https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz
tar xvzf tomcat-connectors-1.2.48-src.tar.gz
cd tomcat-connectors-1.2.48-src/native/
./configure --with-apxs=/bin/apxs
make
make install
}
# Apache 설정
$ vim /etc/httpd/conf/httpd.conf
# line 58
LoadModule jk_module modules/mod_jk.so
Include conf.modules.d/mod_jk.conf
<VirtualHost *:80>
ServerName localhost
JkMount /*.jsp tomcat1
</VirtualHost>
$ cat <<EOF > /etc/httpd/conf.modules.d/mod_jk.conf
<IfModule jk_module>
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
</IfModule>
EOF
$ cat <<EOF > /etc/httpd/conf/workers.properties
worker.list=tomcat1
worker.tomcat1.type=ajp13
worker.tomcat1.host=192.168.219.111
worker.tomcat1.port=8009
EOF
c) WAS Server - tomcat configure
$ vim /usr/local/tomcat9/conf/server.xml
# line 115
<Connector protocol="AJP/1.3"
address="0.0.0.0"
secretRequired="false"
port="8009"
redirectPort="8443" />
# line 131 "jvmRoute=tomcat1" add
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
# line 150 - tomcat home directory
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="source" reloadable="true" />
$ mkdir /usr/local/tomcat9/webapps/source
$ cat << EOF > /usr/local/tomcat9/webapps/source/index.jsp
Hello World
EOF
$ systemctl restart tomcat
$ netstat -anlp | grep 8080
$ netstat -anlp | grep 8009
d) WEB Server - 서비스 재시작 및 방화벽 설정
$ {
systemctl restart httpd
cat /var/log/httpd/mod_jk.log
firewall-cmd --add-service=http
firewall-cmd --add-port=8080/tcp
firewall-cmd --add-port=8009/tcp
firewall-cmd --runtime-to-permanent
# Apache가 네트워크 연결을 수행할 수 있도록 허용
setsebool -P httpd_can_network_connect on
}
# SELinux가 활성화 되어있는 경우, 위 설정 후 'systemctl restart httpd' 명령을 실행하면 httpd 서비스가 실행되지 않는다.
# /var/log/message 로그 파일을 보면, SELinux가 /var/log/httpd/jk-runtime-status 파일에 대한 httpd의 쓰기 액세스를 차단하고 있음을 알려준다.
SELinux is preventing /usr/sbin/httpd from write access on the file /var/log/httpd/jk-runtime-status.1630.
# 해당 문제를 해결하기 위해서는 다음과 같은 명령을 수행해야 한다.
# /var/log/httpd/ 디렉토리와 그 하위 디렉토리의 SELinux 보안 컨텍스트를 httpd_sys_rw_content_t로 변경
# 즉, httpd 웹 서버가 쓰기 권한을 가지는 로그 파일에 대한 적절한 보안 컨텍스트를 제공
chcon -R -t httpd_sys_rw_content_t /var/log/httpd/
$ systemctl restart httpd
e) DB Server - MariaDB Install
# MariaDB 설치
$ yum -y install mariadb-server mariadb
# 서비스를 활성화하고 시작(start)하도록 지정
$ systemctl enable --now mariadb
# 방화벽 허용
$ firewall-cmd --add-port=3306/tcp
# MariaDB 설정
$ mysql_secure_installation
# test 용 DB 생성
$ mysql -u root -p
$ create database test;
# 외부 접근 허용
$ GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'PASSWORD';
$ exit;
f) WAS Server - DB Connectation Check
# https://downloads.mysql.com/archives/c-j/
{
wget https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-8.0.26.tar.gz
tar xvzf mysql-connector-java-8.0.26.tar.gz
cd mysql-connector-java-8.0.26
cp mysql-connector-java-8.0.26.jar /usr/local/tomcat9/lib/
}
systemctl restart tomcat
netstat -anlp | grep 8080
netstat -anlp | grep 8009
vim /usr/local/tomcat9/webapps/source/db.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.sql.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>DB Connection Test</title>
</head>
<body>
<%
String DB_URL = "jdbc:mysql://192.168.219.200:3306/test";
String DB_USER = "root";
String DB_PASSWORD= "1234";
Connection conn;
Statement stmt;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
stmt = conn.createStatement();
conn.close();
out.println("MySql jdbc test: connect ok!!");
} catch(Exception e) {
out.println(e.getMessage());
}
%>
</body>
</html>
댓글 남기기