2024년 중반부까지 PDNS 기반의 DNS 서버 전체 업그레이드가 계획되어 있어 Slave → Master 순으로 업그레이드 하였습니다. Slave가 정상적으로 업그레이드 되었다면 실 서비스의 단절을 최소화하기 위해 임시로 Master 서버 IP로 변경하여 운영하면서 Master 서버를 작업 예정입니다.
아래 두 가지 사항을 중점적으로 작업하였습니다.
① APM 버전 업그레이드 후 웹 소스와 DB 데이터도 그에 맞게 수정해야 하기 때문에 내부 서비스 프로그램의 버전 업그레이드도 정상화 되었는가
② 질의 용 NS 서버와의 리플리케이션이 원활하게 구축되는가
또한 보안 문제로 상세내역 기재는 불가하지만 기존에 사용하던 스크립트 및 기타 내역을 아래와 같이 백업해두었습니다.
기존 버전과 업그레이드할 버전은 아래와 같습니다.
항목 | 기존 버전 | 업그레이드 버전 |
---|---|---|
OS | CentOS Linux release 7.6.1810 (Core) | Rocky Linux release 9.3 (Blue Onyx) |
Apache | 2.2.34 Server MPM: Worker | 2.4.57 Server MPM: event |
DB | MySQL 5.6.14 | 10.6.16-MariaDB |
PHP | PHP 5.2.17 (cli) (built: Feb 13 2019 16:03:02) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies with Zend Optimizer v3.3.3, Copyright (c) 1998-2007, by Zend Technologies | PHP 8.0.30 (cli) (built: Aug 3 2023 17:13:08) ( NTS gcc x86_64 ) Copyright (c) The PHP Group Zend Engine v4.0.30, Copyright (c) Zend Technologies with Zend OPcache v8.0.30, Copyright (c), by Zend Technologies |
▶ 🧑💻 공통 기본 설정 보기
dnf install -y httpd
httpd -V
===
Server version: Apache/2.4.57 (Rocky Linux)
===
cp -arp /etc/httpd /etc/httpd_ori
vi /etc/httpd/conf/httpd.conf
===
#Listen 80
Listen 0.0.0.0:80
===
vi /etc/httpd/conf.modules.d/00-mpm.conf
===
# worker 주석 해제
LoadModule mpm_worker_module modules/mod_mpm_worker.so
# event 주석 처리
#LoadModule mpm_event_module modules/mod_mpm_event.so
===
systemctl enable httpd --now
netstat -nltp | egrep 'Proto|80'
===
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5279/httpd
===
httpd -V | grep MPM
===
Server MPM: worker
===
/etc/httpd/conf/httpd.conf
: apache 데몬 환경설정 파일
/etc/httpd/conf.d/DOMAIN.conf
: apache로 실행할 vhost, ssl vhost 관련 설정 파일 (수기로 추가해야 함)
위 두 파일에 관해서도 내용을 가져옵니다. 가져온 뒤 반드시 apachectl -t
로 문법 검사를 수행하고 ssl 인증서 파일도 잘 가져와야 합니다.
apache version upgrade는 기본적인 문법검사만 마치면 큰 문제 없이 동작합니다.
dnf list mariadb
===
마지막 메타자료 만료확인(0:22:38 이전): 2024년 01월 29일 (월) 오후 04시 10분 59초.
사용 가능한 꾸러미
mariadb.x86_64 3:10.5.22-1.el9_2 appstream
===
참고 URL
https://mariadb.org/download/?t=repo-config
vi /etc/yum.repos.d/MariaDB.repo
===
[mariadb]
name = MariaDB
# rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# baseurl = https://rpm.mariadb.org/10.6/centos/$releasever/$basearch
baseurl = https://mirrors.xtom.jp/mariadb/yum/10.6/centos/$releasever/$basearch
# gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB
gpgkey = https://mirrors.xtom.jp/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1
===
dnf update -y
dnf list mariadb-server
===
마지막 메타자료 만료확인(0:00:47 이전): 2024년 01월 29일 (월) 오후 04시 35분 39초.
사용 가능한 꾸러미
MariaDB-server.x86_64 10.6.16-1.el9 mariadb
mariadb-server.x86_64 3:10.5.22-1.el9_2 appstream
===
# '-y' 옵션으로 설치하므로 repo로 추가한 패키지 명의 대소문자 확인 후 주의하여 입력
dnf install -y MariaDB-server MariaDB-client
systemctl enable mariadb --now
netstat -nltp | egrep 'Proto|3306'
===
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 10014/mariadbd
tcp6 0 0 :::3306 :::* LISTEN 10014/mariadbd
===
mariadb 설치 후 비밀번호 없이 Enter로 접근 가능합니다. 이때 비밀번호를 설정해야 하니 아래처럼 입력하여 임시 비밀번호를 설정하거나 그냥 backup.sql 파일을 밀어 넣고 재시작해도 됩니다.
mysql -uroot -p
===
Enter password: [Enter] 입력
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.6.16-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
---
MariaDB [(none)]> set password=password('비밀번호');
Query OK, 0 rows affected (0.005 sec)
MariaDB [(none)]> quit
Bye
===
기존 서버의 언어셋 정보는 아래와 같습니다.
mysql> show variables like 'c%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | euckr |
| character_set_connection | euckr |
| character_set_database | euckr |
| character_set_filesystem | binary |
| character_set_results | euckr |
| character_set_server | euckr |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
| collation_connection | euckr_korean_ci |
| collation_database | euckr_korean_ci |
| collation_server | euckr_korean_ci |
| completion_type | NO_CHAIN |
| concurrent_insert | AUTO |
| connect_timeout | 10 |
| core_file | OFF |
+--------------------------+----------------------------------+
15 rows in set (0.00 sec)
mariadb 10.6에서 언어셋 설정을 위와 맞추려면 아래처럼 설정하면 됩니다.
cd /etc/my.cnf.d
vi client.cnf
===
[client]
default-character-set=euckr
===
vi server.conf
===
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
log-bin=mysql-bin
server-id=1
init_connect=SET collation_connection=euckr_korean_ci
init_connect=SET NAMES euckr
character-set-server=euckr
collation-server=euckr_korean_ci
expire_logs_days = 10
[mysqldump]
default-character-set=euckr
[mysql]
default-character-set=euckr
# 갈레라 설정 전까지 작성
===
systemctl restart mariadb
mysql> show variables like 'c%';
MariaDB [(none)]> show variables like 'c%';
+----------------------------------+----------------------------+
| Variable_name | Value |
+----------------------------------+----------------------------+
| character_set_client | euckr |
| character_set_connection | euckr |
| character_set_database | euckr |
| character_set_filesystem | binary |
| character_set_results | euckr |
| character_set_server | euckr |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| check_constraint_checks | ON |
| collation_connection | euckr_korean_ci |
| collation_database | euckr_korean_ci |
| collation_server | euckr_korean_ci |
| column_compression_threshold | 100 |
| column_compression_zlib_level | 6 |
| column_compression_zlib_strategy | DEFAULT_STRATEGY |
| column_compression_zlib_wrap | OFF |
| completion_type | NO_CHAIN |
| concurrent_insert | AUTO |
| connect_timeout | 10 |
| core_file | OFF |
+----------------------------------+----------------------------+
20 rows in set (0.002 sec)
※ 중간 과정에서 Database charset을 다시 utf8로 변경하기로 하여 기존 euc-kr로 된 데이터 전부 utf8로 변경 완료
vi /etc/my.cnf.d/server.cnf
===
[mysqld]
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
log-bin = mysql-bin
server-id = 1
init_connect = 'SET collation_connection = utf8_general_ci, NAMES utf8'
character-set-server = utf8
collation-server = utf8_general_ci
expire_logs_days = 10
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8
===
일단 mariadb 설정은 이 정도로 하고 php 설치로 넘어가겠습니다.
dnf install -y php-devel php-gd php-imap php-ldap php-mysql php-odbc php-pear php-xml php-xmlrpc php-mbstring php-mcrypt php-mhash gettext php-pear-DB php-pear-MDB2-Driver-mysqli
php -v
===
PHP 8.0.30 (cli) (built: Aug 3 2023 17:13:08) ( NTS gcc x86_64 )
Copyright (c) The PHP Group
Zend Engine v4.0.30, Copyright (c) Zend Technologies
with Zend OPcache v8.0.30, Copyright (c), by Zend Technologies
===
Zend Optimizer는 php 5.5 이하에서 사용하던 것으로 dnf 설치 시 Zend OPcache로 자동으로 대체됩니다.
vi /etc/php.ini
===
short_open_tag = On
===
단순히 설치하게 되면 설치 패키지를 찾지 못합니다.
dnf install -y pdns pdns-backend-mysql pdns-recursor
===
마지막 메타자료 만료확인(0:05:00 이전): 2024년 01월 11일 (목) 오후 03시 47분 19초.
일치하는 인수가 없습니다: pdns
일치하는 인수가 없습니다: pdns-backend-mysql
일치하는 인수가 없습니다: pdns-recursor
오류: 일치하는 항목을 찾을 수 없습니다: pdns pdns-backend-mysql pdns-recursor
===
아래 명령어로 허용해준 뒤 설치를 진행합니다.
dnf config-manager --set-enabled crb
dnf install -y epel-release
dnf install -y pdns pdns-backend-mysql pdns-recursor
# 백업 진행
cp -arp /etc/pdns /etc/pdns_ori
cp -arp /etc/pdns-recursor /etc/pdns-recursor_ori
chmod 660 /etc/pdns/pdns.conf
vi /etc/pdns/pdns.conf
===
allow-axfr-ips=127.0.0.1
config-dir=/etc/pdns
daemon=yes
disable-axfr=no
guardian=yes
launch=gmysql
local-port=53
module-dir=/usr/lib64/pdns
#recursor=127.0.0.1:54
setgid=pdns
setuid=pdns
socket-dir=/var/run
version-string=DNS
gmysql-host=localhost 또는 127.0.0.1
gmysql-user=데이터베이스명
gmysql-password=비밀번호
gmysql-dbname=계정명
gmysql-port=3306
gmysql-socket=/var/lib/mysql/mysql.sock
===
백업은 같이 해두지만 본 서버는 Master/Slave(Mirror) 서버이고 ns 서버가 아니기 때문에 recursor 설정은 하지 않습니다.
소유권을 660으로 하지 않으면 root:pdns 소유자이므로 start 시 pdns.conf 파일을 읽어올 수 없어 에러가 발생합니다.
/etc/pdns/pdns.conf 설정을 전부 복원했으면 db data 복원으로 넘어갑니다.
mariadb를 mysql 백업 본으로 복원 시 유의할 점은 alldump인 경우 mysql.user table이 view 정책으로 바뀌면서 오류가 발생할 수 있다는 점입니다. user view를 아래 명령어로 재생성하거나 수동으로 옮겨주어도 됩니다.
INSERT INTO `tables_priv` (`Host`, `Db`, `User`, `Table_name`, `Grantor`, `Timestamp`, `Table_priv`, `Column_priv`) VALUES ('localhost','mysql','mariadb.sys','global_priv','root@localhost','0000-00-00 00:00:00','Select,Delete','');
mariadb 10.4 이상 버전부터 패스워드 변경은 아래 명령어로 진행합니다.
set password for 'root'@'localhost' = password('비밀번호');
테이블이나 내부 쿼리 데이터가 잘 복원되었는지, user 내부 계정의 권한과 hosts도 복구되었는지 확인합니다.
# 실행 명령어
systemctl start pdns
실행 시 에러 발생하여 로그를 보니 아래와 같은 퍼미션 에러가 발생하였습니다.
Unable to remove (previous) controlsocket at '/var/run/pdns.controlsocket': Permission denied
/var/run
하단에 생성된 소켓 파일의 권한을 아래와 같습니다.
ls -al /var/run/pdns.controlsocket
===
srw-rw---- 1 pdns pdns 0 1월 31 11:13 /var/run/pdns.controlsocket
===
pdns.conf
에서 set uid|gid
와 socket-dir=/var/run
부분 때문에 이렇게 생성이 되었는데 소켓 생성 경로를 /var/run/pdns
로 바꿔주고 해당 디렉터리 자체를 pdns에 권한을 주겠습니다.
mkdir /var/run/pdns
vi /etc/pdns/pdns.conf
===
socket-dir=/var/run/pdns
===
chown root.pdns /var/run/pdns
chmod 660 -R /var/run/pdns
ls -al /var/run
===
...
drw-rw---- 2 root pdns 60 1월 31 11:30 pdns
===
ls -al /var/run/pdns
===
합계 0
drw-rw---- 2 root pdns 60 1월 31 11:30 .
drwxr-xr-x 29 root root 800 1월 31 11:30 ..
srw-rw---- 1 pdns pdns 0 1월 31 11:30 pdns.controlsocket
===
다시 pdns를 실행해보겠습니다.
systemctl start pdns
netstat -nltp | egrep 'Proto|pdns'
===
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 29755/pdns_server
tcp6 0 0 :::53 :::* LISTEN 29755/pdns_server
===
이제 질의테스트를 해보겠습니다. nslookup 시 Slave 서버의 IP를 지정하여 질의합니다.
이때, 질의할 도메인이 기존 DB 백업본에 등록된 도메인인지 확인합니다.
nslookup 도메인명 Slave서버IP
완료