사이트가 문제가 있어서 서버부터 워드프레스까지 전부 새로 설치를 했다. 그렇지만 워드프레스 데이타베이스를 그대로 사용했으니 완전한 클린 설치라고는 할 수 없을 것 같긴하다.
그 전 단계를 간략히 정리해 본다. 다음부터는 이를 참조하면 단기간애 서버 설치에서 워드프레스 설치까지 할 수 있을 것 같다. 설치하면서 여기저기 자료를 참조하기가 너무 힘들어서 한번에 참조할 수 있는 자료가 있었으면 좋겠다는 생각을 했다. 그 마스터 자료로 앞으로 개인적으로 활용하고자 한다.
여기서는 우분투 17.10을 기반으로 Nginx 1.13.6, PHP7.1.10, Marian DB 10.2와 같은 웹서버 기본 세팅과 가장 기본적인 보안 설정, 사이트 속도를 올려줄 ngx_pagespeed 설치, Lets’ Encrypt SSL 인증서 설치 그리고 워드프레스 설치의 모든 단계를 짚어 보았다.
1. 우분투 17.10을 선택하다.
우분투를 어떤 버젼을 적용할지 많른 고민을 했다. 장기전인 운용을 염두에 둔다면 16.04버젼을 사용해야 한다. 그렇지만 최신 소프트웨어를 사용해야 직성이 풀리는 본인으로서는 가장 최근 2017년 10월 20일 발표된 17.10 코드명 Artful Aardvark을 적용하였다.
여기 엡서버 세팅은 라엘님의 안내서를 기반으로 최신 버젼으로 바뀐 부분들은 구글링을 자료를 기반으로 업데이트 했다.
아래는 주로 참조했던 자료들이다.
Lael, Ubuntu 16.04 LTS 웹서버 세팅방법 (Nginx + PHP7-FPM + MariaDB)
Install PHP 7.1 with Nginx on an Ubuntu 16.04 VPS
Amir Alamani, How to install MariaDB 10 on Ubuntu 16 & Debian 8)
내가 사용하고 있는 Vultr(아마 다른 가상서버호스팅도 마찬가지)에서는 운영 체제를 선택하면 자동으로 운영체제까지는 자동으로 설치하고 그 이후부턱 개인이 작업 할 수 있도록 해준다.
아래 단계는 운영 체제가 설치된 상황하에서 NGINX 서버 등 관련 소프트웨어를 설치하는 과정을 정리하였다.
1.1. 쉘 기본 언어값 확인
제일 먼저 쉘 기본 언어값 확인한다. apache2 명령어을 적용 시 영어로만 나오면 그냥 넘어가고 중국어나 일본어 나온다면 영어로 바꾸어야 한다.
이번 작업의 경우 아래처럼 영어로 나와서 넘어간다.
# apache2
The program 'apache2' is currently not installed. You can install it by typicdng :
apt install apache2-bin
Code language: PHP (php)
만약 영어가 아닌 다른 언어가 나온다면 /etc/default/locale 의 파일 내용을 변경한다.
# vi /etc/default/locale
Code language: PHP (php)
에서 아래 내용을 반영한다.
LANG="en_US.UTF-8"
LANGUAGE="en"
Code language: PHP (php)
1.2. 현 운영체제의 프로그램을 최신으로 업데이트
# apt-get update
# apt-get upgrade -y
Code language: PHP (php)
1.3. 시스템 시간 설정
dpkg-reconfigure tzdata
Code language: PHP (php)
GUI 환경에서 Asia를 선택하고 이어서 Seoul을 선택한다.
그러면 아래와 같은 결과를 출력한다.
Current default time zone: 'Asia/Seoul'
Local time is now: Sat Oct 14 16:24:42 KST 2017.
Universal Time is now: Sat Oct 14 07:24:42 UTC 2017.
Code language: PHP (php)
1.4. 메일 발송프로그램 설치하기
메일을 발송할 수 있는 sendmail 프로그램을 설치, 압축 해제 프로그램 그리고 SSL을 위한 letsencrypt도 같이 설치하자. 뒤에서 나오는 작업을 하다보면 설치하라고 나오는 프로그램들이다.
메일 발송 프로그램은 시간이 조금 걸린다. 인내를 가지고 기다려야 한다.
apt-get install sendmail -y
apt install unzip
apt install letsencrypt -y
Code language: PHP (php)
그러나 보안상의 이유로 메일 발송 프로그앰은 서버에서 사용하지말라는 권고가 많으므로 참고하길..
1.5. APT 소스리스트 파일에 Nginx, PHP, MariaDB 저장소 추가
sources.list를 열어서 파일 맨 끝에 소스리스트를 추가
# vi /etc/apt/sources.list
Code language: PHP (php)
파일 맨 끝에 아래 내용 추가
# Nginx
deb https://packages.nginx.org/unit/ubuntu/ artful unit
deb-src https://packages.nginx.org/unit/ubuntu/ artful unit
# MariaDB 10.2 repository list - created 2018-01-11 12:11 UTC
# http://downloads.mariadb.org/mariadb/repositories/
deb [arch=amd64,i386] http://ftp.kaist.ac.kr/mariadb/repo/10.2/ubuntu artful main
deb-src http://ftp.kaist.ac.kr/mariadb/repo/10.2/ubuntu artful main
Code language: PHP (php)
1.6. 각 저장소 보안키 다운로드 후 시스템에 등록
nginx 보안키 다운로드 후 적용한다.
cd /root
wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key
rm nginx_signing.key
Code language: PHP (php)
다음으로는 MariaDB 보안키 다운로드 후 적용.
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
Code language: PHP (php)
다음으로는 PHP 저장소 추가 및 보안키 등록
# apt-get install software-properties-common
# add-apt-repository ppa:ondrej/php
Code language: PHP (php)
add-apt-repository ppa:ondrej/php를 실행하면 여기서 아래와 같은 메세지가 나오면서 엔터를 치라는 메세지가 나오는데요. 고민하지말고 엔터를 치면됩니다.
Co-installable PHP versions: PHP 5.6, PHP 7.x and most requested extensions are included.
You can get more information about the packages at https://deb.sury.org
BUGS&FEATURES: This PPA now has a issue tracker:
https://deb.sury.org/#bug-reporting
CAVEATS:
1. If you are using php-gearman, you need to add ppa:ondrej/pkg-gearman
2. If you are using apache2, you are advised to add ppa:ondrej/apache2
3. If you are using nginx, you are advise to add ppa:ondrej/nginx-mainline
or ppa:ondrej/nginx
PLEASE READ: If you like my work and want to give me a little motivation, please consider donating regularly: https://donate.sury.org/
WARNING: add-apt-repository is broken with non-UTF-8 locales, see
https://github.com/oerdnj/deb.sury.org/issues/56 for workaround:
# LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php
More info: https://launchpad.net/~ondrej/+archive/ubuntu/php
Press [ENTER] to continue or ctrl-c to cancel adding it
Code language: PHP (php)
여기서 엔터를 눌러주면 된다..
추가된 보안키 목록을 보려면 아내 명령어를 이용한다,
# apt-key list
Code language: PHP (php)
/etc/apt/trusted.gpg
--------------------
pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62
uid [ unknown] nginx signing key <signing-key@nginx.com>
pub rsa4096 2016-03-30 [SC]
177F 4010 FE56 CA33 3630 0305 F165 6F24 C74C D1D8
uid [ unknown] MariaDB Signing Key <signing-key@mariadb.org>
sub rsa4096 2016-03-30 [E]
/etc/apt/trusted.gpg.d/ondrej_ubuntu_php.gpg
--------------------------------------------
pub rsa1024 2009-01-26 [SC]
14AA 40EC 0831 7567 56D7 F66C 4F4E A0AA E526 7A6C
uid [ unknown] Launchpad PPA for Ondřej Surý
/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-archive.gpg
------------------------------------------------------
pub rsa4096 2012-05-11 [SC]
790B C727 7767 219C 42C8 6F93 3B4F E6AC C0B2 1F32
uid [ unknown] Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>
/etc/apt/trusted.gpg.d/ubuntu-keyring-2012-cdimage.gpg
------------------------------------------------------
pub rsa4096 2012-05-11 [SC]
8439 38DF 228D 22F7 B374 2BC0 D94A A3F0 EFE2 1092
uid [ unknown] Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>
Code language: PHP (php)
지금까지 작업한 APT 패키지 정보를 업데이트 한다.
# apt-get update
Code language: PHP (php)
2. Nginx 설치
Nginx를 설치하고 nginx를 다시 가동(restart)시킨다.
# apt-get install nginx
# service nginx restart
# nginx -v // Version check
Code language: PHP (php)
2017년 10월 23일 현재 설치 버젼을 체크해 보니 1.13.6이 나온다
3. PHP 7.2치
PHP7-FPM 최신버전인 PHP7.2를 설치한다. 2018년 1월 11일 현재 최신 버젼은 PHP7.2.1이다..
# apt-get install php7.2
Code language: PHP (php)
PHP7,2을 설치하고나서 관련 모듈을 설치한다. 이 과정에서 일반적으로 널리 사용되는 모듈 list가 많이 돌아다니고 있으므로 이를 기준으로 설치해도 되고, 아니면 PHP7,2 모듈 패키지 리스트를 보고 선택을 다시 할 수도 있다.
아래 명령은 PHP 7.2 modules 리스트를 알려주는데 이를 보고 추가할 모듈 패키지가 있는지 볼 수 있다.
# apt-cache search php7.2
Code language: PHP (php)
위 명령을 내리면 아래와 같은 list가 쭈욱 나온다. 여기를 보고 추가할 모듈 리스트를 추가한다. 그렇지만 대개는 일반적으로 필요하다고 이야기되는 리스트 중심으로 설치하기 마련이다.
그 다음으로는 일반적인 PHP 모듈을 설치한다. Install most commonly used modules
# apt-get install php7.2 php7.2-fpm php7.2-cli php7.2-common php7.2-json php7.2-opcache php7.2-mysql php7.2-mbstring php7.2-mcrypt php7.2-zip php7.2-fpm php7.2-gd php7.2-curl php7.2-xml php7.2-mcrypt php7.2-readline
Code language: PHP (php)
php.ini 파일 수정
파일 수정은 fpm과 cli 폴더의 php.ini를 모두 수정해 주어야 한다.
- date.timezone을 찾아 Asia/Seoul로 변경
- cgi.fix_pathinfo=0 값으로 변경
- 쿠키값 보안을 위해서 session.cookie_httponly 와 session.cookie_secure 값을 1을 준다.
# vi /etc/php/7.2/fpm/php.ini
# vi /etc/php/7.2/cli/php.ini
Code language: PHP (php)
아래 변경 결과
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Seoul
Code language: PHP (php)
PHP 기본 세팅의 변경,
아래는 PHP 기본 세팅을 변경하는 명령어인데 제한적이지만 작용은 한다. 단 cli폴더와 fpm 폴더에 있는 php.ini 파일 모두가 변경되는 것은 아니다.
sed -i "s/memory_limit = .*/memory_limit = 256M/" /etc/php/7.2/fpm/php.ini
sed -i "s/upload_max_filesize = .*/upload_max_filesize = 1024M/" /etc/php/7.2/fpm/php.ini
sed -i "s/zlib.output_compression = .*/zlib.output_compression = on/" /etc/php/7.2/fpm/php.ini
sed -i "s/max_execution_time = .*/max_execution_time = 18000/" /etc/php/7.2/fpm/php.ini
Code language: PHP (php)
PHP-FPM 프로세스 매니저는 Static, Dynamic and Ondemand의 3가지방법이 있는데 설치시 기본은 Dynamic이다. 이를 Ondemand로 변경한다. 변경은 /etc/php/7.2/fpm/pool.d/www.conf 내용을 변경하고, /etc/php/7.2/fpm/pool.d/www.conf.org는 삭제한다. (이 파일은 없는 경우도 있다)
[www]
user = www-data
group = www-data
listen = /run/php/php7.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
pm = ondemand
pm.max_children = 200
pm.start_servers = 15
pm.min_spare_servers = 10
pm.max_spare_servers = 100
pm.process_idle_timeout = 10s
pm.max_requests = 200
chdir = /
php_admin_value[post_max_size] = 1024M
php_admin_value[upload_max_filesize] = 1024M
Code language: PHP (php)
php.ini 파일 수정이 끝나면 PHP-FPM service를 다시 시작한다.
# systemctl restart php7.2-fpm.service
Code language: PHP (php)
4. MariaDB 설치
안정화된 MariaDB는 10.2까지 출시되어 있었다.(2017년 10월 20일)
MariaDB Downloads, Setting up MariaDB Repositories
4.1. MariaDB 10.2 설치 준비
앞에서 저장소와 키를 등록했으므로 간단하게 아래 명령으로 MariaDB를 설치할 수 있다.
# apt-get update
# apt-get -y install mariadb-server
Code language: PHP (php)
아래는 MariaDB 재단에서 제공하는 Ubuntu 17.10에서 MariaDB를 설치하는 명령어이다.
에서서 PPA와 키를 등록하지 않았다면 아래 명령을 사용해도 좋다.
# apt-get install software-properties-common
# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
# add-apt-repository 'deb [arch=amd64,i386] http://ftp.kaist.ac.kr/mariadb/repo/10.2/ubuntu artful main'
Code language: PHP (php)
만약 운영체제가 널리 사용되는 우분투 16.04이라면 아래와 같다.
앞의 두분은 같고 마지막 세줄만은 artful을 xenial로 바뀐다.
# apt-get install software-properties-common
# apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
# add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://ftp.kaist.ac.kr/mariadb/repo/10.2/ubuntu xenial main'
Code language: PHP (php)
4.2. MariaDB 10.2 설치
위에서 키와 저장소 정보를 가져오게 되면 아래 명령어로 MariaDB를 설치할 수 있다.
# apt update
# apt -y install mariadb-server
Code language: PHP (php)
설치 도중에 New password를 설정하는 화면이 나온다. 설치가 완료된 후 서비스 상태를 확인할 수 있다,
# service mysql status
Code language: PHP (php)
4.3. PHP-FPM에 DB 연동관련 모듈설치
# apt-get install php7.2-mysql
Code language: PHP (php)
기본 언어셋 설정
이는 매우 중요한 세팅으로 반드시 필요하다.
# vi /etc/mysql/conf.d/mariadb.cnf
Code language: PHP (php)
아래 내용으로 변경한다.
# MariaDB-specific config file.
# Read by /etc/mysql/my.cnf
Code language: PHP (php)
[client]
# Default is Latin1, if you need UTF-8 set this (also in server section) default-character-set = utf8mb4
[mysqld]
# # * Character sets # # Default is Latin1, if you need UTF-8 set all this (also in client section) # character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci character_set_server = utf8mb4 collation_server = utf8mb4_unicode_ci
변경 내용을 반영해 DB를 다시 시작한다,
service mysql restart
Code language: PHP (php)
1.8.2. Nginx 와 PHP-FPM 연결
nginx는 기본적으로 nginx 사용자 권한으로 실행되고, PHP-FPM 프로그램은 기본적으로 www-data 사용자 권한으로 실행되므로 둘의 사용자 권한을 www-data로 일치시킨다.
vi /etc/nginx/nginx.conf
Code language: PHP (php)
- user nginx; 를 user www-data; 로 변경
- worker_processes 1; 를 worker_processes auto; 로 바꾼다. 고사양 서버에서 성능이 더 좋아진다고. 일반적으로 트래픽이 적은면 1을 사용하고 트래픽이 많아지면 auto를 사용한다.
service nginx restart
Code language: PHP (php)
vi /etc/nginx/conf.d/default.conf
Code language: PHP (php)
fastcgi_params 내용 수정
fastcgi_params를 열어서 아래 내용으로 변경한다.
vi /etc/nginx/fastcgi_params
Code language: PHP (php)
아래와 같이 변경
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTPS $https;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
Code language: PHP (php)
5. 웹서버 보안 설정
보안에 대해서는 아래 내용을 참조하라
가상서버호스팅에서 서버 보안 설정 방법 – Nginx +Ubuntu 16.04의 경우
랜섬웨어 대응, 서버 및 워드프레스 필수 보안 설정 15가지
가장 기본이 되는 방화벽 설정이다.
- 일반 및 SSL 설치 시 작동 가능토록 80, 443포트는 열어둔다.
- ssh에서 널리 알려진 22포트는 해킹의 집중 대상이 되므로 자신많이 알수 있는 포트를 바꾼다. 이 작업은 sshd_config에서 사용할 포트를 지정해야 한다.
- /etc/ssh/sshd_config 에서 Port 22 를 찾아서 자기가 사용할 포트 숫자를 기억하기 쉽고 10000자리이상에서 임의의 숫자를선택한다. 예를 들어 58722, 65322 등등
ufw enable # 방화벽을 활성화한다.
ufw allow 80/tcp # 일반 웹 정보 관련 입출력 통로
ufw allow 443/tcp # SSL 설치 시 웹정보 관련 입출력 통로
ufw allow ****/tcp # ssh용 신규 포트
ufw deny 22/tcp # ssh용으로 22포트를 사용할 수 없게 한다.
Code language: PHP (php)
6. ngx_pagespeed 설정
워드프레스 속도를 빠르게 만들기위해 구글에서 만든 ngx_pagespeed를 설치한다. 이것을 설치 시 구글 어낼리틱스 코드를 추가하면 별도로 워드프레스에서 구글 어낼리틱스 관련 작업할 필요가 없다.
또 이미지 압축이나 CSS 압축등의 기존 캐시 프로그램이 하는 일들을 대신해 준다. 그외 여러가지 기능이 있다.
add
6.1. 작업 폴더로 이동하기
아래 작업 방식은 아래를 주로 참조하였다,
[워드프레스 속도 개선] Nginx에 페이지스피드(mod_PageSpeed)설치 방법 두번째
그리고 위의 글도 이 방식을 소개한 우성군의 글에서 대부분의 생각을 빌려왔다.
자기가 작업할 폴더로 이동한다,
cd /usr/local/src
Code language: PHP (php)
6.2. ngx_pagespeed 소스 다운 받기
소스를 받으려면 최신 버젼 확인해야 한다. 아래로 들어가서 최신 버젼 확인
최신 버젼 확인 PageSpeed Release Notes
2017년 10월 14일 현재 최신 버젼은 1.12.34.3-stable임을 알 수 있다.
앞으로 1.12.34.3버젼을 많이 사용할 것이므로 이를 연결하는 명령을 준다. NPS_VERSION을 적용하면 이곳은 1.12.34.3로 인식한다고
NPS_VERSION=1.12.34.3
Code language: PHP (php)
아래 ngx_pagespeed 소스 받는 명령어
wget https://github.com/pagespeed/ngx_pagespeed/archive/v${NPS_VERSION}-stable.zip
unzip v${NPS_VERSION}-stable.zip
rm -f v${NPS_VERSION}-stable.zip
cd ngx_pagespeed-${NPS_VERSION}-stable/
psol_url=https://dl.google.com/dl/page-speed/psol/${NPS_VERSION}.tar.gz
[ -e scripts/format_binary_url.sh ] && psol_url=$(scripts/format_binary_url.sh PSOL_BINARY_URL)
wget ${psol_url}
tar -xzvf $(basename ${psol_url})
cd ../
Code language: PHP (php)
6.3. Nginx 소스 컴파일 설치
이제 Nginx모듈을 설치하자. 작업 폴더로 이동해 기본 필수 패키지를 설치한다..
cd /usr/local/src
apt-get -y install build-essential libpcre3 libpcre3-dev zlib1g-dev unzip git
Code language: PHP (php)
Nginx 소스 파일을 다운받는다. 작업 당시 최신버젼은 1.13.6이었다. 버젼이 바뀌면 바뀐 버젼으로 변경
wget -c https://nginx.org/download/nginx-1.13.6.tar.gz
tar zxf nginx-1.13.6.tar.gz
rm -f nginx-1.13.6.tar.gz
Code language: PHP (php)
6.4. Nginx 컴파일을 설치
- root로 이동, 불필요한 문제를 만들지 않기 위해 루트에서 작업
- 먼저 몇가지 필요한 라이브러리를 설치
- Nginx 최신 버젼을 받아 놓은 곳으로 이동
- 여러가지 모듈을 같이 설치
ngx_pagespeed만 설치할수도 있는데 단독 설치 시 제대로 설치된 않는 경우가 있어서(아마 어디서 출돌이 생기는지 모르겠음) 같이 설치함
cd ~ # 루트로 이동
apt -y install libperl-dev libpcre3 libpcre3-dev libssl-dev openssl libgd2-xpm-dev libgeoip-dev zlib1g-dev libxslt-dev
cd /usr/local/src/nginx-1.13.6
./configure --with-cc-opt='-Wno-deprecated-declarations' --sbin-path=/usr/sbin/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/run/nginx.pid --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-stream_realip_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module --add-module=../ngx_pagespeed-${NPS_VERSION}-stable ${PS_NGX_EXTRA_FLAGS}
make install
Code language: PHP (php)
6.5. 최적화 setting
nginx.conf에서 최적화 옵션 적용
아래는 시스템에 적용된 내용이다.
# enable pagespeed module on this server block
pagespeed on;
# let's speed up PageSpeed by storing it in the super duper fast memcached
#pagespeed MemcachedThreads 1;
#pagespeed MemcachedServers "localhost:11211";
# This setting should be enabled when using HTTPS
# Take care when using HTTP > HTTPS redirection to avoid loops
pagespeed MapOriginDomain http://happist.com https://happist.com;
# show half the users an optimized site, half the regular site
pagespeed RunExperiment on;
pagespeed AnalyticsID UA-64766674-1;
pagespeed ExperimentVariable 1;
pagespeed ExperimentSpec "id=1;percent=50;level=CoreFilters;enabled=collapse_whitespace,remove_comments;";
pagespeed ExperimentSpec "id=2;percent=50";
pagespeed EnableFilters extend_cache;
pagespeed JpegRecompressionQuality 65;
pagespeed RewriteLevel CoreFilters;
# Filter settings
pagespeed DisableFilters convert_jpeg_to_webp;
pagespeed DisableFilters lazyload_images;
pagespeed EnableFilters defer_javascript; # 페이지 로딩 완료 시까지 자바 실행 지연
pagespeed EnableFilters insert_dns_prefetch; # DNS resolution time 축소
pagespeed EnableFilters prioritize_critical_css;
pagespeed EnableFilters make_google_analytics_async,make_show_ads_async;
# 이미지관련 대부분이 Core에 기본으로 들어가 있음, 사용하지 않으려면 비활성화 해야 함 예를 들어 pagespeed DisableFilters convert_to_webp_animated; 기본 rewrite_images, convert_jpeg_to_progressive, convert_png_to_jpeg, convert_jpeg_to_webp, convert_to_webp_lossless, inline_images, recompress_images, recompress_jpeg, recompress_png, recompress_webp, convert_gif_to_png, strip_image_color_profile, strip_image_meta_data, jpeg_sampling, resize_images, resize_rendered_image_dimensions,
pagespeed EnableFilters sprite_images;
pagespeed EnableFilters resize_mobile_images;
# needs to exist and be writable by nginx 755로 되어 있음
# cache 비우는 방법 Flushing PageSpeed Sever-ide Cache
# rm -rf /var/ngx_pagespeed_cache/* or touch /var/ngx_pagespeed_cache/cache.flush
# ngxrestart
pagespeed FileCachePath /var/ngx_pagespeed_cache;
pagespeed FileCacheSizeKb 1024000000; # cache를 적용 후 다 차면 비운다
pagespeed FileCacheInodeLimit 50000000;
pagespeed CssFlattenMaxBytes 5120;
pagespeed LRUCacheKbPerProcess 8192;
pagespeed LRUCacheByteLimit 16384;
# onfiguring SSL Certificates
pagespeed SslCertDirectory directory;
pagespeed SslCertFile file;
pagespeed RewriteLevel CoreFilters;
pagespeed FetchWithGzip on;
Code language: PHP (php)
6.6. ngx_pagespeed 설치 유무 간단 확인
ngx_pagespeed가 설치되었는지 간단히 확인하는 방법이다.
nginx -V(대문자)를 치면 시스템에 설치된 nginx 관련 모듈 리스트가 뜨는데 여기에 ngx_pagespeed가 나오면 제대로 설치된 것이다.
nginx -V
Code language: PHP (php)
그러면 아래와 같은 모듈 리스트가 뜬다. 여기에 ngx_pagespeed가 있는지 확인해 보자.
nginx version: nginx/1.13.6
built by gcc 7.2.0 (Ubuntu 7.2.0-8ubuntu3)
built with OpenSSL 1.1.0f 25 May 2017
TLS SNI support enabled
configure arguments: --with-cc-opt=-Wno-deprecated-declarations --sbin-path=/usr/sbin/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/run/nginx.pid --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-stream_realip_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-http_v2_module --add-module=../ngx_pagespeed-1.12.34.3-stable
Code language: PHP (php)
7. Let’s Encrypt 무료 SSL인증서 발급
보안의 일종으로 Let’s Encrypt 무료 SSL인증서 발급해 보자. 이 글은 주로 아래 글을 참조하였다.
[워드프레스 Tips] Let’s Encrypt 무료 SSL인증서 발급 및 자동 갱신 방법
[워드프레스 Tips] Lets’ Encrypt SSL 인증서 수동 갱신 방법
7.1. git 설치하고 certbot설치 하기
첫째 /root에서 작업을 진행할 수 있게 /root로 이동한다.
둘째, 필요한 소프트웨어를 GitLab에서 받을 수 있도록 git를 설치
처음 소프트웨어 설치 시 관련 소프트웨어를 업데이트할 수 있도록 Git repositories를 등록해 놓았다면 별도로 설치할 필요는 없는 것 같다.
셋째, 새로운 작업을 시작하기전에 항시 최신 소프트웨어가 없는지 점검하기 위해서 업데이트 명령을 준다.
넷째, 그 다음 git를 설치 명령을 준다.
다섯째, git이 설치되면 git 저장소에서 SSL 인증을 위한 소프트웨어 클라이언트인 certbot를 다운받는다.
cd /root # /root 디렉토리로 이동해 작업 시작
apt-get update # 항상 소프트웨어를 설치하기 전에 최신 업데이트가 있는 지 학인
apt-get install git # git 설치
git clone https://github.com/certbot/certbot # certbot 설치
Code language: PHP (php)
7.2. certbot으로 인증서를 생성
첫째, certbot이 깔린 폴더로 이동. cd certbot 명령 사용
둘째, nginx를 중단시킨다. Let’s Encrypt 의 인증 방식인 Standalone plugin 은 서버 인증을 위해서 80포트를 이용하는데 nginx가 80 포트를 계속 사용하고 있으면 인증이 제대로 될 수 없으므로 nginx 서버를 일시적으로 멈추는 것.
셋째, 인증 절차에 돌입. 여기서 certonly 명령을 사용. certonly는 인증서만 설치하겠다는 명령으로 nginx에선 아직 아파치처럼 다양한 명령 옵션이 없다.
넷째, 나오는 화면 요구사항에 맞추어 인증을 진행.
cd certbot # /certbot 디렉토리로 이동해 작업 시작
service nginx stop # 80포트를 사용하지 않토록 nginx를 중단시킴
./certbot-auto certonly # 인증 절차 진행, 조금 시간이 걸립니다.
service nginx start # 작업이 끝나면 다시 nginx를 가동시킴
Code language: PHP (php)
인증시 이메일주소를 입력 후 적용하고 싶은 사이트 주소를 입력하게 끔 되어 있는데 큰 어려움은 없이 진행된다.
4.3. DH Param 생성, 적용하기
앞의 작업으로 인증서 설치는 끝나지만 보다 보안을 강화하기 위해서 DH Param 생성 한다.
DH Param은 일부 암호화 알고리듬에 사용되는 커다란 난수 하나를 미리 생성해 두어서 암호화 성능을 향상시키고 보안을 높이는 방법이다.
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl
openssl dhparam -out dhparams.pem 4096 # 2048비트로 하려면 4096대신 2048로 대체 한다.
openssl rand 48 > session_ticket.key # 세션 티켓키도 생성 이는 시간이 거의 걸리지 않는다.
Code language: PHP (php)
7.3. 암호화 알고리즘 설정하기
인증서를 획득하는게 중요한게 아니고 얼마나 철저한 암호화 설정을 하느냐가 중요하기에 암호화 알고리즘을 적용한다.
아래는 시스템에 적용된 암호화 알고리즘들이다.
# Letsencrypt 기본 RSA 인증서
ssl_certificate /etc/letsencrypt/live/happist.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/happist.com/privkey.pem;
#OCSP Stapling(인증서가 유효하다는 증명을 미리 받아두어서 사이트에 처음 방문할 때 접속 속도를 높여주는 방법dla)
ssl_trusted_certificate /etc/letsencrypt/live/happist.com/chain.pem;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 10s;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:50m;
ssl_dhparam /etc/nginx/ssl/dhparams.pem;
ssl_session_tickets on;
ssl_session_ticket_key /etc/nginx/ssl/session_ticket.key;
# HTST 설정 ; 해당 도메인에 접근시 HTTPS로 접속을 강제하는 옵션
# 밑 옵션을 넣은 후 https://hstspreload.appspot.com 사이트에서 도메인 등록 필요
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
#HPKP 설정
#add_header Public-Key-Pins 'pin-sha256="lrJxl2mZhg9wlQ9JncdCBWyMq9oInWn2Wecefuv61T4=" ; pin-sha256="YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg=" ; pin-sha256="Vjs8r4z+80wjNcr1YKepWQboSIRi63WsWXhIMN+eWys=" ; max-age=2592000; includeSubDomains';
Code language: PHP (php)
참고 Let’s Encrypt SSL인증서 발급 관련 참고 – 1주일에 5번만 발급 가능
서버를 세팅하다보면 본의아니게 서버 설치를 반복하게 된다. 이런 저런 문제를 해결하고자 고민하다 문제 원인을 못 잡으면 다시 설치하는 경우가 있다.
그런데 Let’s Encrypt SSL인증서는 1주일에 5번까지 발급 받을 수 있다. 여러번 시행 착오를 통해서 5번이 넘어서면 아래와 같은 메세지가 나오면서 발급이 안된다.
An unexpected error occurred:
There were too many requests of a given type :: Error creating new cert :: too many certificates already issued for exact set of domains: test.com www.test.com
이메세지가 무엇일까 구글링해보니 Let’s Encrypt SSL인증서는 5회 발급으로 제한되어 있다고 한다. Let’s Encrypt SSL인증서없이 서버를 테스트해보고 충분하다싶으면 Let’s Encrypt SSL인증서를 발급받는게 좋을 듯..
8. 워드프레스 설치
이제 워드프레스를 설치해보자. 아래 내용은 아래 포스팅을 참조하여 일정부분 수정하였다.
[워드프레스 Tips] 가상서버호스팅(VPS)에서 워드프레스 설치하기
8.1. 가상호스트 루트 폴더(document root) 정하기
기본으로 우분투 16.04의 기본 디렉토리는 /usr/share/nginx/html/ 이다. 사람들의 취향에 따라서 다양한 위치에서 설치하고자하는 욕구가 있으나 보안이나 원인을 알수 없는 문제가 지속 발생하므로 가능하면 /usr/share/nginx/html/ 를 그냥 사용하는 게 좋다.
vultr에서 서버를 세팅하면 몇가지 우분투의 기본 위치는 아래와 같다.
- 기본 루트 폴더(document root) 디렉토리는 /usr/share/nginx/html/
- nginx 설정 파일 위치는 /etc/nginx/conf.d
8.2. 디렉토리 소유권 변경
다음으로는 기본 디렉토리의 소유권을 nginx 기본 사용자인 www-data에게 넘긴다.
# chown -R www-data:www-data /usr/share/nginx/html/
Code language: PHP (php)
8.3. 파일 권한 설정(필요 시)
위의 디렉토리 소유권 변경이 제대로 되었다면 파일 권한 설정이 필요없다. 권한 설정은 젣로 작동되지 않을때 강제로 파일 권한을 준다고 생각하고 권한을 강제 조정한다.
파일 권한을 확인해서 파일 권한을 755로 변경한다.
# chmod -R 755 /usr/share/nginx/html
Code language: PHP (php)
워드프레스 관련 디렉토리 소유권을 nginx인 www-data로 넘겼지만 가끔 플로그인들이 제대로 설치가 안되는 경우도 나타납니다. 이럴경우 파일 권한을 더 정확히 줍니다. 아래 폴더들은 디렉토리에 파일을 써야하므로(설치) 일정 권한이 필요합니다.
- wordpress 폴더
- wp-content/
- wp-content/plugins/
- wp-content/uploads
- wp-content/upgrade/ (워드프레스 코어 업그레이드 필요)
이러한 폴더들에 대해서는 파일 권한을 확인해서 파일 권한을 755로 변경한다.
chmod 755 /usr/share/nginx/html/
chmod 755 /usr/share/nginx/html/wp-content/
chmod 755 /usr/share/nginx/html/wp-content/themes/
chmod 755 /usr/share/nginx/html/wp-content/plugins/
chmod 755 /usr/share/nginx/html/wp-content/uploads/
chmod 755 /usr/share/nginx/html/wp-content/upgrade/
Code language: PHP (php)
이렇게 선별적으로 권한 변경을 하는게 조금 더 안정적일 수 있는데 귀찮다면 -R옵션을 사용해 일괄 변경하는 방법도 있다.
8.4. Nginx 가상호스트 설정 파일을 생성, 작성
이 단계이후 할일은 Nginx 가상호스트 설정 파일에 이 새로 만든 document root 위치를 반영 시켜주는 것이다.
이 설정은 우분투 버젼 16.04기준 /etc/nginx/conf.d라는 폴더에 있는 default 파일에서 수정 가능하다. 이렇게 할수도 있지만 멀티 사이트를 운영할 시 설정 파일이 너무 복잡해져서 혼란스럽지않게 사이트마다 별도 파일로 관리를 할 수 있다.
변경하기 전 default.conf 파일을 처음 열어보면 아래와 같은 내용을 볼 수 있는데 이 내용을 변경해서 각 사이트명+conf를 만들어 내용을 채워 넣는다.
각 도메일별 서버블록 파일을 만들어 /etc/nginx/conf.d에 올린다.
아래는 본인이 사용했던 설정이다.
server {
listen 80;
server_name test1.com www.test1.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name test1.com www.test1.com;
root /usr/share/nginx/test1.com;
#set same size as post_max_size(php.ini or php_admin_value).
client_max_body_size 1024M;
server_tokens off; # 버전 숨기기 활성화
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
charset utf-8;
ssl_certificate /etc/letsencrypt/live/test1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test1.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/test1.com/chain.pem;
ssl_dhparam /etc/nginx/ssl/dhparams.pem;
# Enable HSTS. This forces SSL on clients that respect it, most modern browsers. The includeSubDomains flag is optional.
add_header Strict-Transport-Security "max-age=31536000";
# Set caches, protocols, and accepted ciphers. This config will merit an A+ SSL Labs score.
#ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5';
access_log /var/log/nginx/test1.com.access.log;
error_log /var/log/nginx/test1.com.error.log warn;
location / {
try_files $uri $uri/ /index.php?$args;
index index.php index.html index.htm;
}
location ~ /(\.|wp-config.php|readme.html|license.txt|wp-comments-post.php) {
deny all;
}
location ~ /\.(ht|git|svn) {
deny all;
}
location ~ /.*\.(inc|ini|conf|cfg)$ {
deny all;
}
#Block scripts from being run that shouldn’t be running
location ~* .(pl|cgi|py|sh|lua)$ {
return 444;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
#the site that should not be public
location ~* wp-admin/includes { deny all; }
location ~* wp-includes/theme-compat/ { deny all; }
location ~* wp-includes/js/tinymce/langs/.*\.php { deny all; }
location /wp-content/ { internal; }
location /wp-includes/ { internal; }
# Letsencrypt의 Webroot Plugin을 사용하기 위해서 임
location ~ /.well-known {
allow all;
}
location @wp_admin_ban {
rewrite ^(.*) http://test1.com permanent;
}
# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
# Aggressive caching for static files that rarely/never change
location ~* \.(asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|eot|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|ogv|otf|pdf|png|pot|pps|ppt|pptx|ra|ram|svg|svgz|swf|tar|t?gz|tif|tiff|ttf|wav|webm|wma|woff|wri|xla|xls|xlsx|xlt|xlw|zip)$ {
expires 31536000s;
add_header Pragma public;
add_header Cache-Control "max-age=31536000, public";
}
location ~* \.(css|js)$ {
expires 86400s;
access_log off;
add_header Pragma public;
add_header Cache-Control "max-age=86400, public";
}
# Add PHP handler
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
# This file is present on Debian systems..
include fastcgi_params;
}
# Ensure requests for pagespeed optimized resources go to the pagespeed handler
# and no extraneous headers get set.
location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" {
add_header "" "";
}
location ~ "^/pagespeed_static/" { }
location ~ "^/ngx_pagespeed_beacon
Code language: PHP (php)
quot; { } }
Code language: PHP (php)
권한부여하고 설정 파일에 반영이 끝나면 설정이 제대로 되었는지 테스트 해본다. 테스트 명령어는 nginx -t
# nginx -t
Code language: PHP (php)
테스트에서 아래와 같은 메세지가 나오면 성공
결과물
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Code language: PHP (php)
이렇게 성공하게 되면 nginx를 정식으로 다시 가동시킨다.
# systemctl restart nginx
Code language: PHP (php)
8.5. 워드프레스 설치를 위한 DB 생성
우선 워드프레스가 사용할 DB 생성이 필요하다. 아래는 Maria DB에 접속해서 DB를 생성하는 과정을 간략히 정리한 것이다.
MariaDB에 접속
mysql -u root -p
Code language: PHP (php)
DB 생성
CREATE DATABASE wp;
Code language: PHP (php)
DB사용자 계정 생성
CREATE USER user1@localhost;
Code language: PHP (php)
사용자 계정 패스워드 설정
SET PASSWORD FOR user1@localhost= PASSWORD('password');
Code language: PHP (php)
사용자가 wp라는 DB에 접근할 권한 부여.
GRANT ALL PRIVILEGES ON wp.* TO user1@localhost IDENTIFIED BY 'password';
Code language: PHP (php)
설정값을 적용
FLUSH PRIVILEGES;
Code language: PHP (php)
8.6. 워드프레스 파일 받아 설치하기
워드프레스 한국 버젼은 워드프레스의 공홈이라하 할 수 있는 https://ko.wordpress.org에서 다운 받을 수 있다.
여기에서 최신 버젼의 링크주소를 복사한다.
2017년 10월 11일 현재 최신은 4.8.2으로 링크 주소를 확인하니 아래와 같다. https://ko.wordpress.org/wordpress-4.8.2-ko_KR.tar.gz
cd /home/happist # 설치할 디렉토리로 이동
wget https://ko.wordpress.org/wordpress-4.8.2-ko_KR.tar.gz # 워드프레스 최신 버전의 링크주소
tar -xzf https://ko.wordpress.org/wordpress-4.8.2-ko_KR.tar.gz # 압축을 푼다.
Code language: PHP (php)
8.7. 워드프레스 설치
워드프레스 설치파일을 /home/사용자계정/www에 올려놓았다면 인터넷상에서 사이트 주소를 치면 바로 워드프레스 설치화면으로 들어간다.
여기까지왔다면 거의 성공한 것이나 마찬가지이다.
여기서부터는 그 유명한 5분 설치가 가능하다.
기존에 준비했던 정보들을 입력하면서 진행하면 된다.
아래 설치 단계별 이미지를 순서대로 소개한다. 이를 참조하면 된다.
워드프레스에 오신 것을 환영합니다.
처음으로 나오는 화면
데이타베이스 연결 설정
위 장면에서 let’s go를 누르면 아래 화면이 나온다.
여기에서 데이타베이스 연결을 위한 세팅을 한다.
- db name
- db user
- 비밀번호
- 데이타베이스 호스트 대개 그냥 localhost를 사용한다.
- 데이타베이스 접두어, wp를 대부분 사용하는 듯
데이타베이스 설치과정 완료
데이타베이스 세팅이 완료되면 아래와 같이 설치과정을 마쳤다는 메세지가 나온다.
정말로 간단하게 설치가 끝난 것이다.
워드프레스 5분 설치과정에 오신 것을 환영합니다.
위에서 데이타베이스 설정이 끝나면 바로 본격적인 워드프레스 설치과정이 시작된다.
이 단계가 너무 쉽고 간단하기때문에 워드프레스에서는 5분 워드프레스 설치 과정이라고 홍보하고 있다.
여기에서는 관리자가 필요한 항목들을 입력하고 춰드프레스 설치하기를 누른다.
- 사이트제목
- 사용자명
- 비밀번호
- 이메일주소
워드프레스 설치 완료
그러면 몇분 걸리지 않아 워드프레스가 설치되고 대시보드 화면이 나타난다.
이제부터는 정상적으로 워드프레스로 사이트를 운영하면 된다.
워드프레스 세팅
워드프레스가 설치 되었으면 몇가지 세팅 한다.
- 먼저 고유주소를 세팅, SEO에 좋다고 누가 그래서 ID와 이름으로 고유주소를 만들었다. 이는 생각보다 기렁지고 한글 문제는 속을 썩힌다. – /%post_id%/%postname%/
- 적절한 테마 설정
- 테마에 따른 위젯 등 설정