[Cent 7 → Rocky 9] DNS Master/Slave 서버 업그레이드

mimic1995·2024년 1월 29일
0

EOS

목록 보기
2/4

2024년 중반부까지 PDNS 기반의 DNS 서버 전체 업그레이드가 계획되어 있어 Slave → Master 순으로 업그레이드 하였습니다. Slave가 정상적으로 업그레이드 되었다면 실 서비스의 단절을 최소화하기 위해 임시로 Master 서버 IP로 변경하여 운영하면서 Master 서버를 작업 예정입니다.

아래 두 가지 사항을 중점적으로 작업하였습니다.

① APM 버전 업그레이드 후 웹 소스와 DB 데이터도 그에 맞게 수정해야 하기 때문에 내부 서비스 프로그램의 버전 업그레이드도 정상화 되었는가
② 질의 용 NS 서버와의 리플리케이션이 원활하게 구축되는가

또한 보안 문제로 상세내역 기재는 불가하지만 기존에 사용하던 스크립트 및 기타 내역을 아래와 같이 백업해두었습니다.

  • Apache/MySQL/PHP 설정 파일 및 데이터 백업 압축파일 생성
  • /etc/pdns 백업 압축파일 생성
  • /etc, /var, /home 백업 압축파일 생성

기존 버전과 업그레이드할 버전은 아래와 같습니다.

항목기존 버전업그레이드 버전
OSCentOS Linux release 7.6.1810 (Core)Rocky Linux release 9.3 (Blue Onyx)
Apache2.2.34
Server MPM: Worker
2.4.57
Server MPM: event
DBMySQL 5.6.1410.6.16-MariaDB
PHPPHP 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

공통 기본 설정 진행

▶ 🧑‍💻 공통 기본 설정 보기

Apache 설치 및 설정

패키지 설치 (2.4.57)

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는 기본적인 문법검사만 마치면 큰 문제 없이 동작합니다.


MariaDB 설치

설치 가능한 버전 확인

dnf list mariadb
===
마지막 메타자료 만료확인(0:22:38 이전): 2024년 01월 29() 오후 04시 1059초.
사용 가능한 꾸러미
mariadb.x86_64                           3:10.5.22-1.el9_2                            appstream
===

Maria DB 10.6 레포 추가 후 설치

참고 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시 3539초.
사용 가능한 꾸러미
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)

euc-kr 이용 시

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로 변경 완료

utf-8 이용 시

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 설치로 넘어가겠습니다.


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로 자동으로 대체됩니다.

short_open_tag ON

vi /etc/php.ini
===
short_open_tag = On
===

PDNS 설치 및 설정

repo 허용

단순히 설치하게 되면 설치 패키지를 찾지 못합니다.

dnf install -y pdns pdns-backend-mysql pdns-recursor
===
마지막 메타자료 만료확인(0:05:00 이전): 2024년 01월 11() 오후 03시 4719초.
일치하는 인수가 없습니다: 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 백업본으로 복원

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도 복구되었는지 확인합니다.

pdns 실행

# 실행 명령어
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  131 11:13 /var/run/pdns.controlsocket
===

pdns.conf에서 set uid|gidsocket-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  131 11:30 pdns
===

ls -al /var/run/pdns
===
합계 0
drw-rw----  2 root pdns  60  131 11:30 .
drwxr-xr-x 29 root root 800  131 11:30 ..
srw-rw----  1 pdns pdns   0  131 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

웹 소스 최적화

완료


profile
Raiju Hantu Goryo Obake

0개의 댓글