리눅스/CentOS7

CentOS7 - 워드프레스(WordPress) 환경 구축하기 (9/10)

일편나루 2019. 5. 25. 12:40
반응형

목차 (INDEX)

     

    개요

    다음과 같은 최신의 LAMP환경에서 워드프레스(WordPress)의 최신 버전인 5.21 버전을 HTTPS 환경으로 구축합니다.

    • 2018년 4월 MySQL8.0 Release , 5.x계열보다 최대 2배 고속화
      2018년 8월 RFC8446(TLS1.3 표준 사양) 발표
      2018년 10월 APACHE httpd2.4의 TLS1.3 지원
      2018년 12월 PHP7.3 및 WordPress5.0 Release
    • 2019년 2월 26일 OpenSSL 1.1.1(b) Release
      2019년 4월 1일 Apache httpd 2.4.39 Released
      2019년 5월 2일 PHP7.3.5 Release
      2019년 5월 21일 WordPress 5.2.1 Release

    또한, 워드프레스(WordPress)를 고속화하기 위해서 Apache httpd2.4.39의 event MPM과 PHP-FPM을 이용해서 웹사이트의 속도를 향상하도록 구축합니다.

    CentOS7.6 / OpenSSL1.1.1b / Apache2.4.39(TLS1.3) / PHP7.3.5 / MySQL8.0.16 / WordPress5.21
    CentOS7.6 / OpenSSL1.1.1b / Apache2.4.39(TLS1.3) / PHP7.3.5 / MySQL8.0.16 / WordPress5.21

    현재 설치되어 있는 패키지 / 버전

    1. CentOS 7.6.1810(Core)
    2. OpenSSL 1.0.2k-fips 26 Jan 2017
    3. PHP 5.6
    4. Apache 2.4.6
    5. mysql-community-common-5.7.26-1.el7.x86_64
    6. WordPress 4.5

    업그레이드 또는 설치되는 패키지 / 버전

    1. CentOS 7.6.1810(Core)
    2. OpenSSL 1.1.1b 26 Feb 2019
    3. nghttp nghttp2/1.38.0
    4. Brotli-1.0.7
    5. PHP 7.3.5 (cli) (built: Apr 30 2019 08:37:17) ( NTS )
    6. apr-1.7.0
    7. apr-util-1.6.1
    8. Apache/2.4.39 (Unix)
    9. mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)
    10. WordPress 5.2.1

    CentOS 7 설치하기

    아직 설치하지 않았다면 CentOS7 - OS설치하기 (1/10) 참고하세요

    [root@centos7 ~]# cat /etc/redhat-release
    CentOS Linux release 7.6.1810 (Core)
    

    환경 구축을 위한 개발 툴 설치

    yum -y groupinstall base  
    yum -y groupinstall development  
    yum -y groupinstall network-tools

    yum update

    설치된 패키지들을 모두 최신 버전으로 업데이트해줍니다. (각자의 환경에 따라서 시간이 다소 걸릴 수 있습니다)

    yum -y update

    Apache httpd 2.4.39 설치 준비

    Apache httpd2.4에 TLS1.3과 HTTP/2, 그리고 새로운 압축 알고리즘 Brotli에 대응하기 위하여 Apache httpd2.4 설치에 필요한 각종 라이브러리를 설치합니다.
    또한 다른 글에서 다루게 될 CentOS7 - E-Mail 서버 구축하기(QMAIL) (5/10) 글을 위하여,
    Apache httpd2.4의 컴파일 시, Vpopmail의 웹 인터페이스인 Qmailadmin를 적용하기 위한 컴파일 옵션을 적용하여 설치할 예정입니다.

    설치 준비 1: TLS1.3에 대응하기 위하여 OpenSSL 1.1.1 설치

    Apache HTTP Server 2.4.39 이후 버전에서 TLS1.3을 적용하기 위해서는 OpenSSL 1.1.1 버전이 필수입니다.

    How to upgrade OpenSSL on Centos 7 or RHEL 7
    https://syslint.com/blog/tutorial/how-to-upgrade-openssl-on-centos-7-or-rhel-7

    ❶ OpenSSL 버전 확인

    # 업데이트 전  
    [root@centos7 ~]# openssl version  
    OpenSSL 1.0.2k-fips 26 Jan 2017  
    
    # 업데이트 후  
    [root@centos7 ~]# openssl version  
    OpenSSL 1.1.1b 26 Feb 2019  
    

    OpenSSL 패키지 정보를 확인해 봅니다.

    [root@centos7 src]# yum info openssl
    Loaded plugins: fastestmirror, langpacks
    Loading mirror speeds from cached hostfile
     * atomic: mirrors.hosting.in.th
     * base: ty1.mirror.newmediaexpress.com
     * epel: ftp.jaist.ac.jp
     * extras: ty1.mirror.newmediaexpress.com
     * remi-safe: ftp.riken.jp
     * updates: ty1.mirror.newmediaexpress.com
    Installed Packages
    Name        : openssl
    Arch        : x86_64
    Epoch       : 1
    Version     : 1.0.2k
    Release     : 16.el7_6.1
    Size        : 814 k
    Repo        : installed
    From repo   : updates
    Summary     : Utilities from the general purpose cryptography library with TLS implementation
    URL         : http://www.openssl.org/
    License     : OpenSSL
    Description : The OpenSSL toolkit provides support for secure communications between
                : machines. OpenSSL includes a certificate management tool and shared
                : libraries which provide various cryptographic algorithms and
                : protocols.
    

    ❷ OpenSSL컴파일에 필요한 패키지를 미리 설치합니다.

    yum -y install zlib-devel  
    yum -y install perl-core

    ❸ OpenSSL의 최신 버전을 확인 후 설치합니다.

    OpenSSL 최신 버전을 확인합니다.

    https://www.openssl.org/source

    OpenSSL 최신버전을 설치합니다.

    cd /usr/local/src
     wget https://www.openssl.org/source/openssl-1.1.1b.tar.gz
     tar xvzf openssl-1.1.1b.tar.gz  
    
     cd openssl-1.1.1b  
     ./config --prefix=/usr/local/openssl-1.1.1b shared zlib  
    
     make depend  
     make  
     make test  
     make install
    

    ❹ 설치된 OpenSSL1.1.1 라이브러리의 경로를 인식시켜 줍니다

    동일 파일이 존재하는지 체크 후에 생성해 줍니다.

    # 나열되는 파일리스트를 확인해서 파일명 중복을 회피합니다.
    [root@centos7 ~]# ll /etc/ld.so.conf.d/
    total 44
    -rw-r--r--  1 root root 19 Oct 31  2018 dyninst-x86_64.conf
    -r--r--r--  1 root root 63 Mar 19 00:10 kernel-3.10.0-957.10.1.el7.x86_64.conf
    -r--r--r--  1 root root 63 Apr 30 00:03 kernel-3.10.0-957.12.1.el7.x86_64.conf
    -r--r--r--  1 root root 63 May 15 06:28 kernel-3.10.0-957.12.2.el7.x86_64.conf
    -r--r--r--  1 root root 63 Nov 29 23:53 kernel-3.10.0-957.1.3.el7.x86_64.conf
    -r--r--r--  1 root root 63 Feb  1 23:58 kernel-3.10.0-957.5.1.el7.x86_64.conf
    -rw-r--r--  1 root root  0 May 23 15:31 lib64.conf
    -rw-r--r--  1 root root 20 Jul 15  2014 libiconv-x86_64.conf
    -rw-r--r--  1 root root 17 May  3 06:11 mysql-x86_64.conf
    -rw-r--r--. 1 root root 21 Apr  1  2015 xulrunner-64.conf
    [root@centos7 ~]# 

    openssl111.conf라는 이름으로 생성합니다.(파일명은 임의)

    echo /usr/local/openssl-1.1.1b/lib > /etc/ld.so.conf.d/openssl111.conf  
    ldconfig

    경로 인식이 안되면 아래와 같은 에러가 발생합니다.
    [root@centos7 lib]# openssl version
    openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

    ❺ openssl실행파일을 새로운 버전으로 교체해줍니다.

    mv /bin/openssl /root/  
    ln -s /usr/local/openssl-1.1.1b/bin/openssl /bin/openssl  

    ❻ 적용된 버전을 확인하고 TLS1.3에 대응하는지도 확인해봅니다.

    [root@centos7 ld.so.conf.d]# openssl version
    OpenSSL 1.1.1b  26 Feb 2019
    
    [root@centos7 ld.so.conf.d]# openssl ciphers -v | grep "TLSv1.3" | sort
    TLS_AES_128_GCM_SHA256  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(128) Mac=AEAD
    TLS_AES_256_GCM_SHA384  TLSv1.3 Kx=any      Au=any  Enc=AESGCM(256) Mac=AEAD
    TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any      Au=any  Enc=CHACHA20/POLY1305(256) Mac=AEAD
    

    참고 : 다른 사이트의 openssl 정보도 확인해 보세요

    [root@centos7 ld.so.conf.d]# openssl s_client -connect google.com:443

    설치 준비 2: Nghttp2 설치

    HTTP/2(mod_http2)의 코어 엔진인 Nghttp2를 설치를 위하여 먼저 컴파일에 필요한 패키지를 설치합니다.
    ※ Nghttp2 is an implementation of HTTP/2 and its header compression algorithm HPACK in C. (https://nghttp2.org)

    yum -y install jansson-devel
    yum -y install libev-devel
    yum -y install c-ares-devel

    ❶ Nghttp2은 버전 1.35.0부터 C++14가 필요합니다.

    CentOS7의 경우, Software Collections(SCL) 리포지토리로부터 devtoolset-7 패키지를 인스톨해서 활성화할 수 있습니다.

    ※ 참고:https://github.com/nghttp2/nghttp2/commit/6c9196953e7bc28f5a66f81722e7693f2d91e9da

    yum -y install centos-release-scl
    yum -y install devtoolset-7
    scl enable devtoolset-7 bash

    위 내용 미적용 시 에러 발생 :
    /usr/include/c++/4.8.2/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

    ❷ Nghttp2의 최신 버전을 확인 후 설치합니다.

    Nghttp2의 최신 버전을 확인합니다.

    https://github.com/nghttp2/nghttp2/releases/tag/v1.38.0

    Nghttp2의 최신버전을 설치합니다.

    cd /usr/local/src
    wget https://github.com/nghttp2/nghttp2/releases/download/v1.38.0/nghttp2-1.38.0.tar.gz
    
    cd nghttp2-1.38.0/
    scl enable devtoolset-7 bash
    
    # OPENSSL_CFLAGS과 OPENSSL_LIBS 환경변수에 좀전에 설치했던 openssl-1.1.1b를 지정후 컴파일해 줍니다
    env OPENSSL_CFLAGS="-I/usr/local/openssl-1.1.1b/include" \
    OPENSSL_LIBS="-L/usr/local/openssl-1.1.1b/lib -lssl -lcrypto" 
    
    ./configure -enable-app    # 에러나면  -std=c++11 를 추가
    
    make
    make install
    

    HTTP/2의 라이브러리인 libnghttp2 설치 위치: /usr/local/llib

    [root@centos7 nghttp2-1.38.0]# ll /usr/local/lib/libnghttp2.*
    -rw-r--r-- 1 root root 1270206 May 23 16:06 /usr/local/lib/libnghttp2.a
    -rwxr-xr-x 1 root root     958 May 23 16:06 /usr/local/lib/libnghttp2.la
    lrwxrwxrwx 1 root root      21 May 23 16:06 /usr/local/lib/libnghttp2.so -> libnghttp2.so.14.17.3
    lrwxrwxrwx 1 root root      21 May 23 16:06 /usr/local/lib/libnghttp2.so.14 -> libnghttp2.so.14.17.3
    -rwxr-xr-x 1 root root  676920 May 23 16:06 /usr/local/lib/libnghttp2.so.14.17.3
    [root@centos7 nghttp2-1.38.0]#

    Nghttp2 관련 커멘드 설치 위치: /usr/local/bin

    [root@centos7 nghttp2-1.38.0]# ll /usr/local/bin/nghttp*
    -rwxr-xr-x 1 root root  2469616 May 23 16:06 /usr/local/bin/nghttp
    -rwxr-xr-x 1 root root  2655848 May 23 16:06 /usr/local/bin/nghttpd
    -rwxr-xr-x 1 root root 16250840 May 23 16:06 /usr/local/bin/nghttpx
    [root@centos7 nghttp2-1.38.0]#

    적용된 Nghttp2 버전을 확인

    [root@centos7 ~]# nghttp --version
    nghttp nghttp2/1.38.0
    

    설치 준비 3: 새로운 압축 알고리즘인 Brotli를 적용합니다.

    컴파일에 필요한 cmake를 설치합니다.

    yum -y install cmake

    ❶ 최신 버전을 확인 후 설치합니다.

    Brotli의 최신 버전을 확인합니다.

    https://github.com/google/brotli/releases/tag/v1.0.7

    Brotli의 최신버전을 설치합니다.

    cd /usr/local/src/
    wget https://github.com/google/brotli/archive/v1.0.7.tar.gz
    tar xvzf v1.0.7.tar.gz
    
    cd brotli-1.0.7/
    mkdir out && cd out
    
    ../configure-cmake
    
    make
    make test
    make install
    

    Brotli의 라이브러리 설치 위치: /usr/local/lib/

    [root@centos7 ~]# ll  /usr/local/lib |grep libbrotli*
    lrwxrwxrwx 1 root root      20 May 23 16:13 libbrotlicommon.so -> libbrotlicommon.so.1
    lrwxrwxrwx 1 root root      24 May 23 16:13 libbrotlicommon.so.1 -> libbrotlicommon.so.1.0.7
    -rwxr-xr-x 1 root root  136096 May 23 16:13 libbrotlicommon.so.1.0.7
    -rw-r--r-- 1 root root  137550 May 23 16:13 libbrotlicommon-static.a
    lrwxrwxrwx 1 root root      17 May 23 16:13 libbrotlidec.so -> libbrotlidec.so.1
    lrwxrwxrwx 1 root root      21 May 23 16:13 libbrotlidec.so.1 -> libbrotlidec.so.1.0.7
    -rwxr-xr-x 1 root root  248120 May 23 16:13 libbrotlidec.so.1.0.7
    -rw-r--r-- 1 root root  328328 May 23 16:13 libbrotlidec-static.a
    lrwxrwxrwx 1 root root      17 May 23 16:13 libbrotlienc.so -> libbrotlienc.so.1
    lrwxrwxrwx 1 root root      21 May 23 16:13 libbrotlienc.so.1 -> libbrotlienc.so.1.0.7
    -rwxr-xr-x 1 root root 3956784 May 23 16:13 libbrotlienc.so.1.0.7
    -rw-r--r-- 1 root root 4462832 May 23 16:13 libbrotlienc-static.a
    

    ❷ 설치된 Brotli 라이브러리의 경로를 인식시켜 줍니다

    동일 파일이 존재하는지 체크 후에 생성해 줍니다.

    [root@centos7 ~]# ll /etc/ld.so.conf.d/
    total 44
    -rw-r--r--  1 root root 19 Oct 31  2018 dyninst-x86_64.conf
    -r--r--r--  1 root root 63 Mar 19 00:10 kernel-3.10.0-957.10.1.el7.x86_64.conf
    -r--r--r--  1 root root 63 Apr 30 00:03 kernel-3.10.0-957.12.1.el7.x86_64.conf
    -r--r--r--  1 root root 63 May 15 06:28 kernel-3.10.0-957.12.2.el7.x86_64.conf
    -r--r--r--  1 root root 63 Nov 29 23:53 kernel-3.10.0-957.1.3.el7.x86_64.conf
    -r--r--r--  1 root root 63 Feb  1 23:58 kernel-3.10.0-957.5.1.el7.x86_64.conf
    -rw-r--r--  1 root root  0 May 23 15:31 lib64.conf
    -rw-r--r--  1 root root 20 Jul 15  2014 libiconv-x86_64.conf
    -rw-r--r--  1 root root 17 May  3 06:11 mysql-x86_64.conf
    -rw-r--r--  1 root root 30 May 23 15:29 openssl111.conf
    -rw-r--r--. 1 root root 21 Apr  1  2015 xulrunner-64.conf
    

    usr-local-lib.conf라는 이름으로 생성해 줍니다. (파일명은 임의)

    echo /usr/local/lib > /etc/ld.so.conf.d/usr-local-lib.conf
    ldconfig

    설치 준비 4: APR과 APR-util 설치

    https://apr.apache.org
    Apache Portable Runtime (APR) 프로젝트의 임무는 기본 플랫폼 별 구현에 예측 가능하고 일관된 인터페이스를 제공하는 소프트웨어 라이브러리를 생성하고 유지 관리하는 것

    • APR 1.7.0, released April 5, 2019
    • APR-util 1.6.1, released October 22, 2017

    Apache httpd2.4.39를 컴파일해서 설치할 경우 Apache Portable Runtime (APR)가 필요하므로 APR과 APR-util최신 버전을 설치해 줍니다.

    yum -y install pcre-devel
    yum -y install expat-devel

    ❶ APR의 최신 버전을 확인 후 설치합니다.

    APR / APR-util의 최신 버전을 확인합니다.

    http://apr.apache.org/download.cgi

    APR / APR-util의 최신버전을 설치합니다.
    APR

    cd /usr/local/src/
    wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-1.7.0.tar.gz
    tar xvzf apr-1.7.0.tar.gz
    cd apr-1.7.0/
    
    ./configure
    
    make
    make install

    APR-util

    cd /usr/local/src/
    wget http://ftp.jaist.ac.jp/pub/apache//apr/apr-util-1.6.1.tar.gz
    tar xvzf apr-util-1.6.1.tar.gz
    
    cd apr-util-1.6.1/
    
    ./configure --with-apr=/usr/local/apr
    
    make
    make install

    드디어 Apache httpd2.4.39 버전을 설치합니다.

     

    반응형

    Apache httpd2.4 최신버전을 설치

    ❶ 최신 버전을 확인후 설치합니다.

    Apache httpd2.4의 최신버전을 확인합니다.

    https://httpd.apache.org/download.cgi

    이제 HTTP/2, SSL/TLS, Brotli모듈 등을 활성화해서 설치할 예정인데, 이 웹서버는 큐메일도 운영되고 있습니다.
    그래서 Qmailadmin을 사용하기 위해서 --enable-cgid라는 컴파일 옵션도 적용해서 컴파일하겠습니다.
    --enable-cgid : threaded MPM환경에서 CGI를 실행할 수 있도록 활성화하는 옵션
    설치 후 httpd.conf 파일에서 cgid_module를 활성화시켜야 하는 작업이 더 필요하며 이 부분은 다른 글(CentOS7 - Web Server (Apache) 구축하기 (8/10))에서 다룰 예정입니다.

    각종 패키지를 소스 컴파일해서 설치할 경우에,
    모든 소스를 보관하고 컴파일하는 위치를 /usr/local/src로 사용합니다.
    초기에는 없으므로 mkdir /usr/local/src 생성해 주시면 됩니다. (이미 많은 분들이 이렇게 하고 계시겠지만..)
    그런 다음 해당 디렉터리 아래에 특정 패키지로 이동하여 ./configure --help 명령으로 컴파일 옵션을 확인할 수 있습니다.
    나중에 재 컴파일해야 할 경우에도 매우 편리합니다. (참고)

    [root@centos7 ~]# cd /usr/local/src
    [root@centos7 src]# cd httpd-2.4.39/
    [root@centos7 httpd-2.4.39]# ./configure --help

    Apache httpd2.4의 최신 버전을 설치합니다.

    cd /usr/local/src/
    wget http://ftp.kddilabs.jp/infosystems/apache//httpd/httpd-2.4.39.tar.gz
    
    tar xvzf httpd-2.4.39.tar.gz
    cd httpd-2.4.39/
    
    ./configure \
    --enable-http2 \
    --enable-brotli \
    --with-brotli=/usr/local/lib \
    --enable-ssl \
    --with-ssl=/usr/local/openssl-1.1.1b \
    --with-apr=/usr/local/apr \
    --with-apr-util=/usr/local/apr \
    --enable-so \
    --enable-mods-shared=all \
    --enable-mpms-shared=all \
    --enable-cgid
    

    설치된 버전을 확인합니다.

    [root@centos7 ~]# /usr/local/apache2/bin/httpd -v
    Server version: Apache/2.4.39 (Unix)
    Server built:   May 26 2019 16:03:35

    Apache httpd 2.4.39 이 /usr/local/apache2 아래에 설치된 것을 확인할 수 있습니다.
    Apache httpd 설정은 PHP7.3.5를 설치한 후에 진행합니다.

    [root@centos7 ~]# ll /usr/local/apache2/
    total 56
    drwxr-xr-x  2 root   root 4096 May 26 16:03 bin
    drwxr-xr-x  2 root   root 4096 May 26 16:03 build
    drwxr-xr-x  2 root   root  139 May 26 14:36 cgi-bin
    drwxr-xr-x  4 root   root  121 May 26 23:52 conf
    drwxr-xr-x  3 root   root 4096 May 23 16:35 error
    drwxr-xr-x  9 daemon root 4096 May 26 23:40 htdocs
    drwxr-xr-x  3 root   root 8192 May 23 16:35 icons
    drwxr-xr-x  2 root   root 4096 May 26 16:03 include
    drwxr-xr-x  2 root   root 4096 May 27 04:36 logs
    drwxr-xr-x  4 root   root   28 May 23 16:35 man
    drwxr-sr-x 14 root   root 8192 Mar 28 00:05 manual
    drwxr-xr-x  2 root   root 4096 May 26 20:48 modules
    [root@centos7 ~]# 
    

    PHP 7.3.5 설치

    PHP7.3은 Remi 리포지토리로부터 설치합니다.

    ❶ Remi 리포지토리 추가

    Remi 리포지토리가 의존하는 EPEL리포지토리를 추가

    yum -y install epel-release
    yum -y update

    Remi 리포지토리 추가

    rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
    rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi

    Remi 리포지토리를 활성화해 줍니다.
    remi.repo

    vi /etc/yum.repos.d/remi.repo
    [remi]
    ...
    enabled=0
     ↓
    enabled=1

    remi-php73.repo

    vi /etc/yum.repos.d/remi-php73.repo
    [remi-php73]
    ...
    enabled=0
     ↓
    enabled=1

    최신 버전이 아닌 PHP가 설치되어 있는 경우(PHP 5.6.x) Apache httpd와 연동이 안 되는 문제가 발생할 수 있습니다.
    삭제 후 설치해도 문제 되지 않기 때문에 설치된 기존 버전을 확인한 후에 필요시 판단하여 삭제해 줍니다.
    ※ Migrating from PHP 5.6.x to PHP 7.0.x : https://www.php.net/manual/en/migration70.php

    기존 버전을 삭제합니다.

    # 설치된 패키지 확인후
    [root@centos7 ~]# yum list installed | cut -d " " -f 1  | grep php
    
    # 불필요한 패키지를 삭제합니다.
    [root@centos7 ~]# yum remove -y `yum list installed | cut -d " " -f 1 | grep php`
    

    ❷ PHP7.3.5를 설치합니다.

    설치되는 모듈은 Apache httpd2.4에도 설치됩니다.
    Apache에서 HTTP/2(mod_http2)가 동작하려면 prefork MPM을 사용할 수 없고, HTTP/2하에서 PHP를 사용하려면 FastCGI로 PHP를 설정해야 합니다. 따라서, Apache와 PHP는 event MPM + PHP-FPM 조합으로 구축합니다.

    yum -y install php
    yum -y install php-devel
    yum -y install php-pdo
    yum -y install php-mysqlnd
    yum -y install php-mbstring
    yum -y install php-gd
    yum -y install php-pear
    yum -y install php-pecl-apc-devel
    yum -y install php-fpm

    설치된 PHP 패키지를 확인합니다.

    [root@centos7 ~]# yum list installed |grep php
    php.x86_64                            7.3.5-1.el7.remi           @remi-php73    
    php-cli.x86_64                        7.3.5-1.el7.remi           @remi-php73    
    php-common.x86_64                     7.3.5-1.el7.remi           @remi-php73    
    php-devel.x86_64                      7.3.5-1.el7.remi           @remi-php73    
    php-fedora-autoloader.noarch          1.0.0-1.el7.remi           @remi          
    php-fpm.x86_64                        7.3.5-1.el7.remi           @remi-php73    
    php-gd.x86_64                         7.3.5-1.el7.remi           @remi-php73    
    php-json.x86_64                       7.3.5-1.el7.remi           @remi-php73    
    php-mbstring.x86_64                   7.3.5-1.el7.remi           @remi-php73    
    php-mysqlnd.x86_64                    7.3.5-1.el7.remi           @remi-php73    
    php-pdo.x86_64                        7.3.5-1.el7.remi           @remi-php73    
    php-pear.noarch                       1:1.10.9-3.el7.remi        @remi          
    php-pecl-apcu.x86_64                  5.1.17-2.el7.remi.7.3      @remi-php73    
    php-pecl-apcu-devel.x86_64            5.1.17-2.el7.remi.7.3      @remi-php73    
    php-process.x86_64                    7.3.5-1.el7.remi           @remi-php73    
    php-xml.x86_64                        7.3.5-1.el7.remi           @remi-php73    
    [root@centos7 ~]# 

    PHP Version 확인

    [root@centos7 ~]# php -v  
    PHP 7.3.5 (cli) (built: Apr 30 2019 08:37:17) ( NTS )  
    Copyright (c) 1997-2018 The PHP Group  
    Zend Engine v3.3.5, Copyright (c) 1998-2018 Zend Technologies  
    [root@centos7 ~]#

    ❷ PHP7.3.5를 설정합니다.

    vi /etc/php.ini
    
    expose_php = On
     ↓
    expose_php = Off
    
    ;date.timezone =
     ↓
    date.timezone = 'Asia/Tokyo'       # 'Asia/Seoul'
    
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
     ↓
    error_reporting = E_ALL & ~E_NOTICE

    ❸ PHP-FPM 설정합니다.

    https://php-fpm.org 공식 홈에서,
    PHP-FPM : A simple and robust FastCGI Process Manager for PHP
    PHP-FPM (FastCGI Process Manager) is an alternative PHP FastCGI implementation with some additional features useful for sites of any size, especially busier sites.

    PHP-MPM은 prefork, worker, event 이렇게 세 가지 종류가 있습니다.
    그중에서 event MPM은 Apache2.4 계열부터 도입된 멀티스레드 & 멀티 프로세스 모듈이며 CPU와 메모리 사용량이 세 가지 중에서 가장 적은 모듈입니다.

    php-fpm을 Apache httpd와 동일한 실행 유저/그룹에서 동작하도록 설정해줍니다.
    기본적인 실행 유저는 daemon입니다.

    vi /etc/php-fpm.d/www.conf
    
    user = apache
    group = apache
     ↓
    user = daemon
    group = daemon

    Apache httpd2.4와 PHP-FPM이 동일한 서버에서 실행되고 있다면, TCP/IP 통신보다 속도가 빠른 UNIX 도메인 소켓을 경유하도록 설정합니다.

    listen = 127.0.0.1:9000
     ↓
    listen = /var/run/php-fpm/php-fpm.sock
    
    ;listen.owner = nobody
    ;listen.group = nobody
    ;listen.mode = 0660
     ↓
    listen.owner = daemon
    listen.group = daemon
    listen.mode = 0660

    PHP-FPM의 로그파일 디렉터리의 권한도 daemon으로 변경해 줍니다.

    chown daemon /var/log/php-fpm

    PHP-FPM을 기동하고 재부팅 시 자동 재시작하도록 설정해 줍니다.

    systemctl start php-fpm
    systemctl enable php-fpm

    SSL서버 인증서 작성하기

    HTTP/2 및 Brotli는 HTTPS가 필수이므로 Apache httpd를 설정하기 전에 SSL서버 인증서를 작성해 둡니다.
    Let's encrypt를 이용해서 작성하려면 [Certbot / Let's encrypt] SSL인증서 적용하기 글을 참고하세요.

    Apache httpd 2.4.39 설정하기

    원본 설정 파일을 백업해 둡니다.

    mv -i /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf.org
    mv -i /usr/local/apache2/conf/extra/httpd-ssl.conf /usr/local/apache2/conf/extra/httpd-ssl.conf.org

    설정 파일을 작성합니다.

    처음에 원본 설정 파일을 수정하면서 작성했으나 500 에러가 발생하면서 문제가 해소되지 않아, 별로의 httpd.conf 파일을 생성 후 작성했습니다. 어떻게 작성할 것인지는 여러분이 선택해 주세요.
    원본 파일 위치 : /usr/local/apache2/conf/httpd.conf.org 또는 /usr/local/apache2/conf/original/httpd.conf

    httpd.conf

    [root@centos7 conf]# vi /usr/local/apache2/conf/httpd.conf
    
    ServerTokens Prod
    ServerSignature Off
    HostnameLookups Off
    ServerRoot "/usr/local/apache2"
    
    Timeout 60
    
    KeepAlive On
    MaxKeepAliveRequests 1000
    KeepAliveTimeout 5
    
    <IfModule mpm_event_module>
        StartServers 3
        MinSpareThreads 75
        MaxSpareThreads 250
        ThreadsPerChild 25
        MaxRequestWorkers 400 
        MaxConnectionsPerChild 0
    </IfModule>
    
    Listen 80
    
    User daemon
    Group daemon
    
    ServerAdmin admin@your-domain.com
    ServerName www.your-domain.com:80
    
    # Example:
    # LoadModule foo_module modules/mod_foo.so
    #
    LoadModule mpm_event_module modules/mod_mpm_event.so  # <<  event MPM만 작동합니다.
    LoadModule authn_file_module modules/mod_authn_file.so
    LoadModule authn_core_module modules/mod_authn_core.so
    LoadModule authz_host_module modules/mod_authz_host.so
    LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
    LoadModule authz_user_module modules/mod_authz_user.so
    LoadModule authz_core_module modules/mod_authz_core.so
    LoadModule access_compat_module modules/mod_access_compat.so
    LoadModule auth_basic_module modules/mod_auth_basic.so
    LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
    LoadModule watchdog_module modules/mod_watchdog.so
    LoadModule reqtimeout_module modules/mod_reqtimeout.so
    LoadModule filter_module modules/mod_filter.so
    LoadModule deflate_module modules/mod_deflate.so
    LoadModule brotli_module modules/mod_brotli.so
    LoadModule mime_module modules/mod_mime.so
    LoadModule log_config_module modules/mod_log_config.so
    LoadModule env_module modules/mod_env.so
    LoadModule expires_module modules/mod_expires.so
    LoadModule headers_module modules/mod_headers.so
    LoadModule setenvif_module modules/mod_setenvif.so
    LoadModule version_module modules/mod_version.so
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
    LoadModule ssl_module modules/mod_ssl.so
    LoadModule http2_module modules/mod_http2.so
    LoadModule unixd_module modules/mod_unixd.so
    LoadModule status_module modules/mod_status.so
    LoadModule autoindex_module modules/mod_autoindex.so
    LoadModule cgid_module modules/mod_cgid.so        #   <<   Qmailadmin 에서 사용합니다.
    LoadModule negotiation_module modules/mod_negotiation.so
    LoadModule dir_module modules/mod_dir.so
    LoadModule alias_module modules/mod_alias.so
    LoadModule rewrite_module modules/mod_rewrite.so
    
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/var/run/php-fpm/php-fpm.sock|fcgi://localhost/"
    </FilesMatch>
    
    <Directory />
        AllowOverride None
        Require all denied
    </Directory>
    
    DocumentRoot "/usr/local/apache2/htdocs"
    
    <Directory "/usr/local/apache2/htdocs">
        Options Includes ExecCGI FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    
    <IfModule dir_module>
        DirectoryIndex index.php index.html
    </IfModule>
    
    <Files ".ht*">
        Require all denied
    </Files>
    
    <IfModule alias_module>
        ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
    </IfModule>
    
    <Directory "/usr/local/apache2/cgi-bin">      #  << .htaccess를 적용합니다.
        #Options Indexes MultiViews FollowSymLinks
        #AllowOverride None
    
        AllowOverride AuthConfig Limit
        Order allow,deny
        Allow from all
    
    </Directory>
    
    ErrorLog "logs/error_log"
    LogLevel warn
    
    <IfModule log_config_module>
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        LogFormat "%h %l %u %t \"%r\" %>s %b" common
        <IfModule logio_module>
          LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
        </IfModule>
        CustomLog "logs/access_log" combined
    </IfModule>
    
    <IfModule mime_module>
        TypesConfig conf/mime.types
        AddType application/x-compress .Z
        AddType application/x-gzip .gz .tgz
    </IfModule>
    
    <IfModule mime_magic_module>
        MIMEMagicFile conf/magic
    </IfModule>
    
    EnableSendfile on
    AddDefaultCharset Off
    
    Include conf/extra/httpd-ssl.conf            #  << SSL설정 파일입니다. (도메인별로 분리해도 무방)
    Include conf/extra/httpd-vhosts-00-anydeny.conf  #   << 가상호스트 설정파일 (하나의 파일에 기재해도 무방)  -- 시작 --
    Include conf/extra/httpd-vhosts-10-service.conf
    Include conf/extra/httpd-vhosts-99-157.14.158.10.conf  # << 가상호스트 설정파일 (하나의 파일에 기재해도 무방)  -- 끝 --
    

    httpd-ssl.conf

    [root@centos7 conf]# vi /usr/local/apache2/conf/extra/httpd-ssl.conf
    
    Listen 443
    SSLPassPhraseDialog builtin
    SSLSessionCache "shmcb:/run/httpd/sslcache(1024000)"
    SSLSessionCacheTimeout 3600
    SSLRandomSeed startup file:/dev/urandom  256
    SSLRandomSeed connect builtin
    SSLCryptoDevice builtin
    SSLStrictSNIVHostCheck off
    
    SSLProtocol -all +TLSv1.2 +TLSv1.3
    
    SSLCipherSuite "TLS_AES_128_GCM_SHA256 \
    TLS_AES_256_GCM_SHA384 \
    TLS_CHACHA20_POLY1305_SHA256 \
    ECDHE-ECDSA-AES128-GCM-SHA256 \
    ECDHE-ECDSA-AES256-GCM-SHA384 \
    ECDHE-ECDSA-AES128-SHA \
    ECDHE-ECDSA-AES256-SHA \
    ECDHE-ECDSA-AES128-SHA256 \
    ECDHE-ECDSA-AES256-SHA384 \
    ECDHE-RSA-AES128-GCM-SHA256 \
    ECDHE-RSA-AES256-GCM-SHA384 \
    ECDHE-RSA-AES128-SHA \
    ECDHE-RSA-AES256-SHA \
    ECDHE-RSA-AES128-SHA256 \
    ECDHE-RSA-AES256-SHA384 \
    DHE-RSA-AES128-GCM-SHA256 \
    DHE-RSA-AES256-GCM-SHA384 \
    DHE-RSA-AES128-SHA \
    DHE-RSA-AES256-SHA \
    DHE-RSA-AES128-SHA256 \
    DHE-RSA-AES256-SHA256 \
    EDH-RSA-DES-CBC3-SHA"
    
    SSLHonorCipherOrder on
    SSLCompression off
    
    SSLUseStapling On
    SSLStaplingCache shmcb:/run/httpd/stapling_cache(128000)
    
    <VirtualHost *:443>
        ServerName www.your-domain.com
        ServerAlias your-domain.com
        DocumentRoot "/usr/local/apache2/htdocs"
    
        AddDefaultCharset UTF-8
    
        Protocols h2 http/1.1
    
        SetOutputFilter BROTLI_COMPRESS;DEFLATE
        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip no-brotli dont-vary
    
        SSLEngine on
        Header always set Strict-Transport-Security "max-age=31536000"
        #SSLCertificateFile /etc/pki/tls/certs/server.crt             # << 주석처리
        #SSLCertificateKeyFile /etc/pki/tls/private/server.key      # << 주석처리
    
        # Let's encrypt                         # << Let's encrypt 를 적용합니다.  -- 시작 --
        SSLCertificateFile /etc/letsencrypt/live/www.your-domain.com/cert.pem     
        SSLCertificateKeyFile /etc/letsencrypt/live/www.your-domain.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateChainFile /etc/letsencrypt/live/www.your-domain.com/chain.pem      # << Let's encrypt 를 적용합니다.  -- 끝 --
    
        ErrorLog "logs/https-error_log"
        CustomLog "logs/https-access_log" combined
    </VirtualHost>  
    
    # 설정할 도메인이 여러개라면 <VirtualHost> 블럭을 복붙하여 편집하면서 추가해주세요. (위에서부터 순서대로 파싱됨)

    설정한 가상호스트 내용을 확인해 봅니다.

    [root@centos7 htdocs]# /usr/local/apache2/bin/httpd -S  
    VirtualHost configuration:
    *:443                  is a NameVirtualHost
             default server www.your-domain.com (/usr/local/apache2/conf/extra/httpd-ssl.conf:42)
             port 443 namevhost www.your-domain.com (/usr/local/apache2/conf/extra/httpd-ssl.conf:42)
                     alias your-domain.com
             port 443 namevhost www.your-domain.co.jp (/usr/local/apache2/conf/extra/httpd-ssl.conf:69)
                     alias your-domain.co.jp
    *:80                   is a NameVirtualHost
             default server any (/usr/local/apache2/conf/extra/httpd-vhosts-00-anydeny.conf:3)
             port 80 namevhost any (/usr/local/apache2/conf/extra/httpd-vhosts-00-anydeny.conf:3)
             port 80 namevhost your-domain.com (/usr/local/apache2/conf/extra/httpd-vhosts-10-service.conf:34)
                     alias www.your-domain.com
             port 80 namevhost your-domain.co.jp (/usr/local/apache2/conf/extra/httpd-vhosts-10-service.conf:64)
                     alias www.your-domain.co.jp
                     wild alias *.your-domain.co.jp
    ServerRoot: "/usr/local/apache2"
    Main DocumentRoot: "/usr/local/apache2/htdocs"
    Main ErrorLog: "/usr/local/apache2/logs/error_log"
    Mutex default: dir="/usr/local/apache2/logs/" mechanism=default 
    Mutex watchdog-callback: using_defaults
    Mutex ssl-stapling-refresh: using_defaults
    Mutex rewrite-map: using_defaults
    Mutex ssl-stapling: using_defaults
    Mutex proxy: using_defaults
    Mutex ssl-cache: using_defaults
    PidFile: "/usr/local/apache2/logs/httpd.pid"
    Define: DUMP_VHOSTS
    Define: DUMP_RUN_CFG
    User: name="daemon" id=2
    Group: name="daemon" id=2
    
    [root@centos7 htdocs]# 

    Include 설정 파일 중에서 반드시 필요한 httpd-vhosts-10-service.conf 파일만 설정합니다.
    나머지 설정이 궁금하다면 CentOS7 - Name Server 구축하기(bind) (4/10) 를 참고하세요.

    Include conf/extra/httpd-vhosts-00-anydeny.conf (skip)
    Include conf/extra/httpd-vhosts-10-service.conf
    Include conf/extra/httpd-vhosts-99-157.14.158.10.conf (skip)

    httpd-vhosts-10-service.conf

    [root@centos7 ~]# vi /usr/local/apache2/conf/extra/httpd-vhosts-10-service.conf
    ...
    
    # 가상호스트 설정 -- 시작 --
    <VirtualHost *:80>
        ServerAdmin admin@your-domain.com
        DocumentRoot "/usr/local/apache2/htdocs"
        ServerName your-domain.com
        ServerAlias www.your-domain.com
    
        <Directory "/usr/local/apache2/htdocs">
            #Options Indexes FollowSymLinks 
        AllowOverride AuthConfig Limit
            Order allow,deny
            Allow from all
        </Directory>
    
        RewriteEngine on
        RewriteMap    lowercase       int:tolower
        RewriteCond   "${lowercase:%{HTTPS}}" !on
        RewriteCond   "${lowercase:%{REQUEST_SCHEME}}"        !https
        RewriteCond   "${lowercase:%{SERVER_PORT}}"   !443
        RewriteCond        "${lowercase:%{HTTP_HOST}}"     "^your-domain\.com$"
        RewriteRule ^(.*)$  https://www.%{HTTP_HOST}$1 [R=301,L]
        RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
    
        ErrorLog "logs/error_log"
        CustomLog "logs/access_log" common
    </VirtualHost>
    # 가상호스트 설정 -- 끝 --
    
    ...

    Apache httpd2.4.39용 systemd 서비스 파일을 작성합니다.

    Apache httpd2.4.39와 PHP-FPM 서비스 파일에는 각각의 의존관계를 추가하여 작성합니다.
    ( 한쪽의 프로세스가 죽으면 나머지도 죽습니다. )

    [root@centos7 ~]# vi /etc/systemd/system/httpd2.service   # <<  Apache2.4.6버전이 있으므로 httpd2.service로 등록합니다.
    
    [Unit]
    Description=The Apache HTTP/2 Server
    After=network.target remote-fs.target nss-lookup.target
    Requires=php-fpm.service          #  <<  의존관계 설정(php-fpm)
    Documentation=man:httpd(8)
    Documentation=man:apachectl(8)
    
    [Service]
    Type=forking
    ExecStart=/usr/local/apache2/bin/apachectl start
    ExecReload=/usr/local/apache2/bin/apachectl graceful
    ExecStop=/usr/local/apache2/bin/apachectl stop
    
    [Install]
    WantedBy=multi-user.target

    PHP-FPM에도 의존관계를 설정합니다.

    [root@centos7 conf]# vi /etc/systemd/system/multi-user.target.wants/php-fpm.service
    [Unit]
    Description=The PHP FastCGI Process Manager
    After=syslog.target network.target
    Requires=httpd2.service        #   <<    의존관계 설정(httpd2)
    ...
    

    작성한 서비스 파일을 systemd에 등록시킵니다.

    systemctl daemon-reload

    systemd에 반영되었는지 확인합니다.

    [root@centos7 ~]# systemctl list-unit-files | grep httpd
    httpd.service                                 enabled
    httpd2.service                                disabled

    httpd서비스를 시작(start) 하고 이상이 없으면(status) 활성화(enable) 해 줍니다.

    [root@centos7 ~]# systemctl start httpd2
    [root@centos7 ~]# systemctl status httpd2
    ● httpd2.service - The Apache HTTP/2 Server
       Loaded: loaded (/etc/systemd/system/httpd2.service; enabled; vendor preset: disabled)
       Active: active (running) since Thu 2019-05-23 17:15:21 JST; 7s ago
      Process: 18744 ExecStart=/usr/local/apache2/bin/apachectl start (code=exited, status=0/SUCCESS)
     Main PID: 18747 (httpd)
       CGroup: /system.slice/httpd2.service
               ├─18747 /usr/local/apache2/bin/httpd -k start
               ├─18748 /usr/local/apache2/bin/httpd -k start
               ├─18749 /usr/local/apache2/bin/httpd -k start
               └─18750 /usr/local/apache2/bin/httpd -k start
    
    May 23 17:15:21 centos7 systemd[1]: Starting The Apache HTTP/2 Server...
    May 23 17:15:21 centos7 systemd[1]: Started The Apache HTTP/2 Server.
    [root@centos7 ~]#
    [root@centos7 ~]# systemctl enable httpd2
    [root@centos7 ~]# systemctl disable httpd    #   << 각자 환경에 따라 다릅니다

    Firewall 설정

    80/TCP, 443/TCP오픈 후 방화벽 리로드

    firewall-cmd --add-port=80/tcp --permanent
    firewall-cmd --add-port=443/tcp --permanent
    firewall-cmd --reload

    적용된 내용을 확인합니다.

    # 각자의 환경에 따라서 다르게 표시됩니다. 
    [root@centos7 conf]# firewall-cmd --list-all
    public (active)
      target: default
      icmp-block-inversion: no
      interfaces: p1p1
      sources: 
      services: samba http dns smtp smtps ssh https imaps   # << 여기에 http https 가 표시되면 OK!
      ports: 1999/tcp
      protocols: 
      masquerade: no
      forward-ports: 
      source-ports: 
      icmp-blocks: 
    

    MySQL 8.0.16 설치

    MySQL 데이터 파일을 백업합니다.

    $ sudo cp -aR /var/lib/mysql/ /var/lib/mysql_bk/

    MySQL5.x을 MySQL8.x버전으로 여러 번 마이그레이션을 시도했으나 실패했기에,

    # yum upgrade mysql-community-server 실패
    # libsasl2.so.2 이 라이브러리를 찾지 못해서 에러발생
    [root@centos7 ~]# sudo yum upgrade mysql-community-server
    Error: Package: mysql-community-server-8.0.16-2.el6.x86_64 (mysql80-community)
               Requires: libsasl2.so.2()(64bit)
     You could try using --skip-broken to work around the problem
     You could try running: rpm -Va --nofiles --nodigest
    
    # 소프트링크를 걸어도 해결되지 않음
    [root@centos7 ~]# ln -s /lib64/libsasl2.so.3.0.0 /lib64/libsasl2.so.2
    [root@centos7 ~]# yum clean all   #  << 에러발생시 캐싱되므로 제거해 줌
    
    # reboot후 다시 시도해도 실패!
    [root@centos7 ~]# sudo yum upgrade mysql-community-server

    여기서 소개하는 방법은 기존에 설치되어있던 MySQL 5.7 패키지를 모두 지운 후에 MySQL파일을 백업 후 MySQL8.x 최신 버전을 설치하는 방법입니다.

    # 설치된 패키지 확인후
    [root@centos7 ~]# yum list installed | cut -d " " -f 1  | grep php
    
    # 불필요한 패키지를 삭제합니다.
    [root@centos7 ~]# yum remove -y `yum list installed | cut -d " " -f 1 | grep php`
    

    MySQL리포지토리를 추가

    최신 버전 확인 후에 리포지토리에 추가합니다.

    https://dev.mysql.com/downloads/repo/yum

    [root@centos7 yum.repos.d]# rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

    MySQL 8.0.16을 설치합니다.

    yum -y install mysql-community-devel
    yum -y install mysql-community-server

    디폴트 인증 플러그인 변경

    MySQL8.0부터 디폴트 인증 플러그인이 mysql_native_password ⇒ caching_sha2_password로 변경되었습니다.
    WordPress5.2.1 버전에서 caching_sha2_password를 지원하지 않기 때문에 디폴트 인증 플러그인을 mysql_native_password으로 변경해 둡니다.

    ※주의!! 만일, 이 변경 작업 전에 mysql -uroot -p 명령으로 DB에 접속해서 SQL문으로 워드프레스 유저를 생성했을 경우, caching_sha2_password 인증 프러그인이 적용되어 워드프레스(WordPress)설치 후 로그인이 안 되는 현상이 발생합니다.
    이때는 DB에서 직접 SQL문으로 mysql_native_password으로 수정해주어야 합니다. (번거로움)

    cacheing_sha2_password
    cacheing_sha2_password

     

    [root@centos7 ~]# vi /etc/my.cnf
    
    #default-authentication-plugin=mysql_native_password
    ↓ 
    default-authentication-plugin=mysql_native_password
    

    MySQL8.0을 기동하고 재부팅 시 자동 재시작하도록 설정해 둡니다.

    systemctl start mysqld
    systemctl enable mysqld

    MySQL 설치 후 초기 설정하기

    ※ MySQL을 처음 설치할 경우에만 실행합니다.
    root 유저의 초기 패스워드는 그대로 사용하지 못하므로 변경해야 합니다.
    아래의 명령으로 초기 패스워드를 찾습니다.

    grep password /var/log/mysqld.log

    초기 패스워드를 확인했으면 mysql_secure_installation 실행하여 패스워드를 변경합니다.

    [root@centos7 ~]# mysql_secure_installation
    
    Securing the MySQL server deployment.
    
    Enter password for user root:     #   << 초기패스워드 입력
    
    The existing password for the user account root has expired. Please set a new password.
    
    New password:      #   << 새로운 패스워드
    
    Re-enter new password:       #   << 한번더
    
    VALIDATE PASSWORD PLUGIN can be used to test passwords
    and improve security. It checks the strength of password
    and allows the users to set only those passwords which are
    secure enough. Would you like to setup VALIDATE PASSWORD plugin?
    
    Press y|Y for Yes, any other key for No: y     #   << VALIDATE PASSWORD을 적용
    
    There are three levels of password validation policy:
    
    LOW Length >= 8
    MEDIUM Length >= 8, numeric, mixed case, and special characters
    STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
    
    Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0    #   << 패스워드 강도를 선택
    Using existing password for root.
    
    Estimated strength of the password: 100
    Change the password for root ? ((Press y|Y for Yes, any other key for No) : y        #   << root 패스워드 변경여부
    
    New password:       #   << 위에서 설정한 password validation policy 레벨에 맞게 입력
    
    Re-enter new password:        #   << 한번더
    
    Estimated strength of the password: 50
    Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y       #   << 추가 설정 여부
    By default, a MySQL installation has an anonymous user, a user account created for them. This is intended only for
    testing, and to make the installation go a bit smoother.
    You should remove them before moving into a production
    environment.
    
    Remove anonymous users? (Press y|Y for Yes, any other key for No) : y         #   << anonymous유저 제거
    Success.
    
    Normally, root should only be allowed to connect from
    'localhost'. This ensures that someone cannot guess at
    the root password from the network.
    
    Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y        #   << 원격에서 root유저 로그인 금지
    Success.
    
    By default, MySQL comes with a database named 'test' that
    anyone can access. This is also intended only for testing,
    and should be removed before moving into a production
    environment.
    
    Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y         #   << 테스트DB 제거
    
    Removing privileges on test database...
    Success.
    Reloading the privilege tables will ensure that all changes
    made so far will take effect immediately.
    
    Reload privilege tables now? (Press y|Y for Yes, any other key for No) :       #    y << privilege table을 리로드해서 변경된 내용을 적용
    Success.
    
    All done!

    설치된 MySQL버전을 확인해 봅니다

    [root@centos7 ~]# mysql --version
    mysql Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)
    [root@centos7 ~]#

    MySQL까지 설치가 끝났으므로 이제 Apache httpd2.4와 MySQL의 로그 로테이션 설정을 해 둡니다.

    로그 로테이션(logrotate.d) 설정

    Apache httpd2.4.39의 로그 로테이션(logrotate.d)을 설정

    vi /etc/logrotate.d/httpd24

    /usr/local/apache2/logs/*log {
    daily
    missingok
    dateext
    rotate 60
    create 644 daemon daemon
    sharedscripts
    postrotate
    /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
    }

    확인

    [root@centos7 ~]# logrotate -dv /etc/logrotate.d/httpd24
    reading config file /etc/logrotate.d/httpd24
    Allocating hash table for state file, size 15360 B
    
    Handling 1 logs
    
    rotating pattern: /usr/local/apache2/logs/*log after 1 days (60 rotations)
    empty log files are rotated, old logs are removed
    considering log /usr/local/apache2/logs/access_log
    ...

    MySQL8.0.16의 로그 로테이션(logrotate.d)을 설정

    vi /etc/logrotate.d/mysql80

    /var/log/mysqld.log {
    create 644 mysql mysql
    notifempty
    weekly
    rotate 5
    missingok
    postrotate
    if test -x /usr/bin/mysqladmin &&
    /usr/bin/mysqladmin --defaults-extra-file=/root/.my.cnf ping &>/dev/null
    then
    /usr/bin/mysqladmin --defaults-extra-file=/root/.my.cnf flush-logs
    fi
    endscript
    }

    확인

    [root@centos7 ~]# logrotate -dv /etc/logrotate.d/mysql80
    reading config file /etc/logrotate.d/mysql80
    Allocating hash table for state file, size 15360 B
    
    Handling 1 logs
    
    rotating pattern: /var/log/mysqld.log weekly (5 rotations)
    empty log files are not rotated, old logs are removed
    considering log /var/log/mysqld.log
    log does not need rotating (log has been rotated at 2019-5-26 8:0, that is not week ago yet)

    MySQL의 root유저의 패스워드 파일을 생성해 둡니다.
    vi /root/.my.cnf

    [mysqladmin]
    user=root
    password="your-password-here" 

    퍼미션을 root 자신으로 변경해 둡니다.

    chown root:root /root/.my.cnf
    chmod 600 /root/.my.cnf

    재부팅 시 자동 재시작 설정 확인

    [root@centos7 ~]# systemctl list-unit-files | grep -e httpd -e php-fpm -e mysqld.service
    httpd.service enabled
    httpd2.service enabled
    mysqld.service enabled
    php-fpm.service enabled
    
    [root@centos7 ~]# systemctl disable httpd
    

     

    WordPress5.2.1 설치

    공식 홈에서는 Apache or Nginx에서 PHP는 7.3 이상, MySQL은 5.6 이상, MariaDB는 10.0 이상을 추천하고 있습니다. [2019/05/27 현재]

    아파치의 도큐먼트 디렉터리를 백업 후 작업합니다.

    mv -i /usr/local/apache2/htdocs /usr/local/apache2/htdocs_org
    

    최신 버전을 확인 후 설치합니다.

    워드프레스(WordPress)의 최신 버전을 확인합니다.

    https://ko.wordpress.org/download/

    워드프레스(WordPress)의 최신버전을 압축을 푼 다음, 아파치의 도큐먼트 루트로 옮깁니다. = 설치

    cd /usr/local/src  
    wget https://wordpress.org/latest.tar.gz
    tar xvzf latest.tar.gz
    
    cd wordpress/  
    cp -R ./* /usr/local/apache2/htdocs #  << 모든 파일과 디렉토리를 DocumentRoot 디렉토리로 이동  
    chown -R daemon /usr/local/apache2/htdocs #  << 소유자를 daemon 으로 변경
    

    WordPress5.2.1 설정

    워드프레스(WordPress)용 데이터베이스와 유저를 생성

    ※ MySQL설정에서 caching_sha2_password를 지원하지 않기 때문에 디폴트 인증 플러그인을 mysql_native_password으로 변경한 후에 작업을 진행하시기 바랍니다

    [root@centos7 ~]# mysql -u root -p
    
    Enter password:  
    Welcome to the MySQL monitor. Commands end with ; or \g.
    
    Your MySQL connection id is 9  
    Server version: 8.0.16 MySQL Community Server - GPL  
    Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.  
    Oracle is a registered trademark of Oracle Corporation and/or its  
    affiliates. Other names may be trademarks of their respective  
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> CREATE DATABASE your-wordpress-database-name;     #  << B를 생성  
    Query OK, 1 row affected (0.10 sec)
    
    mysql> CREATE USER your-user-id@localhost IDENTIFIED BY ‘your-password';   # << admin유저 생성  
    Query OK, 0 rows affected (0.07 sec)
    
    mysql> GRANT ALL ON your-wordpress-database-name.* TO your-user-id@localhost;      #  <<  생성한 DB를 사용할 수 있는 권한부여  
    Query OK, 0 rows affected (0.07 sec)
    
    mysql> \q
    
    Bye
    

    워드프레스(WordPress) 설정 파일 작성

    cd /usr/local/apache2/htdocs  
    mv -i wp-config-sample.php wp-config.php
    

    워드프레스(WordPress) 설정 파일 편집

    vi /usr/local/apache2/htdocs/wp-config.php

    # 조금전에 설정한 DB정보를 입력합니다.  
    define('DB_NAME', 'your-wordpress-database-name');  
    define('DB_USER', 'your-user-id');  
    define('DB_PASSWORD', 'your-password');
    
    # 인증용 유니크 키는 설정 파일내에 적혀있는 링크↓↓↓를 클릭해서 복붙합니다.  
    # https://api.wordpress.org/secret-key/1.1/salt/
    
    define('AUTH\_KEY', 'kDSR^2:!)sdfsdfsdfRY8nB<lVpgZ/sxF\[xFO;_)RF1 0I{fNZ43M');  
    define('SECURE\_AUTH\_KEY', '<^ \*+~kmW&|f,XnD6da=sdfsdfsdfsWvB,1sdfsf-i\_5)Ch');  
    define('LOGGED\_IN\_KEY', 'wya;Kf=Oz-UO+Xsdfsdfsdffsdfs&!PTRtpPGm\]&=sdfi+\[0B_TPR)Y');  
    define('NONCE\_KEY', 'JnP+.x|(9,3n5\_n:C5E#;lsdfsdfs<wd{}ia}#2\_Yg+Asdfn=lse6u^L');  
    define('AUTH\_SALT', 'A-Z`6>!v|BO&5sdfsdfsdt.W,JdK:a}J9FNosdfsdf/,T&2${UPN-S'); 
    define('SECURE_AUTH_SALT', 'PnOojakOe/k|#9L0`:;75hsdfsdfsdfGn23ewds//sZ5}_s>C#>b%_x<sIf');  
    define('LOGGED\_IN\_SALT', 'VxuB(>As\_=h322EwKRnIc)21?p|kqsdfsdfAkcRXw&VWGX61');  
    define('NONCE\_SALT', '|O?)ZZ|</-g\_m,1213asdfsdfsdJ#DLLxd3HU\];C+UmNZ\[ZsY{');
    

    소유자만 볼 수 있도록 권한을 수정해 둡니다.

    [root@centos7 htdocs]# chmod 600 /usr/local/apache2/htdocs/wp-config.php  
    [root@centos7 htdocs]# ll /usr/local/apache2/htdocs/wp-config.php  
    -rw------- 1 daemon root 4185 May 23 23:59 wp-config.php
    

    워드프레스(WordPress)의 웹 설정

    ❶ 워드프레스가 처음이라면( = 익숙하지 않다면) readme.html 파일을 읽어봅니다.

    https://your-domain.com/readme.html

    ❷ 초기 설정을 위하여 wp-admin/install.php를 브라우저에서 엽니다.

    https://your-domain.com/wp-admin/install.php

    위 링크를 열기 전에 wp-config.pip 파일 설정이 완료되어야 합니다.
    암호를 입력하지 않으면 암호가 자동 생성됩니다.
    사용자 이름을 입력하지 않으면 사용자 이름 admin입니다.

    워드프레스 웹설정
    워드프레스 웹설정

    ❸ 설치가 완료되면 wp-admin/install.php로 접속해도 로그인 페이지로 Redirection 됩니다.

    https://your-domain.com/wp-login.php
    메일 주소를 입력한 경우 해당 메일 주소로 "새로운 WordPress 사이트 설치에 성공했습니다."라는 메일이 날아옵니다. 

    설정한 계정정보로 로그인합니다.

    wordpress login window
    wordpress login window

    로그인후 첫화면

    WordPress Dashboard
    WordPress Dashboard

     

    이상으로 기본적인 구축과 설정을 마칩니다.
    워드프레스(WordPress)를 사용하기 위해서는 이제부터 시작이지만, 일단 여기까지 합니다.

    웹상에서의 워드프레스 사이트 구성에 대해서는 다른 글에서 다루겠습니다.

     

     

    [트러블슈팅]

    MySQL8.x 버전에서 워드프레스가 DB 접속 에러(데이터베이스 접속 에러)가 발생할 경우

    워드프레스(WordPress)를 디버깅 모드로 변경 후 브라우저에서 에러 메시지 확인하면서 대응

    [root@centos7 htdocs]# vi wp-config.php
    
    define('WP_DEBUG', false);  
    ↓↓↓  
    define('WP_DEBUG', true);
    

    https://your-domain.com/wp-admin에 접속하면 상단에 에러 메시지가 표시됨

    caching_sha2_password
    caching_sha2_password

    caching_sha2_password 문제임을 확인

    ❷ 기존 유저의 인증방식을 확인해서 mysql_native_password로 변경 (DB에서 직접 작업)

    [root@centos7 htdocs]#mysql -uroot -p  
    Enter password:  
    ...
    
    mysql>SELECT user, host, plugin FROM mysql.user;
    
    +------------------+-----------+-----------------------+  
    | user | host | plugin |  
    +------------------+-----------+-----------------------+  
    | root | % | mysql_native_password |  
    | mysql.infoschema | localhost |caching_sha2_password|  
    | mysql.session | localhost | mysql_native_password |  
    | mysql.sys | localhost |caching_sha2_password|  
    | root | localhost | mysql_native_password |  
    |your-wp-admin | localhost |caching_sha2_password |   # << your-wp-admin유저의 인증방식이 caching_sha2_password  
    +------------------+-----------+-----------------------+
    
    10 rows in set (0.00 sec)  
    mysql>  
    mysql>ALTER USER 'your-wp-admin'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your-password';  
    Query OK, 0 rows affected (0.06 sec)
    
    mysql>SELECT user, host, plugin FROM mysql.user;  
    +------------------+-----------+-----------------------+  
    | user | host | plugin |  
    +------------------+-----------+-----------------------+  
    | root | % | mysql_native_password |  
    | mysql.infoschema | localhost | caching_sha2_password |  
    | mysql.session | localhost | mysql_native_password |  
    | mysql.sys | localhost | caching_sha2_password |  
    | root | localhost | mysql\_native_password |  
    |your-wp-admin | localhost |mysql_native_password| # << your-wp-admin유저의 인증방식이 mysql_native_password  
    +------------------+-----------+-----------------------+  
    10 rows in set (0.00 sec)
    
    mysql>flush privileges;  
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> \q
    
    Bye  
    
    

    ❸ 신규 유저를 생성 시의 인증방식을 변경해 둡니다

    위에서 적용했던 방식입니다. 워드프레스 유저는 이곳에 인증방식을 변경 후에 생성하는 게 좋습니다.

    vi /etc/my.cnf

    [mysqld]  
    ...  
    default-authentication-plugin = mysql_native_password  
    ...  

     

     

    참고사이트: https://blog.apar.jp/linux/11174/

    반응형