목차 (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을 이용해서 웹사이트의 속도를 향상하도록 구축합니다.
현재 설치되어 있는 패키지 / 버전
- CentOS 7.6.1810(Core)
- OpenSSL 1.0.2k-fips 26 Jan 2017
- PHP 5.6
- Apache 2.4.6
- mysql-community-common-5.7.26-1.el7.x86_64
- WordPress 4.5
업그레이드 또는 설치되는 패키지 / 버전
- CentOS 7.6.1810(Core)
- OpenSSL 1.1.1b 26 Feb 2019
- nghttp nghttp2/1.38.0
- Brotli-1.0.7
- PHP 7.3.5 (cli) (built: Apr 30 2019 08:37:17) ( NTS )
- apr-1.7.0
- apr-util-1.6.1
- Apache/2.4.39 (Unix)
- mysql Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)
- 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으로 수정해주어야 합니다. (번거로움)
[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)를 사용하기 위해서는 이제부터 시작이지만, 일단 여기까지 합니다.
웹상에서의 워드프레스 사이트 구성에 대해서는 다른 글에서 다루겠습니다.
[트러블슈팅]
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 문제임을 확인
❷ 기존 유저의 인증방식을 확인해서 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/
'리눅스 > CentOS7' 카테고리의 다른 글
CentOS7 - 큐메일(Qmail) 서버 구축하기 (5/10) (0) | 2019.05.29 |
---|---|
CentOS7 - Windows File Server(Samba) 구축하기(7/10) (0) | 2019.05.25 |
CentOS7 - Name Server 구축하기(bind) (4/10) (0) | 2019.05.25 |
CentOS7 - 무료도메인 취득/설정하기 (freenom) (3/10) (0) | 2019.05.25 |
CentOS7 - 초기설정/보안설정 (2/10) (0) | 2019.05.25 |