PDNS ?

PowerDNS사에서 만든 오픈소스 DNS 데몬 입니다. 데이터베이스에 데이터를 저장하여 신뢰성 있는 DNS 기능을 제공합니다. Poweradmin 이라는 Web interface와 연동하여 사용 가능합니다.

 

서버 구성도

 PDNS 서버를 이중화 구성하여 보다 더 안전한 서비스가 가능하도록 구성.

1. Master, Slave 두 서버에 PDNS 데몬 구동 후 DB에 VIP로 연결할 수 있도록 설정합니다.
2. Pacemaker를 이용하여 Master 서버에 장애가 발생 시 DB, Apache, DRBD 서비스를 Slave 서버에서 서비스 하도록 합니다.
3. DRBD 파티션에는 DB, Web Data를 저장합니다.

 

 

■ 구축환경

■ OS
- Centos Linux release 7.9.2009 (Core)
- APM 버전은 최신 버전으로 설치했으며, PDNS 데몬은 4.6.x로 설치했습니다.

■ 테스트에 사용한 IP
 - 실제 테스트 당시에는 Public IP를 사용하였으니 참고 바랍니다.

 

■ DRBD 구성

0. 호스트 등록

# /etc/hosts
192.168.0.100 pdnsm.hktest.shop pdnsm

192.168.0.101 pdnss.hktest.shop pdnss

 

1. DRBD 설치 ( Master & Slave )

# yum -y install https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# yum -y install kmod-drbd84 drbd84-utils

# drbd 모듈 확인 (확인이 되지 않을 경우 모듈로드)
# lsmod |grep drbd
# modprobe drbd

 

2. DRBD 설정 ( Master & Slave )

global {
usage-count yes;
}


common {
syncer {
}
}


resource "r0" {
protocol C;
startup {
wfc-timeout 0;
degr-wfc-timeout 120;
}
disk {
on-io-error detach;
}
net {
timeout 60;
connect-int 10;
ping-int 10;
max-buffers 2048;
max-epoch-size 2048;
}


on pdnsm.hktest.shop {
device /dev/drbd0;
disk /dev/xvdb1;
address 192.168.0.100:7787;
meta-disk internal;
}


on pdnss.hktest.shop {
device /dev/drbd0;
disk /dev/xvdb1;
address 192.168.0.101:7787;
meta-disk internal;
}


}

 

3. DRBD Meta data 생성 ( Master & Slave )

# drbdadm create-md r0
# systemctl start drbd

 

4. Primary 지정 및 파일시스템 생성 ( Master )

# drbdadm primary --force r0

# primary 지정 후, drbd sync가 진행되고 있는지 확인.

# cat /proc/drbd


# sync 완료 후, 파일 시스템 생성
# mkfs.ext4 /dev/drbd0
# mount /dev/drbd0 /home

 

■ Pacemaker 구성

1. pacemaker 설치 ( Master & Slave )

# yum install -y pacemaker corosync pcs psmisc policycoreutils-python
# systemctl enable pcsd
# systemctl enable corosync
# systemctl enable pacemaker
# systemctl start pcsd
# echo 'testpdnS' | passwd --stdin hacluster

 

2. cluster node 인증 ( Master )

# pcs cluster auth pdnsm pdnss
Username: hacluster
Password:
pdnss: Authorized
pdnsm: Authorized

 

3. cluster 구성 ( Master )

# pcs cluster setup --name pdns_cluster pdnsm pdnss
# pcs cluster start --all
# pcs cluster enable --all
# pcs property set stonith-enabled=false

 

4. Resource 등록 ( Master )

# pcs cluster cib pdns_cfg

# pcs -f pdns_cfg resource create Data ocf:linbit:drbd drbd_resource=r0 op monitor timeout="30" interval="20" role="Master" op monitor timeout="30" interval="10" role="Slave"
→ “drbd r0” 리소스의 대한 설정으로 Primary/Secondary가 변경이 된다.

# pcs -f pdns_cfg resource master DataSync Data master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
Data 리소스의 Master / Slave 구성 제약조건.

# pcs -f pdns_cfg resource create storage ocf:heartbeat:Filesystem device="/dev/drbd0" directory="/home" fstype="ext4"
drbd 파티션과 파일시스템을 지정하여 mount 시키는 리소스.

# pcs -f pdns_cfg resource create VirtualIP ocf:heartbeat:IPaddr2 ip=192.168.0.200 cidr_netmask=32 nic=eth0:0 op monitor timeout="30" interval="20" role="Master" op monitor timeout="30" interval="10" role="Slave"
VIP에 대한 Resource 설정.

# pcs -f pdns_cfg resource create Apache lsb:apache op monitor timeout="30s" interval="20s" role="Master" op monitor timeout="30s" interval="10s" role="Slave"

# pcs -f pdns_cfg resource create Mysql lsb:mysql.server op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=30s

# pcs -f pdns_cfg resource group add HA-GROUP VirtualIP storage Mysql Apache
HA-GROUPVIP, DRBD mount, Apache, Mysql 순서대로 구동되도록 그룹화.

# pcs -f pdns_cfg constraint colocation add HA-GROUP DataSync INFINITY with-rsc-role=Master
HA-GROUP & DataSync 리소스의 Master 가 공통된 Master 에서 실행되도록 설정.

# pcs -f pdns_cfg constraint order promote DataSync then start storage
DataSync 리소스가 실행된 후 storge 리소스 (/dev/drbd0 mount) 실행

# pcs cluster cib-push pdns_cfg

 

■ PDNS 구성

1. PDNS 설치

# yum install epel-release yum-plugin-priorities
# curl -o /etc/yum.repos.d/powerdns-auth-46.repo https://repo.powerdns.com/repo-files/el-auth-46.repo
# yum install -y pdns pdns-backend-mysql.x86_64

 

2. pdns DB Table 생성 ( Master )

# DB 데이터 디렉토리를 DRBD 파티션으로 이동 및 심볼릭 링크
# mv /usr/local/mysql/var /home/MYSQL_DATA
# ln -s /home/MYSQL_DATA /usr/local/mysql/var

# DB 접속 후 pdns DB 및 계정생성
→ Master, Slave 서버 모두 PDNS 데몬 구동하니 3개 IP에 대한 접근을 모두 허용해준다.
mysql ((none))>create database pdns;
mysql (mysql)>GRANT ALL PRIVILEGES ON pdns.* to 'pdns'@'localhost' IDENTIFIED BY 'pdnsTest@DB@';
mysql (mysql)>GRANT ALL PRIVILEGES ON pdns.* to 'pdns'@'192.168.0.100' IDENTIFIED BY 'pdnsTest@DB@';
mysql (mysql)>GRANT ALL PRIVILEGES ON pdns.* to 'pdns'@'192.168.0.101' IDENTIFIED BY 'pdnsTest@DB@';
mysql (mysql)>GRANT ALL PRIVILEGES ON pdns.* to 'pdns'@'192.168.0.102' IDENTIFIED BY 'pdnsTest@DB@';
mysql ((none))>flush privileges;


# pdns schema 생성
# cd /usr/share/doc/pdns-backend-mysql-4.6.0
# cp -pv schema.mysql.sql /usr/local/src/ ; sed -i "s/latin1/utf8/g" /usr/local/src/schema.mysql.sql
# mysql -uroot -p pdns < /usr/local/src/schema.mysql.sql


# systemctl enable pdns
# systemctl start pdns

 

3. pdns.conf 파일 수정

# cp -pv /etc/pdns/pdns.conf /etc/pdns/pdns.conf_org
# chmod 644 /etc/pdns/pdns.conf


# cat /etc/pdns/pdns.conf
any-to-tcp=yes
default-soa-edit=webdns.hktest.shop

daemon=yes
guardian=yes

setgid=pdns
setuid=pdns

local-address=0.0.0.0
local-address-nonexist-fail=no
local-port=53

launch=gmysql
gmysql-dnssec
gmysql-host=192.168.0.200
gmysql-port=3306
gmysql-user=pdns
gmysql-password=pdnsTest@DB@
gmysql-dbname=pdns

version-string=powerdns

 

4. 조회 테스트

# dig webdns.hktest.shop @pdnsm.hktest.shop
mysql ((none))>show processlist;
+----+------+-----------------------+------+---------+------+-------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+------+-----------------------+------+---------+------+-------+------------------+----------+
| 10 | pdns | 192.168.0.200:42690 | pdns | Sleep | 15 | | NULL | 0.000 |
| 11 | root | localhost | NULL | Query | 0 | init | show processlist | 0.000 |
+----+------+-----------------------+------+---------+------+-------+------------------+----------+


# dig webdns.hktest.shop @pdnss.hktest.shop
mysql ((none))>show processlist;
+----+------+-----------------------+------+---------+------+-------+------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+----+------+-----------------------+------+---------+------+-------+------------------+----------+
| 11 | root | localhost | NULL | Query | 0 | init | show processlist | 0.000 |
| 12 | pdns | 192.168.0.101:42834 | pdns | Sleep | 0 | | NULL | 0.000 |
+----+------+-----------------------+------+---------+------+-------+------------------+----------+

 

■ PDNS 구성

아래와 같이 압축해제 및 웹 접속을 할수 있도록 설정 후, webdns.hktest.shop로 접속하여 추가 설정을 진행해주면 됩니다.

# cd /home
# wget https://sourceforge.net/projects/poweradmin/files/poweradmin-2.2.0.tar.gz/download
# mv download poweradmin.tar.gz
# tar zxvf poweradmin.tar.gz
# mv /home/poweradmin-2.2.0 /home/WebDNS

# Apache에 연결
# mv /usr/local/httpd2/conf /DATA/APACHE_CONF
# ln -s /home/APACHE_CONF /usr/local/httpd2/conf


# vhosts.conf에 등록
→ webdns.hktest.shop에는 VIP를 넣어주면 됩니다.

<VirtualHost *:80>
ServerAdmin webmaster@hktest.shop
ServerName webdns.hktest.shop
DocumentRoot /home/WebDNS
CustomLog logs/pdns.hktest.shop-access.log common
</VirtualHost>

 

 

'Linux > HA' 카테고리의 다른 글

Pacemaker + DRBD 를 이용한 이중화 구성  (0) 2022.03.24
Pacemaker + ldirectord 를 이용한 LVS 구성  (0) 2022.03.24

전체적인 설치에 대한 방법이니, 설치 및 구성에 참고 바랍니다.

 

■ 구축 환경

OS
- CentOS Linux release 7.9.2009 (Core)

테스트에 사용한 IP
- 실제로 테스트 당시에는, Public IP를 사용하였으니 참고 바랍니다.

 

■ Pacemaker Cluster 구성

 기본 설치 및 설정 같은 경우, Pacemaker + ldirectord 를 이용한 LVS 구성 를 참조 부탁드립니다.

 

■ DRBD 설치

※ DRBD란 ?

 - Distributed Replicated Block Device의 약자로, HA(High Availabilty) 구성을 위한 Block Device 입니다.

Active 상태의 서버 Disk에서 데이터를 저장할 경우, 네트워크를 통해 디스크 블럭단위로 standby 서버에 미러링 되는 방식이라고 보시면 됩니다.

 

1. /etc/hosts 에 호스트 등록

# vi /etc/hosts
192.168.0.100 active
192.168.0.101 standby

 

2. 주요 패키지 설치

# yum install https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# yum -y install kmod-drbd84 drbd84-utils

# drbd 모듈 확인 (확인이 되지 않을 경우 모듈로드)

# lsmod |grep drbd
# modprobe drbd
drbd 585395 0
libcrc32c 12644 2 drbd,nf_conntrack

 

3. DRBD 관련 설정 ( Actvie, Standby )

# vi /etc/drbd.conf
global {
usage-count yes;
}
common {
syncer {
}
}
resource "r0" {
protocol C;
startup {
wfc-timeout 0;
degr-wfc-timeout 120;
}
disk {
on-io-error detach;
}
net {
timeout 60;
connect-int 10;
ping-int 10;
max-buffers 2048;
max-epoch-size 2048;
}


on active {
device /dev/drbd0;
disk /dev/xvda2;
address 192.168.0.100:7787;
meta-disk internal;
}


on standby {
device /dev/drbd0;
disk /dev/xvda2;
address 192.168.0.101:7787;
meta-disk internal;
}


}

 

3. DRBD Metadata 생성 (Active, Standby)

 metadata 생성 전 DRBD 볼륨으로 사용할 공간은 파일 시스템이 생성되어 있지 않아야 하며, 미리 파일시스템이 생성된 상태면 dd명령어를 이용하여 MBR 영역을 제거해야 합니다.

# drbdadm create-md r0
--== Thank you for participating in the global usage survey ==--
The server's response is:


you are the 4215th user to install this version
initializing activity log
initializing bitmap (960 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
Success


# systemctl start drbd
# systemctl status drbd
● drbd.service - DRBD -- please disable. Unless you are NOT using a cluster manager.
Loaded: loaded (/usr/lib/systemd/system/drbd.service; disabled; vendor preset: disabled)
Active: active (exited) since 목 2021-10-14 12:43:06 KST; 4 days ago
Process: 5530 ExecStart=/lib/drbd/drbd start (code=exited, status=0/SUCCESS)
Main PID: 5530 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/drbd.service

 

 정상적으로 연결되었는지 확인.

# cat /proc/drbd
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2020-04-05 02:58:18

0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:84 nr:35276312 dw:35276400 dr:2193 al:11 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

 

4. Primary 지정 및 파일시스템 생성 ( Active )

# drbdadm primary --force r0
# mkfs.ext4 /dev/drbd0
# mount /dev/drbd0 /home
/dev/drbd0 ext4 33G 49M 31G 1% /home

 

■ PCS resource 생성

CIB(Cluster Information Base), Raw xml 에 우선 설정을 저장 후 업데이트 하는 방식으로 진행

# pcs cluster cib drbd_cfg
→ 'drbd_cfg' 파일을 cib 형식으로 생성.


# pcs -f drbd_cfg resource create Data ocf:linbit:drbd drbd_resource=r0 op monitor timeout="30" interval="20" role="Master" op monitor timeout="30" interval="10" role="Slave"
→ “drbd r0” 리소스의 대한 설정으로 Primary/Secondary가 변경이 된다.

# pcs -f drbd_cfg resource master DataSync Data1 master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true
→ Master / Slave 구성 제약조건.

# pcs -f drbd_cfg resource create storage ocf:heartbeat:Filesystem device="/dev/drbd0" directory="/home" fstype="ext4"
drbd 파티션과 파일시스템을 지정하여 mount 시키는 리소스로, 노드별로 Master 노드에 마운트 시킨다.

# pcs -f drbd_cfg resource create VirtualIP ocf:heartbeat:IPaddr2 ip=[VIP] cidr_netmask=32 nic=eth0:1 op monitor timeout="30" interval="20" role="Master" op monitor timeout="30" interval="10" role="Slave"

→ VIP에 대한 Resource 설정.

# pcs -f drbd_cfg resource group add HA-GROUP VirtualIP storage
→ HA-GROUP에 VIP, DRBD mount 순서대로 구동되도록 그룹화.

# pcs -f drbd_cfg constraint colocation add HA-GROUP DataSync INFINITY with-rsc-role=Master
→ HA-GROUP & DataSync 리소스의 Master 가 공통된 Master 에서 실행되도록 설정.

# pcs -f drbd_cfg constraint order promote DataSync then start storage
→ DataSync1 리소스가 실행된 후 storge1 리소스 (/dev/drbd0 mount) 실행

 

■ Failover 테스트

 

1. ative 서버에서 서비스 중 확인.

# pcs status

 

2. active cluster 를 standby 상태로 변경하여 테스트 진행.

→ 등록한 resource들이 정상적으로 넘어갔는지 확인진행.

[active]
# pcs cluster standby active

[standby]
# pcs status


# cat /proc/drbd

 

■ 그 외 서비스들 추가.

실제로 DRBD로 이중화 구성할 경우 WEB, DB와 같은 서비스들을 같이 사용한다. 자신이 구축할 서버에 용도에 맞게 리소스를 추가하시면 됩니다. 아래의 예는 Apache , Mysql 설치 후 추가로 등록한 예시입니다.  LSB 방식으로 구동되도록 설정 진행하였으니, /etc/init.d 아래에 실행파일을 등록하시면 됩니다.

 

※ Apache

→ /etc/init.d/ 경로에 아래와 같은 스크립트 작성

#!/bin/sh


case "$1" in
start)
echo -n "Starting apahce: "
/usr/local/httpd2/bin/apachectl start
;;
stop)
echo -n "Shutting down apache"
/usr/local/httpd2/bin/apachectl stop
;;
*)
echo "Usage: $0 {start|stop}"
esac


exit 0

 

※ Mysql

→ Mysql 설치 시 제공되는 mysql.server 실행파일을 /etc/init.d/ 경로에 옮겨 사용하였습니다.

 

1. resource 추가

# pcs -f drbd_cfg resource create Apache lsb:apache op monitor timeout="30s" interval="20s" role="Master" op monitor timeout="30s" interval="10s" role="Slave"

# pcs -f drbd_cfg resource create Mysql lsb:mysql.server op start timeout=60s op stop timeout=60s op monitor interval=20s timeout=30s


 

2. HA-GROUP에  추가

 서비스의 시작 순서를 판단하여 넣어주도록 합니다.

# pcs -f drbd_cfg resource group add HA-GROUP VirtualIP storage Apache Mysql

 

'Linux > HA' 카테고리의 다른 글

PDNS 이중화 구성  (0) 2022.03.28
Pacemaker + ldirectord 를 이용한 LVS 구성  (0) 2022.03.24

■ LVS 란?

 Linux Virtual Server의 약자이며, 말 그대로 리눅스 가상 서버입니다. HA(고가용성) 서버를 구축하기 위해 리눅스 환경의 서버를 로드 밸런싱 할수 있도록 도와줍니다. 

 (L4 스위치를 이용한 운영이 가장 좋습니다만, 가격적인 부분이 부담스러워 사용하는 경우가 대부분 일것같습니다.)

 

■ 구축 환경

※ OS
- CentOS Linux release 7.9.2009 (Core)
- 실제로 테스트 당시에는, Public IP를 사용하였으니 참고 바랍니다.


※ 구성에 사용되는 데몬
- Corosync : 클러스터 인프라 지원(Quorum 관리, 메세지 관리 등)
- Pacemaker : 클러스터 자원 관리자
- PCS : Corosync / pacemaker 관리하는 Management 데몬
- ldirectord : 원격 서비스를 모니터링하고, LVS를 제어하는 데몬

 

■ Pacemaker 설치 (LVS-Master, Slave 모두 설치)

Pacemaker 관련 내용은 추가로 업데이트할 예정이며, 설치 및 설정에 관한 내용만 게시하였습니다.

 

1. /etc/hosts 에 호스트 등록

→ IP 같은 경우 환경에 맞게 수정 부탁드립니다.

192.168.0.250 lvsm
192.168.0.251 lvss

 

2. /etc/sysctl.conf에 아래의 설정 추가

# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

#sysctp -p

 

3. 주요 패키지 설치

# yum install -y pacemaker corosync pcs psmisc policycoreutils-python
# systemctl enable pcsd
# systemctl enable corosync
# systemctl enable pacemaker

 

4.  PCS 데몬 구동 및 노드간 통신을 위해 관리계정 (hacluster) 패스워드 설정

→ 노드간 로그인을 통해 corosync 구성을 동기화 하거나, 다른 노드에서 클러스터 실행 및 중지 작업 수행에 必

 ※ Master, Slave 모두 동일한 패스워드로 설정

# systemctl start pcsd
# password hacluster
# echo 'hklvstest' | passwd --stdin hacluster

 

5. Cluster Node 인증 설정 ( Master 에서만 진행 )

 → 방화벽이 올라와 있을 경우 아래의 포트를 오픈해준 후 진행해야 인증이 가능

※ Open이 필요한 방화벽 포트
◇ TCP : 2224, 3121, 21064

◇ UDP : 5405

# pcs cluster auth lvsm lvss

Username: hacluster
Password:
lvsm: Authorized
lvss: Authorized

 

6. Cluster 구성 및 활성화

# pcs cluster setup --name lvs_cluster lvsm lvss



# pcs cluster start --all

# pcs cluster enable --all
→ 노드간 통신은 UDP 포트를 이용하여 통신




 

7. Cluster 기본 셋팅

STONITH(Fencing Device) : 의도치 않은 동시 엑세스로 인한 데이터 손상을 보호함.
→ 클러스터 장애 시 해당 node를 끊어 공유 데이터의 무결성을 보장.
no-quorum-policy : 클러스터에 quorum이 없을 때의 수행작업을 설정.


# pcs property set stonith-enabled=false
→ Fencing Device 기능 비활성화

# pcs property set no-quorum-policy=ignore
→ 2개의 node로 구성 시 일반적으로 사용하는 옵션이며, 해당 설정이 안되어 있을 경우, 클러스터 간에 failover 시 부자연스러울 수 있음.

 

8. Resource 등록

 자신이 사용할 VIP를 입력하여, 리소스 등록

# pcs resource create VirtualIP ocf:heartbeat:IPaddr2 ip=[VIP] cidr_netmask=32 nic=eth0:1 op monitor interval=30s

 

■ ldirectord 설치 (LVS-Master, Slave 모두 설치)

로드 밸런싱을 위해 설치합니다.

 

1. ldirectord 설치

# cd /usr/local/src/;wget --content-disposition https://packagecloud.io/s_mcleod/pacemaker/packages/el/7/ldirectord-4.0.1-1.84.caee.el7.centos.x86_64.rpm/download.rpm

# yum -y install ldirectord-4.0.1-1.84.caee.el7.centos.x86_64.rpm

 

2. ldirectord 설정 추가 

 IP 같은 경우 환경에 맞도록 수정해서 넣어줍니다.

 

※ [LVS Server]

# vi /etc/ha.d/ldirectord.cf
checktimeout=10
checkinterval=10
autoreload=no
quiescent=no


# HTTP Service
virtual = [VIP]:80
real=[RealServer1 IP]:80 gate 10
real=[RealServer2 IP]:80 gate 10

service=http
scheduler=wlc
persistent=3600
protocol=tcp
checkport=80
checktype=connect

※ [Real Server]

 

# vi /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=[VIP]
NETMASK=255.255.255.255
ONBOOT=no

# 해당 설정을 하지 않을경우, lo:0에서 VIP의 MAC주소를 가져오려는 시도가 계속됩니다.
# vi /etc/sysctl.conf

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2

# sysctp -p

 

3. ldirectord Resource 추가

# pcs resource create ldirectord lsb:ldirectord op monitor interval="20" timeout="10"

 

4. VIP, ldirectord 순으로 실행되기 위해 colocation 설정 추가.

# pcs constraint colocation add VirtualIP with ldirectord


→ lvss에 (-)INFINITY 값을 부여하여 마스터 서버에서 리소스를 가져가게 설정이 됨.

 

'Linux > HA' 카테고리의 다른 글

PDNS 이중화 구성  (0) 2022.03.28
Pacemaker + DRBD 를 이용한 이중화 구성  (0) 2022.03.24

■ 필요한 패키지 설치

1. php 설치에 따른 필요한 라이브러리 먼저 설치.

( 그 외에 필요한 패키지는 설치하시면서 추가로 설치 부탁드립니다.)

# yum -y install epel-release
# yum -y install sqlite-devel libcurl-devel oniguruma-devel  

# cd /usr/local/src; wget https://libzip.org/download/libzip-1.7.3.tar.gz
# tar zxvf libzip-1.7.3.tar.gz
# cd $SOURCE/libzip-1.7.3
# cmake3 -DCMAKE_INSTALL_PREFIX=/usr/local/libzip-1.7.3
# make; make install

 

2. 설치에 필요한 파일 설치.

# cd /usr/local/src/; wget https://www.php.net/distributions/php-7.4.28.tar.gz
# tar zxvf php-7.4.28.tar.gz

 

■ PHP 컴파일 및 설치

export PKG_CONFIG_PATH=/usr/local/libzip-1.7.3/lib64/pkgconfig
# cd php-7.4.28
# ./configure  --with-apxs2=/usr/local/httpd2/bin/apxs \
--with-mysql-sock=/tmp/mysql.sock \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--enable-gd --with-freetype \
--with-jpeg \
--with-zlib \
--enable-ftp \
--disable-debug \
--enable-sockets \
--with-gettext \
--enable-shared \
--with-gdbm \
--with-kerberos \
--with-mhash \
--with-libxml=/usr/local \
--with-xmlrpc \
--enable-dom \
--with-iconv=/usr/local/iconv \
--with-curl=/usr/local/curl \
--enable-mbstring \
--enable-sysvsem \
--enable-sysvshm \
--enable-sysvmsg \
--with-xsl \
--with-openssl \
--enable-soap \
--with-zip \
--enable-bcmath
# make; make install

 

■ PHP 컴파일 설치 시 주의사항

PHP 7.4 버전을 설치하면서 변경되거나 사라진 옵션들이 있으니 참고 바랍니다.

--enable-zip => --with-zip
--wtih-freetype-dir => --with-freetype
--with-gd => --enable-gd
--wtih-jpeg-dir => --with-jpeg
-- with-libxml-dir => --with-libxml
--with-png-dir => --with-png 

 

[참고자료]

https://www.php.net

■ HTTP/2 ?

'HTTP/2'는 웹 브라우저와 서버간 통신하는데 사용되는 프로토콜로, 표준 프로토콜인 HTTP/1.1 보다 속도나 보안적으로 향상된 기능을 제공합니다. 

 

■ 설치 및 사용 조건

1) Apache 2.4.17부터 HTTP/2 를 지원하였지만 보안취약점이 발견된것으로 확인되며, 패치된 Apache 2.4.26 이상 버전에서 사용을 권장드립니다.

2) 해당 모듈을 사용하기 위해서는 openssl-1.0.2 버전 이상이 필요합니다. Centos 6은 oepnssl-1.0.1이 기본적으로 설치되므로, 별도로 설치 해줘야 합니다.

3) 현재 대부분 브라우저에서 HTTP/2 프로토콜 이용의 조건으로 TLS Handshake를 전제하고 있어, SSL 인증서를 사용하여야 합니다.

4) HTTP/2 프로토콜 사용은 위해서는 아파치 event mpm을 사용해야 합니다.
→ 현재 prepork mpm에서는 호환성 문제와 알려지지 않은 버그가 존재하여, 아파치 공식 홈페이지에서도 event 방식을 권장합니다.

 

■ libnghttp2 설치

Apache mod_http2를 설치하기 위해서는 libnghttp2 1.2.1 이상이 설치되어 있어야 합니다.

→ CentOS 6 에서도 yum 저장소에서 1.6.0 버전이 설치되어 http2 모듈 사용이 가능합니다.

# yum install libnghttp2 libnghttp2-devel
# rpm -qa |grep http2
libnghttp2-devel-1.33.0-1.1.el7.x86_64
libnghttp2-1.33.0-1.1.el7.x86_64


# Centos 6
# yum list |grep http2
libnghttp2.i686 1.6.0-1.el6.1 epel
libnghttp2-devel.i686 1.6.0-1.el6.1 epel

 

■ Apache 설치

컴파일 옵션에 아래와 추가하여 컴파일 합니다.

--enable-http2
mod_http2를 사용하기 위한 옵션으로 추가해줍니다.


--with-ssl=/usr/local/openssl
Openssl을 사용하기 위한 옵션으로, Centos7에서 기본 설치되는 Openssl 버전은 1.0.2k로 생략해도 되는 옵션입니다.
다만, Centos 6 같은 경우 openssl 을 업그레이드 해야므로 위 옵션을 추가해줘야 합니다.

# ./configure \

--prefix=/usr/local/httpd2 \
--enable-modules=all \
--enable-charset-lite \
--enable-so \
--with-included-apr \
--with-mpm-shared=all \
--enable-http2 \
--with-ssl=/usr/local/openssl \
--with-mpm=event


# make
# make install

 

■ HTTP/2 활성화

# httpd.conf 파일에 추가 및 확인
LoadModule http2_module modules/mod_http2.so

ProtocolsHonorOrder On
Protocols h2 h2c http/1.1


ProtocolsHonorOrder : 'Protocols' 에 나열한 순서대로 우선순위를 결정한건지 선택하는 옵션 (on|off)
Protocols : 호스트에서 지원되는 프로토콜 목록을 지정하는 옵션.

 

HTTP/2는 SSL 인증서를 설치 후 사용 가능합니다.

아파치 웹로그로 예시를 보여드립니다.

# SSL 인증서 미사용
SEKK.hktest.shop 8323 - - [06/Dec/2021:10:24:35 +0900] "GET / HTTP/1.1" 200 6 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"


SSL 인증서 사용
SEKK.hktest.shop 8959  - - [06/Dec/2021:10:27:19 +0900] "GET / HTTP/2.0" 200 6 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"

 

■ HTTP/2 활성화 테스트 방법

1. openssl를 이용한 확인 ( openssl 1.0.2 이상 )

# http2 프로토콜 활성화 했을경우 리턴값
# openssl s_client -alpn h2 -connect SEKK.hktest.shop:443 | grep ALPN

verify return:1
ALPN protocol: h2


# http2 프로토콜 활성하지 않았을 경우 리턴값
# openssl s_client -alpn h2 -connect SEKK.hktest.shop:443 | grep ALPN
verify return:1
ALPN protocol: http/1.1

 

2. httpd2.pro 를 이용한 확인

# http2 프로토콜 활성화 했을경우

# http2 프로토콜 활성하지 않았을 경우

 

'Linux > Apache' 카테고리의 다른 글

GeoIP2(MaxMind) Apache Module 설치 및 DB 업데이트  (0) 2022.03.23
Apache 2.4.52 설치  (0) 2022.03.23

■ GeoIP

- MaxMind 에서 제공하는 모듈과 IP정보 DB 를 통해서 웹에 접근하는 IP의 국가별로 확인할 수 있도록 도와주는 솔루션 입니다. 해외에서의 불필요한 접근을 차단하기 위해 자주 사용합니다.

- 2022년 5월 말에 GeoIP Legacy DB (.dat 확장자) 업데이트가 중단될 예정이며, 이에 따라 MaxMind 사에서 제공하는 GeoIP2(MaxMind) Apache Module 를 설치하여 사용하는것을 권장합니다.

 

■ libmaxminddb 설치

mod_maxminddb를 설치하기 위한 라이브러리 설치.

# yum install libmaxminddb libmaxminddb-devel

 

■ mod_maxminddb 설치

mod_maxminddb 모듈은 Apahce 2.2 이상에서 사용 가능합니다.

# cd /usr/local/src/; wget https://github.com/maxmind/mod_maxminddb/releases/download/1.2.0/mod_maxminddb-1.2.0.tar.gz
# tar zxvf mod_maxminddb-1.2.0.tar.gz
# cd mod_maxminddb-1.2.0
# ./configure --with-apxs=/usr/local/httpd2/bin/apxs
# make; make install

# 설치한 모듈 확인

-rwxr-xr-x 1 root root 49732 2021-11-23 14:23 mod_maxminddb.so
# cat /usr/local/apache/conf/httpd.confLoadModule maxminddb_module modules/mod_maxminddb.so

 

■ geoipupdate 설치

 geoipupdate를 사용하기 위해서는 maxmind 홈페이지에서 회원가입 후, 라이센스를 발급받아야 합니다.

회원가입 및 라이센스 발급 방법은 추후 업데이트 하도록 하겠습니다.

# cd /usr/local/src; wget https://github.com/maxmind/geoipupdate/releases/download/v3.1.1/geoipupdate-3.1.1.tar.gz
# tar zxvf geoipupdate-3.1.1.tar.gz
# cd geoipupdate-3.1.1
# ./configure
# make ; make install


# GeoIP.conf (라이센스) 파일 등록
# cd /usr/local/etc
# cat GeoIP.conf
AccountID 
LicenseKey 
EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country


# GeoIP DB 파일 업데이트 진행.
# /usr/local/bin/geoupdate
# ll /usr/local/share/GeoIP
-rw-r--r-- 1 root root 7485474 2021-11-23 14:40 GeoLite2-ASN.mmdb
-rw-r--r-- 1 root root 74189738 2021-11-23 14:41 GeoLite2-City.mmdb
-rw-r--r-- 1 root root 6000017 2021-11-23 14:41 GeoLite2-Country.mmdb


# geoipupdate 스케쥴 등록
# cat <<EEE>> /etc/crontab
# GeoIP DB Update
00 06 * * 3 root /usr/local/bin/geoipupdate/geoipupdate
EEE

 

■ 특정 국가에서의 접근 설치

아래는 적용 예시입니다. 서버환경에 맞게 변경이 필요합니다.

 

1. 한국, 미국에서의 접근만 허용

MaxMindDBEnable On
MaxMindDBFile COUNTRY_DB /usr/local/share/GeoIP/GeoLite2-Country.mmdb
MaxMindDBFile CITY_DB /usr/local/share/GeoIP/GeoLite2-City.mmdb
MaxMindDBFile ASN_DB /usr/local/share/GeoIP/GeoLite2-ASN.mmdb
MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
SetEnvIf MM_COUNTRY_CODE ^(KR|US) AllowCountry
<Location />
Deny from all
Allow from env=AllowCountry
</Location>
</IfModule>

 

2. 베트남에서의 접근 차단

MaxMindDBEnable On
MaxMindDBFile COUNTRY_DB /usr/local/share/GeoIP/GeoLite2-Country.mmdb
MaxMindDBFile CITY_DB /usr/local/share/GeoIP/GeoLite2-City.mmdb
MaxMindDBFile ASN_DB /usr/local/share/GeoIP/GeoLite2-ASN.mmdb
MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
SetEnvIf MM_COUNTRY_CODE ^(VN) BlockCountry
<Location />
Deny from env=BlockCountry
</Location>
</IfModule>

 

3. 도메인별 설정추가

[httpd.conf]
<IfModule maxminddb_module>
MaxMindDBEnable On
MaxMindDBFile COUNTRY_DB /usr/local/share/GeoIP/GeoLite2-Country.mmdb
MaxMindDBFile CITY_DB /usr/local/share/GeoIP/GeoLite2-City.mmdb
MaxMindDBFile ASN_DB /usr/local/share/GeoIP/GeoLite2-ASN.mmdb
MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code
</IfModule>


<VirtualHost *:80>
DocumentRoot /home/SEKK/docs
ServerName SEKK.hktest.shop
CustomLog logs/SEKK.hktest.shop-log geoip

<IfModule maxminddb_module>
SetEnvIf MM_COUNTRY_CODE ^(US) AllowCountry

<Location />

Deny From all
Allow from env=AllowCountry
</Location>

</IfModule>

</VirtualHost>

 

4. 로그 Format 설정

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{MM_COUNTRY_CODE}e" geoip


- - [23/Nov/2021:17:50:26 +0900] "GET / HTTP/1.1" 200 16157 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36" KR

'Linux > Apache' 카테고리의 다른 글

Http2 Apache Module 설치  (0) 2022.03.23
Apache 2.4.52 설치  (0) 2022.03.23

 

■ apr, apr-util 설치

# cd /usr/local/src/; wget https://dlcdn.apache.org//httpd/httpd-2.4.52.tar.gz
# tar zxvf httpd-2.4.52.tar.gz

# cd /usr/local/src; wget https://dlcdn.apache.org//httpd/httpd-2.4.52.tar.gz
# tar zxvf httpd-2.4.52.tar.gz

#cd /usr/local/src; wget https://dlcdn.apache.org//apr/apr-1.7.0.tar.gz
# tar zxvf apr-1.7.0.tar.gz

# mv /usr/local/src/apr-1.7.0 /usr/local/src/httpd-2.4.52/srclib/apr
# mv /usr/local/src/apr-util-1.6.1 /usr/local/src/httpd-2.4.52/srclib/apr-util

■ Apache 설치

# cd /usr/local/src/httpd-2.4.52

# ./configure --prefix=/usr/local/httpd2 \
--enable-modules=all \
--enable-charset-lite \
--enable-so \
--with-included-apr \
--with-mpm-shared=all \
--with-mpm=event


# make
# make install

■ lua 설치

# cd /usr/local/src/; wget https://www.lua.org/ftp/lua-5.3.4.tar.gz
# cd lua-5.3.4
# make linux
# make install

■ pcre 설치

# cd /usr/local/src; wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz/download
# cd pcre-8.45
# ./configure --prefix=/usr/local/pcre --enable-shared
# make
# make install


'Linux > Apache' 카테고리의 다른 글

Http2 Apache Module 설치  (0) 2022.03.23
GeoIP2(MaxMind) Apache Module 설치 및 DB 업데이트  (0) 2022.03.23

SoftRaid란 : OS에 포함이 되어 있는 RAID이다. CPU의 자원을 사용하기 때문에 성 능의 제약이 있어 상대적으로 느리다. 별도의 하드웨어 없이 소프트웨어로만 구현이 되어 있기 때문에 하드웨어 구현 방식에 비해 저렴하지만, 데이터의 손실이나 에러, 바이러스 에 대해 상대적으로 취약한 점이 있다.

 

1. SoftRaid 구축방법

 1.1 RAID 1 구축

■ 구성 : VirtualBox, SATA 128GB*2(SoftRaid 1)

■ 운영체제 : CentOs 6

 

- SoftRAID 구축 방법

1) OS 설치 중 SoftRaid 파티션으로 나눠 설치

-> OS 설치 중 SoftRaid 파티션으로 똑같은 크기의 RAID 파티션을 생성한다.

 

-> RAID 파티션 생성 후 다음과 같이 설정 후 RAID 장치를 만들어준다.

 

-> 파티션을 만들어 준후 계속 진행 시 다음과 같이 SoftRaid 파티션을 생성한다.

 

-> cat /proc/mdstat 명령어로 RAID 구성 파티션 및 RAID 장치를 확인 할 수 있다.

<레이드가 깨졌을시 [UU]가 아닌 [U_], [_U] 등으로 표시 된다.>

 

2) OS 설치 후 명령어를 통한 SoftRaid 파티션 설정

OS 설치 이후 추가 혹은 변경으로 SoftRaid를 구성해야 하는 상황으로 테스트 진행

 

기존 디스크에 파티션 추가하여 SoftRaid 구성

-> fdisk -l 명령어로 확인한 파티션들 확인. (추가로 SoftRAID를 구성하기 위 해 10GB 정도의 공간을 남겨둠)

 

-> fdisk [장치명] - n(new) - 만들려는 파티션들 값 입력 - p(print) - w(write)

-> /dev/sda7 , /dev/sdb7에 동일한 크기로 파티션을 만들어 준다.

 

-> mdadm --create /dev/md5 --level=1 --raid-devices=2 /dev/sda7 /dev/sdb7 명령어로 SoftRaid를 구성한다.

 

-> mdadm --detail /dev/md5 명령어로 해당 레이드의 구성을 확인할 수 있다.

<현재 구성 후 바로 확인을 하여 resysncing 상태로 표시 된다.>

 

-> 레이드 장치에 맞는 파일시스템을 생성 해준다.

-> /DATA 디렉토리를 만든 후 /dev/md5를 마운트 한다.

(df -Th로 확인 하였을 때 마운트 된 것을 확인 할 수 있다.)

->/etc/fstab 에 /DATA의 정보를 등록하여 재부팅 후에도 자동으로 마운트 될 수 있도록 설정가능.              

# 해당 디렉토리의 레이드 장치의 UUID 값은 ll /dev/disk/by-uuid로 확인 가능

 

2. SoftRaid 장애테스트 및 복구 방법

2.1 장애 테스트

■ 장애 테스트 구성 : VirtualBox, SATA 128GB*2(SoftRaid

■ 상황: /dev/sdb 디스크에 오류가 생겨 Raid가 깨진 상태

 

 -> mdadm --detail /dev/md0 명령어로 레이드를 확인하였을때 제거가 된 것 을 확인할 수 있다.

 

-> log를 확인하니 2개의 mirror 중 1개만 활성화 되어있다. /proc/mdstat로 확인을 해보면 [2/1] [U_]가 되어 있으며,

(경우에 따라 다르게 표 시된다.) /dev/sda의 파티션들만 active되어 있는것을 확인할 수 있다.

-> 종료 후 새로운 128GB의 가상 디스크를 만들어 준 후 다시 부팅한다.

 

-> sfdisk -d [장치명] > [파일이름] 명령어로 dump 파일을 만든다.

# sfdisk : 여러 디스크를 원본 디스크와 동일한 파티션으로 나눠야 할 경우 유용하게 사 용 할 수 있는 명령어

-s : 파티션의 사이즈 출력

-l : 각 장치의 파티션 정보 출력

-d : 해당 파티션 dump

 

-> sfdisk /dev/sdb < sdadump.txt 명령어로 파티션들 복사

-> mdadm [레이드장치] --add [추가할파티션] 명령어를 통하여 각 레이드에 장치를 추가한다.

/proc/mdstat 명령어로 구성 상황을 확인 할 수 있다.

 

## 논외...

핫스왑 서버가 아닐경우 디스크 교체를 위해 서버를 종료해야한다. 그런데, 디스크 교체 후 부팅이 안되는 경우가 있다.여러가지 이유가 있겠지만, Grub이 설치가 안되어있어 부팅이 안되는 경우가 많았다.

Grub 관련되서 여러 포털 사이트에 내용이 많다.

 

 

 SoftRaid로 구성했을때 Grub은 한개의 디스크에 설치되는데, Grub이 설치된 디스크를 교체한다면? 부팅이 되지 않는 상황이 발생한다. 그렇다면 Grub은 어떻게 설치할까? 생각보다 간단하다.

 

 # grub-install [설치할 디스크]

 

혹은  grub로 진입해 설치 가능하다.

# grub

root (hd1,0)

# setup (hd1)

 

+ Recent posts