기존에 VMWare workstation 위의 CentOS 6.7 기반에서 운영중이던 블로그 서버를 WMWare ESXi – CentOS 7.2 기반으로 마이그레이션을 하였다.

OS를 CentOS 7.2로 새로 설치 후 기존의 워드프레스 엔진, 파일, DB 데이터를 그대로 복사해서 올렸다.

 

0. 환경 비교

1) AS-IS :
Hyper Visor : VMWare Workstation 12 Pro
VM CPU : 2 Core
VM MEM : 3G
Guest OS : CentOS 6.7 x86_64
Apache : httpd-2.2.15-54.el6.centos.x86_64
DB : MariaDB-server-5.5.42-1.el6.x86_64
PHP : php-5.3.3-40.el6_6.x86_64
Samba : samba-3.6.23-20.el6.x86_64

 

2) TO-BE :
Hyper Visor : VMWare ESXi 5.5
VM CPU : 2 Core
VM MEM : 2G
Guest OS : CentOS 7.2 x86_64
Apache : httpd-2.4.6-40.el7.centos.4.x86_64
DB : mariadb-server-5.5.50-1.el7_2.x86_64
PHP : php-5.4.16-36.3.el7_2.x86_64
Samba : samba-4.2.10-7.el7_2.x86_64

 

1. OS 설치

CentOS 7.2를 minimal ISO로 설치 한다.

설치 과정은 간단하기 때문에 생략하고 아래 사항만 고려해서 설치한다.

 

1.1. Disk 할당

VMWare ESXi 5.5에서 Disk를 두개를 할당 했다. 

12G – OS 및 DB 데이터 영역 (SSD에 위치)

100G – 데이터 영역 (HDD에 위치)

 

1.2. CentOS 7.2 설치

1) 파티셔닝

파티셔닝을 수동으로 진행하며, 아래처럼 4개의 영역으로 구성한다.

/boot – 384M ( xfs _ /dev/sda1)

/ – 11G (LVM, xfs _ /dev/vg01/root)

swap – 512M (swap 파일시스템)

/tmp – 122M (LVM, xfs _ /dev/vg01/tmp)

2) 기타 설정

– 언어 : 한국어

– 보안 policy는 미적용

– kdump : disable

– root 암호 설정

 

1.3. Selinux 설정, 패키지 설치

OS를 설치하고 재부팅 후 아래와 같이 진행.

1) selinux disable

[root@mws ~]# cat /etc/sysconfig/selinux | egrep -v ^#
SELINUX=disabled
SELINUXTYPE=targeted

2) 패키지 설치

[root@mws ~]# yum install -y httpd mariadb-server php php-mysql php-fpm php-gd wget unzip vim-enhanced net-tools bind-utils rdate rsync screen samba psmisc iptables-services

3) 패키지 최신으로 업데이트

[root@mws ~]# yum update

4) 재부팅

[root@mws ~]# reboot

 

2. 파일시스템 생성, 설정

2.1. home 볼륨 생성

[root@mws ~]# pvcreate /dev/sdb

[root@mws ~]# vgcreate vg01 /dev/sdb

[root@mws ~]# lvcreate -l 25599 -n lv01 vg01

[root@mws ~]# lvscan
  ACTIVE            '/dev/vg01/lv01' [100.00 GiB] inherit
  ACTIVE            '/dev/vg00/root' [11.00 GiB] inherit
  ACTIVE            '/dev/vg00/tmp' [124.00 MiB] inherit

[root@mws ~]# mkfs.xfs /dev/vg01/lv01

[root@mws ~]# cat /etc/fstab | grep home
/dev/vg01/lv01  /home  xfs defaults,noexec,nosuid 0 0

[root@mws ~]# mount /home

2.2. tmp 볼륨 마운트 옵션 조정

tmp 파티션에 대해 noexec, nosuid 적용 후 remount

[root@mws ~]# cat /etc/fstab | grep tmp
/dev/mapper/vg00-tmp    /tmp                    xfs     defaults,noexec,nosuid        0 0

[root@mws ~]# mount -o remount /tmp

 

3. 어플리케이션 설정

3.1. 서비스 자동시작 활성화 및 구동

[root@mws ~]# systemctl enable mariadb.service
[root@mws ~]# systemctl enable httpd.service
[root@mws ~]# systemctl enable smb.service
[root@mws ~]# systemctl enable nmb.service
[root@mws ~]# systemctl enable rsyncd.service
[root@mws ~]# systemctl enable iptables.service

[root@mws ~]# systemctl is-enabled mariadb.service
[root@mws ~]# systemctl is-enabled httpd.service
[root@mws ~]# systemctl is-enabled smb.service
[root@mws ~]# systemctl is-enabled nmb.service
[root@mws ~]# systemctl is-enabled rsyncd.service
[root@mws ~]# systemctl is-enabled iptables.service

[root@mws ~]# systemctl start mariadb.service
[root@mws ~]# systemctl start httpd.service
[root@mws ~]# systemctl start smb.service
[root@mws ~]# systemctl start nmb.service
[root@mws ~]# systemctl start rsyncd.service
[root@mws ~]# systemctl start iptables.service

[root@mws ~]# systemctl status mariadb.service
[root@mws ~]# systemctl status httpd.service
[root@mws ~]# systemctl status smb.service
[root@mws ~]# systemctl status nmb.service
[root@mws ~]# systemctl status rsyncd.service
[root@mws ~]# systemctl status iptables.service

3.2. 마리아DB 설정

1) root 비번 설정

[root@mws ~]# mysqladmin -u root -p password '**********'
Enter password: 엔터입력

2) DB 생성

[root@mws ~]# mysql -u root -p
Enter password:**********

MariaDB [(none)]> CREATE DATABASE mapooblog;
MariaDB [(none)]> exit

3.3. 원본 설정 파일 보전

어플리케이션 패키지의 기본 파일 백업본 생성

[root@mws ~]# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf_original
[root@mws ~]# cp /etc/httpd/conf.d/userdir.conf /etc/httpd/conf.d/userdir.conf_original
[root@mws ~]# cp /etc/php.ini cp /etc/php.ini_original
[root@mws ~]# cp /etc/samba/smb.conf /etc/samba/smb.conf_original

3.4. mariadb 구동 문제

* 운영 중 OOM이 발생하여 서버를 재부팅 하였는데 mariadb가 구동이 안되는 현상이 발생하였다.  (2016.11.22 발생)
아래와 같은 메시지 발생하여 journamctl 로 자세한 로그를 확인해 보니 mariadb-prepare-db-dir 파일을 실행하는데 있어서 Permission denied 이 발생을 하였다.

[root@mws /]# systemctl start mariadb
Job for mariadb.service failed because the control process exited with error code. See "systemctl status mariadb.service" and "journalctl -xe" for details.
[root@mws /]# journalctl -xe
-- Unit mariadb.service has begun starting up.
11월 23 14:05:11 Mserver systemd[4168]: Failed at step EXEC spawning /usr/libexec/mariadb-prepare-db-dir: Permission denied
-- Subject: Process /usr/libexec/mariadb-prepare-db-dir could not be executed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- The process /usr/libexec/mariadb-prepare-db-dir could not be executed and failed.
--
-- The error number returned by this process is 13.
11월 23 14:05:11 Mserver systemd[1]: mariadb.service: control process exited, code=exited status=203
11월 23 14:05:11 Mserver systemd[1]: Failed to start MariaDB database server.
-- Subject: Unit mariadb.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit mariadb.service has failed.

따라서 /usr/libexec 에 대해서 아래와 같이 퍼미션 설정을 하였으나 역시 마찬가지여서

[root@mws ~]# chmod -R 755 /usr/libexec

아래처럼 /usr 하위 디렉토리에 대해 755 권한을 설정 하였다.

[root@mws ~]# chmod -R 755 /usr

원인은 대략 찾았지만 왜 갑자기 권한 문제로 구동이 안되었는지는 좀 더 찾아보고 기록을 해야될 듯 하다.

 

3.4. httpd 설정

1) httpd.conf 설정

[root@mws ~]# vim /etc/httpd/conf/httpd.conf

#DocumentRoot "/var/www/html"   ---> 주석처리

ServerTokens Prod  --> 추가

2) vhost.conf 설정

[root@mws ~]# vim /etc/httpd/conf.d/vhost.conf
########## Mapoo Blog ###########
<VirtualHost *:80>
    DocumentRoot /home/mapoo-blog
    ServerName www.mapoo.net
    ErrorLog logs/www.mapoo.net-error_log
    CustomLog logs/www.mapoo.net-access_log common
    #ErrorDocument 404 https://mapoo.net/error404.html
     <IfModule mod_userdir.c>
         UserDir enable
         UserDir public_html
     </IfModule>
<Directory "/home/mapoo-blog/">
    Options FollowSymLinks
    AllowOverride FileInfo
    Order Allow,Deny
    Deny from 222.110.34.
    Allow from all
</Directory>
<Directory /home/mapoo-blog/downfiles/Blog-Backup/>
    AllowOverride Limit
    Order Allow,Deny
    Deny from all
</Directory>
    #<Files ~ ".php$">
    ##<Files ~ ".html$">
    #    Order Deny,Allow
    #    #Deny from 175.196.51
    #    Deny from all
    #    Allow from 192.168.0.2
    #</Files>
<LocationMatch "(wp-includes/wp-tinymce.php|wp-content/themes|wp-content/plugins)">
    Allow from all
</LocationMatch>
#<IfModule mod_rewrite.c>
#  RewriteEngine on
##  #RewriteRule ^/(.*)$ - [R=404,L]
#  RewriteCond %{REQUEST_METHOD} ^TRACE
#  RewriteRule     .* - [F]
#</IfModule>
#TraceEnable off
</VirtualHost>

3) userdir.conf 설정

apache 버전이 2.4로 올라가면서 httpd.conf 에 선언하지 않고 여기에 선언을 해줘야 웹페이지 접근이 가능하다.

UserDir disabled 를 주석처리 해줘야 한다.

<IfModule mod_userdir.c>
    #
    # UserDir is disabled by default since it can confirm the presence
    # of a username on the system (depending on home directory
    # permissions).
    #
###Annotated 1 line at below - 20161030_01 by mapoo###
    #UserDir disabled

    #
    # To enable requests to /~user/ to serve the user's public_html
    # directory, remove the "UserDir disabled" line above, and uncomment
    # the following line instead:
    #
    #UserDir public_html
</IfModule>

#
# Control access to UserDir directories.  The following is an example
# for a site where these directories are restricted to read-only.
#

###Annotated 5 line at below - 20161030_01 by mapoo###
#<Directory "/home/*/public_html">
#    AllowOverride FileInfo AuthConfig Limit Indexes
#    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#    Require method GET POST OPTIONS
#</Directory>

###Added 5 line at below - 20161030_01 by mapoo###
<Directory "/home/mapoo-blog">
    AllowOverride ALL
    Options none
    Require method GET POST OPTIONS
</Directory>

###Added 3 line at below - 20161030_01 by mapoo###
<Directory "/home/mapoo-blog/*">
   Require all granted
</Directory>

4) process stop 설정

CentOS 7에 포함된 apache 패키지의 기본설정은 systemd에 의한 httpd 데몬 kill 방식이 SIGCONT 방식이다.

그렇기 때문에 httpd 데몬을 내리거나 서버를 shutdown 하게되면 http 관련 TCP 세션 연결이 있을 경우 STOP 시그널 이후 1분 30초(90초)간의 FIN_WAIT count를 기다린 후 데몬을 내리게 된다.

아래와 같은 메시지가 콘솔에 뿌려지며 1min 30s 간 대기한다.

[**   ] A stop job is running for The Apache HTTP Server (10s / 1min 30s)

즉시 데몬이 stop 되길 원하면 [Service] 설정 부분에서 아래 처럼 기존 SIGCONT를 SIGTERM 으로 변경한다. 설정 변경 후 즉신 반영이 된다.

# vim /etc/systemd/system/multi-user.target.wants/httpd.service

#KillSignal=SIGCONT
KillSignal=SIGTERM

 

3.5. php 환경변수

기존 환경파일 그대로 사용

[root@mws ~]# scp 192.168.0.169:/etc/php.ini /etc

3.6. samba 설정

[root@mws ~]# cat /etc/samba/smb.conf
[Global]
workgroup = WORKGROUP
security = user
map to guest = bad user
netbios name = XXX
server string = BlogServer
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes
interfaces = ens192 192.168.0.0/24
hosts allow = 192.168.0.X 192.168.0.X
max protocol = SMB2

[downfiles-mapoo]
path = /home/mapoo-blog/downfiles
force user = XXX
force group = XXX
browsable = no
writable = yes
guest ok = yes
read only = no

만약 client에서 삼바 공유 폴더 접근 시 권한 에러가 발생을 한다면 아래와 같이 설정해 준다.
(smbclient 명령을 통해 리눅스로 접근 시 NT_STATUS_ACCESS_DENIED listing \ 이 출력되면서 공유 폴더에 접근 불가 시)

# getenfoce   (selinux 활성화 확인 명령)

enforcing   (disabled 로 표기되면 selinux가 동작하지 않는것이다. 그렇다면 아래 setsebool 설정과는 무관하다.)

# setsebool -P samba_enable_home_dirs on  (삼바 공유 폴더 활성화 selinux bool 설정)

 

3.7. rsyncd 설정

[root@mws ~]# cat /etc/rsyncd.conf

port = XXX
[XXXXX]
uid = root
gid = wheel
path = /home
comment = mapoo-blog
use chroot = no
read only = no
write only = no
#hosts allow = 192.168.1.254
max connections = 4
timeout = 600

* CentOS 7 에서는 rsync가 기본적으로 stand alone 방식이다. 포트변경을 위해서는 rsyncd.conf의 global 설정 부분에 설정을 한다.

 

4. 기타 설정

4.1. rc.local

[root@mws ~]# cat /etc/rc.local | egrep -v ^#
/usr/bin/rdate -s time.bora.net 2>&1 | logger -t rc.local
/usr/sbin/iptables -A INPUT -m iprange --src-range 222.110.34.1-222.110.34.254 -j DROP 2>&1 | logger -t rc.local
/usr/sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP 2>&1 | logger -t rc.local
[root@mws ~]# chmod u+x /etc/rc.d/rc.local

[root@mws ~]# ls -al /etc/rc.d/rc.local
-rwxr--r-- 1 root root 778 10월 30 13:40 /etc/rc.d/rc.local

* RHEL 7 부터는 rc.local 파일의 실행 권한이 없음. 따로 실행 권한을 줘야 부팅시 실행이 된다.

 

4.2. sshd 설정

[root@mws ~]# vim /etc/ssh/sshd_config
Port XX
Protocol 2

4.3. 백업스크립트 설정

[root@mws ~]# cat /root/job-backup.sh
#!/bin/bash
KEEPDAYS="31"
MAPOO_BLOG_BACKUP=/home/mapoo-blog/downfiles/Blog-Backup
OSTI_BLOG_BACKUP=/home/osti-blog/downfiles/Blog-Backup

rsync -av --delete --exclude='downfiles/' /home/mapoo-blog $MAPOO_BLOG_BACKUP/
rm -f $MAPOO_BLOG_BACKUP/mapooblog_db_backup_*.sql
mysqldump -u root -p********* mapooblog > $MAPOO_BLOG_BACKUP/mapooblog_db_backup_$(date +%Y%m%d).sql
chown XXX.XXX $MAPOO_BLOG_BACKUP/mapooblog_db_backup_$(date +%Y%m%d).sql
date --rfc-2822 | grep "Sun" >& /dev/null
if [ $? == "0" ]; then
    cd $MAPOO_BLOG_BACKUP
    rm -f $MAPOO_BLOG_BACKUP/mapoo-blog_*.tar.gz
    tar zcfz mapoo-blog_$(date +%Y%m%d).tar.gz mapoo-blog/
    chown XXX.XXX mapoo-blog_*.tar.gz
    rm -f $MAPOO_BLOG_BACKUP/mapooblog_db_backup_*.sql.tar.gz
    tar zcfz mapooblog_db_backup_$(date +%Y%m%d).tar.gz mapooblog_db_backup_*.sql
    chown XXX.XXX mapooblog_db_backup_*.tar.gz
    find $MAPOO_BLOG_BACKUP -maxdepth 1 -mtime +$KEEPDAYS -daystart -type f -name "mapooblog_db_backup_*" | xargs rm -f {};
fi

4.4. crontab 스케쥴링

[root@mws ~]# crontab -l
*/10 * * * * rdate -s time.bora.net
# iostat log script
*/10 * * * * /root/iostat-log.sh
30 00 * * * /root/job-backup.sh

4.5. nameserver

[root@mws ~]# cat /etc/resolv.conf | grep ^name
nameserver 168.126.63.1

4.6. vim 설정

[root@mws ~]# mv -f ~/.vimrc ~/.vimrc_bak; wget https://mapoo.net/downfiles/Linux/vimrc -O ~/.vimrc

4.7. bash 권한 조정

[root@mws ~]# chmod 700 /usr/bin/bash

 

5. 데이터 이관

5.1. 파일들 복사

블로그 엔진 및 블로그에 담긴 데이터 파일들 복사

[root@mws ~]# rsync -av --delete --exclude='lost+found' --port=XXX 192.168.0.169::XXX /home/

5.2. DB 이관

[root@mws ~]# mysql -u root -p'**********' XXX < /home/mapoo-blog/downfiles/Blog-Backup/mapooblog_db_backup_20161030.sql

 

6. 서비스 이관

6.1. AS-IS와 TO-BE 바꾸기

1) AS-IS 서버의 db, web, samba 서비스를 내리고 ip를 변경

2) TO-BE 서버의 IP 변경 및 resolv.conf nameserver 설정

6.2. 어플리케이션 재기동

TO-BE 서버에서 어플리케이션 서비스 재기동

[root@mws ~]# systemctl restart httpd.service
[root@mws ~]# systemctl restart smb.service
[root@mws ~]# systemctl restart nmb.service
[root@mws ~]# systemctl restart rsyncd.service
[root@mws ~]# systemctl restart iptables.service

6.3. 서버 재부팅

TO-BE 서버를 재부팅하여 서비스 이상유무 점검

 

* 서비스 이관전 TO-BE 서버에서 웹서비스가 정상 기동되는지 확인하기 위해서는 확인하는 PC의 hosts 파일을 임시로 수정하여 진행한다.
아래 위치의 파일을 수정한다. (TO-BE 서버의 임시 IP가 192.168.0.11 로 가정을 하고 설정)
windows pc의 hosts 파일 수정 – C:\Windows\System32\drivers\etc\hosts

192.168.0.11  mapoo.net

 

* 기타 보안 설정 적용에 대한 것은 이 문서에서 생략한다.

 

이상이다.

WordPress migration – CentOS 6 to CentOS 7
태그:                 

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다