Type and press Enter.

가상서버호스팅에서 우분투(Ubuntu) 18.04으로 서버 운영하기

최근 우분투(Ubuntu) 18.04 출시되었죠. 이 최신 우분투버젼을 기반으로 Vultr에서 서버 세팅하는 방법을 살펴보겠습니다.

이전에 소개한 사이트 운영을 위한 안내 – 웹서버 세팅에서 워드프레스 설치까지(우분투 17.10, NGINX 1.13.6, Marian DB 10.2, PHP7.2)가상 서버를 운영하고픈 勇者에게 전하는 가상 서버 운영 입문 노하우 – Vultr 가상서버호스팅(VPS)를 중심으로내용과 크게 벗어나는 것은 아닙니다.

다만 우분투 18.04버젼을 기반으로 Vultr에서 설치하는 방법 중심으로 설명하는 내용이므로 위 글을 읽는 분들이라면 되돌리기를 하시면 됩니다.

1. 우분투 18.04에 대한 상식적인 몇가지 이야기

우분투 18.04에 대한 기본적인 이야기 몇가지를 해보려고 합니다.

이 분야를 잘 아시는 분들에게는 너무 상식적인 이야기이지만 제 사이트를 방문하시는 분들은 서버를 처음 접하는 분들이 많으므로 기초적인 내용이라도 설명해 보겠습니다.

저도 많이 헷갈렸던 내용이고 뭘 의미하는 지를 몰라 구글링을 열심히 했던 기억이…

1.1. 18.04는 18년 4월 버젼이라는 의미이다.

우분투 버젼은 출시한 연도와 월에서 따옵니다. 만약 우분투 20.08이 있다면 이는 2020년 8월에 출시한 버젼입니다.

마찬가지로 최근에 출시된 우분투 18.04도 2018년 4월에 출시한 버젼이라는 의미입니다.

1.2. 우분투 18.04는 LTS 버젼이다.

우분투의 탄생 배경은 기존 데비안의 업데이트가 너무 느리기 때문에 이에 불만을 품고 우분투가 시작되었기 때문에 업데이트가 잦은 편이며 이에 따라 잦은 판올림이 이루어 집니다.

그런데 우분투 버젼이 빠르게 변하기 때문에 지원 기간이 짧아질 수 밖에 없습니다. 우분투를 통해서 떼돈을 버는 것이 아니라 비영리기관에서 운영하는 것이기 때문에 버젼별로 무한정 지원할 수 없기때문에 짧을 수 밖에 없습니다.
최근에는 평균 지원기간이 9개월정도 짭습니다.

그런데 서버 운영 입장에서는 그렇게 자주 서버 운영체제를 업그레이드 할 수 없습니다. 대규모 사이트에서는 업그레이드하려면 챙겨야하는 점들이 많을 수 밖에 없죠.
조금만 잘못해도 커다란 비지니스 손실을 봐야하기 때문에 조심스러울 수밖에 없습니다.

그렇게 때문에 우분투에서는 기업용으로 5년동안 지원하는 LTS(Long Term Support) 버젼을 출시합니다. 이 LTS 버젼은 짝수년도 4월에 출시합니다.

현재 사용 가능한 LTS 벼젼은 14.04, 16.04 그리고 18.04가 있습니다.

1.3. 버젼명과 코드네임이 다 활용된다.

일반적인 프로젝트에서 코드네임은 프로젝트가 끝나면 사용되지 않죠.
그렇지만 우분투에서 코드네임은 패키지 저장소나 관련 앱 버젼 관리 시 사용되므로 서버를 관리하려면 버젼명과 코드네임을 알고 있어야 합니다.

지금 현재 설치 가능한 버젼은 14.04, 16.04, 17.10 그리고 18.04가 있는데 이들의 코드 네임은 아래와 같습니다.

  • 14.04 : Trusty Tahr
  • 16.04 : Xenial Xerus
  • 17.10 : Artful Aardvark
  • 18.04 : Bionic Beaver

예를 들어 MariaD 패키지 저장소 주소는 아래와 같이 코드 네임으로 분류하고 있습니다.

우분투 18.04는 bionic을 사용

http://ftp.kaist.ac.kr/mariadb/repo/10.2/ubuntu bionic main

반면 우분투 16.04라면 중간의 bionic대신 16.04 코드네임인 xenial로 바뀝니다.

http://ftp.kaist.ac.kr/mariadb/repo/10.2/ubuntu xenial main'

2. Vultr에서 우분투 18.04 설치하기

여기에서는 Vultr 가상서버에서 우분투를 설치하기로 했기 때문에 Vultr 제어판에서 부터 시작하겠습니다.

제일 쉬운 방법은 Vultr 제어판에서 보이는 순서대로 서버 위치, 서버 타입, 서버 사이즈 등을 선택하고 맨 아래 버튼 Deploy Now를 누르면 기본 세팅이 됩니다.

Vultr 우분투 18.04 설치 세팅 화면 Ubuntu 18.04 Roll out in Vultr Tokyo

Vultr 제어판에서 서버 타입으로 우분투를 선택하는 방법은 여러 가지가 있죠.

위 이미지에서 보이는 것처럼 기본으로 나오는 64 bit OS에서 선택할 수 있죠(참고로 우분투 18.04부터는32 bit는 지원하지 않습니다. 그래서 32bit OS를 보면 CentOS 6 i386, Debian 8 i386 그리고 우분투 14.04, 16.04 그리고 17.10만을 발견할 수 있습니다.)

또 서버 타입을 Application을 선택해 설치할 수도 있는데 여기에서 선택할 수 있는 운영체제가 제한적입니다.
많이 선택하는 LEMP로 설치시에도 우분투 16.04만 설치 가능합니다. 또 워드프레스 설치와 동시에 설치할 수 있지만 이 또한 우분투 16.04만 설치 가능합니다.

아니면 ISO 라이브러리를 선택해 설치할 수 있는데요. 여기서는 우분투 18.04 이미지를 지원합니다. 따라 여기서 선택해도 되겠죠.

Vultr 우분투 18.04 설치 -ISO 라이브러리에서 설치 Ubuntu 18.04 Roll out in Vultr Tokyo by ISO Library

3. 우분투 18.04 기반 서버 세팅

그러면 이제부터는 우분투 18.04 기반으로 각종 서버 세팅을 해보도록 하겠습니다.

Vultr 제어판에서 제공하는 SSH는 성능이 너무 떨어지므로 챠다보지도 말고 Xshell을 비록한 SSH 전문 프로그램을 사용해 서버에 접속합니다.

서버 접속 비밀번호는 서버 제어판에서 확인할 수 있습니다.

3.1. 웹서버 보안 ufw 설정

가장 먼저 해야할 것이 바로 웹 서버 보안 설정입니다. 일반적으로 웹 서버 세팅이 끝난 후 보안 설정을 하는 경우가 있는데 그동안에는 무방비 상태이므로 가능하면 SSH에 처음 접속하는 순간부터 바로 보안 설정을 합니다.

  • 일반 및 SSL 설치 시 작동 가능토록 80, 443포트는 열어둔다.

  • 처음에는 22포트로 SSH나 FTP를 접속하므로 이도 열어 놓는다.

ufw enable # 방화벽을 활성화한다.
ufw allow 80/tcp  # 일반 웹 정보 관련 입출력 통로
ufw allow 443/tcp  # SSL 설치 시 웹 정보 관련 입출력 통로 
ufw allow 22/tcp  # ssh용 신규 포트

일반적으로 ssh포트를 22번을 사용하는데 이는 너무 알려진 포트이므로 이를 이용해 공격하는 경우가 있다고 합니다.
따라서 자기만아는 포트 번호로 변경 사용하는 게 더 보안을 강화할 수 있는 방법이기도 합니다.

  • ssh에서 널리 알려진 22포트는 해킹의 집중 대상이 되므로 자신만이 알수 있는 포트를 바꾼다. 이 작업은 sshd_config에서 사용할 포트를 지정해야 한다.

  • /etc/ssh/sshd_config 에서 Port 22 를 찾아서 자기가 사용할 포트 숫자를 기억하기 쉽고 10000자리이상에서 임의의 숫자를선택한다. 예를 들어 58722, 65322 등등

이렇게 포트를 변경한 후 ssh 서비스를 재시작 합니다.

그리고 기존 ssh port로 사용했던 22번 포트는 접속할 수 없도록 막아 줍니다.

service ssh restart

ufw allow *****/tcp  # *****는 ssh 포트로 기본 22번 포트대신 사용할 포트로 개인만 알 수 있는 만단위 숫자를 사용한다.
ufw deny 22/tcp  # ssh용으로 22포트를 사용할 수 없게 한다.

3.2. Fail2ban을 설치하여 보안을 강화

로그를 분석해 의심스러운 접근을 금지시키는 방법이 DenyHosts나 Fail2Ban이라는 프로그램입니다.
이 중 Fail2ban은 DenyHosts보다 훨씬 진보된 방식으로 SSH, Apache, Courier, FTP 등등에서 의심스러운 접근을 차단할 수 있는 프로그램입니다.
Fail2ba은 로그 파일을 모니터링해서 넘 많은 패스워드 입력 실패나 공격 감행 징후들이 보이면 IP를 차단합니다.

먼저 Fail2Ban을 설치합니다.

apt-get install fail2ban

그 다음 설정을 변경해야 합니다. 이는 jail.conf 파일에서 수정합니다.

nano  /etc/fail2ban/jail.conf

여기에서 ignoreip, bantime, findtime , maxretry 등을 수정해서 재구성합니다.

  • ignoreip에는 ban을 하면 않되는 IP를 적는다. 10.100.102.103/32 형식으로 적으며, 추가는 스페이스바로 구분한다.
  • bantime은 접속 차단 시간으로 기본이 600(10분)으로 되어 있음
  • findtime은 통계를 찾을 시간.
  • maxretry 는 fail 횟수이다. 기본으로 5가 세팅되어 있는데 이 정도면 충분하다고 보고 유지했다

3.3. 쉘 기본 언어값 확인

보안 설정이 끝났으면 이제는 본격적으로 세팅에 들어갑니다.

제일 먼저 쉘 기본 언어값 확인합니다.
apache2 명령어 입력 시 영어로만 나오면 그냥 넘어가고 중국어나 일본어 나온다면 영어로 바꾸어야 합니다.

이번 작업의 경우 아래처럼 영어로 나와서 넘어갔습니다.

# apache2
The program 'apache2' is currently not installed. You can install it by typicdng : 
apt install apache2-bin

만약 영어가 아닌 다른 언어가 나온다면 /etc/default/locale 의 파일 내용을 변경한다.

# vi /etc/default/locale

에서 아래 내용을 반영한다.

LANG="en_US.UTF-8"
LANGUAGE="en"

3.4. 현 운영 체제의 프로그램을 최신으로 업데이트

업데이트와 업그레이드 실시해 최신본을 기반으로 세팅을 계속합니다.

# apt-get update 
# apt-get upgrade -y

3.5. 시스템 시간 설정

여기는 서버 시스템의 시간을 한국 시간에 맞춥니다.

dpkg-reconfigure tzdata

GUI 환경에서 Asia를 선택하고 이어서 Seoul을 선택합니다. .

서버 시간 세팅_Seoul

그러면 아래와 같은 결과를 출력하죠.

Current default time zone: 'Asia/Seoul'
Local time is now:      Mon Jun 18 21:57:36 KST 2018.
Universal Time is now:  Mon Jun 18 12:57:36 UTC 2018.

3.6. 메일 발송프로그램 설치하기

메일을 발송할 수 있는 sendmail 프로그램을 설치, 압축 해제 프로그램 그리고 SSL을 위한 letsencrypt도 같이 설치하자. 뒤에서 나오는 작업을 하다 보면 설치하라고 나오는 프로그램들이다.

메일 발송 프로그램은 시간이 조금 걸린다. 인내를 가지고 기다려야 한다.

apt-get install sendmail unzip  letsencrypt -y

그러나 보안상의 이유로 외부로 메일 발송토로 세팅하지 말라고 강력히 권고되니 이는 참고하길 바랍니다.

여기서 설치하는 메일 발송앱은 서버에서 사용자에게 메일을 보내기 위해서 필요한 앱입니다.

3.7. APT 소스리스트 파일에 Nginx, PHP, MariaDB 저장소 추가

sources.list를 열어서 파일 맨 끝에 소스리스트를 추가

# nano /etc/apt/sources.list

파일 맨 끝에 아래 내용 추가합니다.

아래는 nginx는 최신 버젼 중심으로 사용하고, MariDB를 한국의 카이스트 파일 저장소에서 받아 오기로 세팅한 것입니다.

# Nginx
deb http://nginx.org/packages/mainline/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx

# MariaDB 10.3 repository list - created 2018-06-17 11:57 UTC
# http://downloads.mariadb.org/mariadb/repositories/
deb [arch=amd64,i386] http://ftp.kaist.ac.kr/mariadb/repo/10.3/ubuntu bionic main
deb-src http://ftp.kaist.ac.kr/mariadb/repo/10.3/ubuntu bionic main

만약 nginx를 안정버젼으로 설치하겠다면 아래 소스 리스트를 사용한다.

# Nginx
deb http://nginx.org/packages/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/ubuntu/ bionic nginx

# MariaDB 10.3 repository list - created 2018-06-17 11:57 UTC
# http://downloads.mariadb.org/mariadb/repositories/
deb [arch=amd64,i386] http://ftp.kaist.ac.kr/mariadb/repo/10.3/ubuntu bionic main
deb-src http://ftp.kaist.ac.kr/mariadb/repo/10.3/ubuntu bionic main

위에서는 MariaDB를 한국 카이스트에서 받아오도록 되어 있는데요.
제 경험상 카이스트는 접속이 원활하지 않은 적이 많았습니다.
그래서 Vultr 가상 서버 위치가 도쿄이므로 차라리 일본 대학에서 가져오는 게 더 낫을 수 있습니다.
일본으로 설정하려면 아래와 같이 세팅합니다.

# MariaDB 10.3 repository list - created 2018-06-17 11:54 UTC
# http://downloads.mariadb.org/mariadb/repositories/
deb [arch=amd64,i386] http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/10.3/ubuntu bionic main
deb-src http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/10.3/ubuntu bionic main

3.8. 각 저장소 보안키 다운로드 후 시스템에 등록

웹서버는 업데이트 및 업그레이드 시 해당 저장소에 접근해 최신 파일을 받아 오므로 이 저장소에 접근 할 수 있도록 보안키를 등록해 둡니다.

우선 nginx 보안키 다운로드 후 적용합니다.

cd /root
wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key
rm nginx_signing.key

다음으로는 MariaDB 보안키 다운로드 후 적용합니다.

아래는 MariaDB 재단에서 제공하는 Ubuntu 18.04에 MariaDB 저장소 보안키를 설치하는 방법입니다.
아래 명령어를 사용합니다.

한국 카이스트를 사용하는 경우

apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64] http://ftp.kaist.ac.kr/mariadb/repo/10.3/ubuntu bionic main'

일본 서버를 사용하는 경우

sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
sudo add-apt-repository 'deb [arch=amd64] http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/10.3/ubuntu bionic main'

다음으로는 PHP 저장소 추가 및 보안키 등록

apt-get install software-properties-common
add-apt-repository ppa:ondrej/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

여기서 엔터를 눌러주면 된다..

추가된 보안키 목록을 보려면 아내 명령어를 이용한다,

# apt-key list
/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>

지금까지 작업한 APT 패키지 정보를 업데이트 한다.

apt-get update

4. Nginx 설치

여기에서는 웹서버로 Nginx를 설치하기 했으므로 Nginx를 설치하고 nginx를 다시 가동(restart)시킵니다.
일반적으로 웹서버는 NGINX가 작은 자원을 가지고 효율적으로 운영될 수 있어서 처름 시작하는 소규모 사이트에서 각광을 받고 있으며 아파치(Apache)는 기준 풍부한 운영 경험을 토대로 대규모 사이트에서 선호된다고 합니다.

# apt-get install nginx

# service nginx restart
# nginx -v  // Version check

2018년 6월 17일 현재 설치 버젼을 체크해 보니 1.15이 나옵니다.

5. PHP 7.2 설치

PHP7-FPM 최신 버전인 PHP7.2를 설치합니다. 2018년 6월 17일 현재 최신 버젼은 PHP7.2.6입니다.

PHP 최신 배포 버젼 확인하기

PHP 최신 버젼은 아래 주소에서 확인 가능합니다.

PHP 최신 다운로드 버젼 확인 하러 가기

# apt-get install php7.2 -y

PHP7.2을 설치하고나서 관련 모듈을 설치합니다.
이 과정에서 일반적으로 널리 사용되는 모듈 list가 많이 돌아다니고 있으므로 이를 기준으로 설치해도 되고, 아니면 PHP7,2 모듈 패키지 리스트를 보고 선택을 다시 할 수도 있습니다.

모듈 리스트 확인

아래 명령은 PHP 7.2 modules 리스트를 알려주는데 이를 보고 추가할 모듈 패키지가 있는지 볼 수 있습니다.

# apt-cache search php7.2

위 명령을 내리면 아래와 같은 list가 쭈욱 나온다. 여기를 보고 추가할 모듈 리스트를 추가한다. 그렇지만 대개는 일반적으로 필요하다고 이야기되는 리스트 중심으로 설치하기 마련이다.

PHP 패키지 리스트가 출력된 모습1

PHP 모듈 설치

그 다음으로는 일반적인 PHP 모듈을 설치합니다. (Install most commonly used modules)

아래 리스트는 제가 설치한 PHP 모듈들입니다. 일부 설치 후 나중 필요시하나씩 설치해도 되긴 합니다.

apt-get -y install php7.2-bcmath php7.2-bz2 php7.2-cgi php7.2-cli php7.2-common php7.2-curl php7.2-dba php7.2-dev php7.2-enchant php7.2-fpm php7.2-gd php7.2-gmp php7.2-imap php7.2-interbase php7.2-intl php7.2-json php7.2-ldap php7.2-mbstring php7.2-mysql php7.2-odbc php7.2-opcache php7.2-pgsql php7.2-phpdbg php7.2-pspell php7.2-readline  php7.2-recode php7.2-snmp php7.2-soap php7.2-sqlite3 php7.2-sybase php7.2-tidy php7.2-xml php7.2-xmlrpc php7.2-zip  php7.2-xsl

php.ini 파일 수정

기본적인 php 상요하기 위해 몇가지를 변경합니다.
파일 수정은 fpm과 cli 폴더의 php.ini를 모두 수정해 주어야 한다고 합니다. 일반적으로 fpm이 중요하다고는 합니다만.

  • 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

아래는 php.ini 파일에서 타임존능 변경 적용한 결과입니다.

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Seoul

PHP 기본 세팅의 변경,

아래는 PHP 기본 세팅을 변경하는 명령어인데 제한적이지만 작용은 합니다. 아래 명령을 보듯이 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

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

php.ini 파일 수정이 끝나면 PHP-FPM service를 다시 시작합니다.

# systemctl restart php7.2-fpm.service

6. MariaDB 설치

안정화된 MariaDB는 10.3까지 출시되어 있스습니다. (2018년 6월 17일 현재)

MariaDB Downloads, Setting up MariaDB Repositories

6.1. MariaDB 10.3 설치

앞에서 저장소와 키를 등록했으므로 간단하게 아래 명령으로 MariaDB를 설치할 수 있습니다.

apt-get update
apt-get -y install mariadb-server

설치 도중에 New password를 설정하는 화면이 나온다. 설치가 완료된 후 서비스 상태를 확인할 수 있습니다.

service mysql status

6.2 PHP-FPM에 DB 연동관련 모듈설치

apt-get install php7.2-mysql

기본 언어셋 설정

이는 매우 중요한 세팅으로 반드시 필요합니다. 18.04에서는 취치가 조금 바뀌었네요.

nano /etc/mysql/mariadb.cnf

아래 내용으로 변경합니다.

# MariaDB-specific config file.
# Read by /etc/mysql/my.cnf

[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

6.3 Nginx 와 PHP-FPM 연결

nginx는 기본적으로 nginx 사용자 권한으로 실행되고, PHP-FPM 프로그램은 기본적으로 www-data 사용자 권한으로 실행되므로 둘의 사용자 권한을 www-data로 일치시킵니다.

vi /etc/nginx/nginx.conf
  • user nginx; 를 user www-data; 로 변경
  • worker_processes 1; 를 worker_processes auto; 로 바꾼다. 고사양 서버에서 성능이 더 좋아진다고. 일반적으로 트래픽이 적은면 1을 사용하고 트래픽이 많아지면 auto를 사용한다.
service nginx restart
nano /etc/nginx/conf.d/default.conf

fastcgi_params 내용 수정

fastcgi_params를 열어서 아래 내용으로 변경합니다.

vi /etc/nginx/fastcgi_params

아래와 같이 변경

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;

7. ngx_pagespeed 설정 – 옵션

워드프레스 속도를 빠르게 만들기 위해 구글에서 만든 ngx_pagespeed를 설치합니다.
이는 웹서버 속도를 조금이라도 빠르게 하기 위해 적용하는 것으로 꼭 설치할 필요는 없습니다.

  • ngx_pagespeed 를 이용하면 서버 속도가 어느 정도 빨라지민 nginx 버젼이 변경되면 ngx_pagespeed 설치를 다시해야 하기 때문에 세심한 관리가 필요합니다.

  • ngx_pagespeed 설치 시 구글 어낼리틱스 코드를 추가하면 별도로 워드프레스에서 구글 어낼리틱스 구현 코드를 설정할 필요가 없습니다.

  • 또 ngx_pagespeed은 이미지 압축이나 CSS 압축등의 기존 캐시 프로그램이 하는 일들을 대신해 주기 때문에 웹서버 속도를 빠르게 만들 수 있습니다.

7.1. 자동 설치

아래와 같은 명령으로 설치를 할 수 있습니다.
그러나 저의 경우 설치 과정은 문제가 없었으나 제대로 설치되는 않더군용. 그래서 뒤에서 소개하는 매뉴얼 방식을 사용하였습니다.

bash <(curl -f -L -sS https://ngxpagespeed.com/install) \      --nginx-version latest

7.2. 수동 설치

이에서 소개한 자동 설치가 먹히지 않는다면 아래와 같은 수동 설치 방법을 사용해 봅니다.

ngx_pagespeed 소스 다운 받기

먼저 ngx_pagespeed 소스 다운 받아야 합니다. 소스를 받으려면 최신 버젼 확인해야 하는데요 아래 주소로 ㄷㄹ어가 최신 버젼이 무엇인지 확인해 봅니다.

최신 버젼 확인 PageSpeed Release Notes

2018년 6월 17일 현재 최신 버젼은 1.13.35.2-stable이네요.

수동 설치 과정에서 1.13.35.2-stable라는 단어를 많이 사용할 것이므로 이를 연결하는 명령을 줍니다. 바로 NPS_VERSION을 적용해 이 명령이 1.13.35.2-stable를 의미토록 만드는 것이죠.

아래 명령 순서에 따라 진행합니다.

NPS_VERSION=1.13.35.2-stable
cd
wget https://github.com/apache/incubator-pagespeed-ngx/archive/v${NPS_VERSION}.zip
unzip v${NPS_VERSION}.zip
nps_dir=$(find . -name "*pagespeed-ngx-${NPS_VERSION}" -type d)
cd "$nps_dir"
NPS_RELEASE_NUMBER=${NPS_VERSION/stable/}  # stable 버젼 시 이를 사용
psol_url=https://dl.google.com/dl/page-speed/psol/${NPS_RELEASE_NUMBER}.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})  # extracts to psol/

7.3. Nginx 소스 컴파일 설치

다음으로는 Nginx모듈을 설치합니다. 앞에서 이미 Nginx를 설치했는데 이게 무슨 소리지? 하는 의문이 일겠죠.
Nginx에서 ngx_pagespeed를 자동으로 적용하는 방법이 없기 때문에 Nginx에 ngx_pagespeed 최신 버젼이 작동할 수 있도록 만들어야 합니다.

필요 프로그램 설치

본격적으로 Nginx를 다운 받아 작업을 진행하기 전에 원활하게 ngx_pagespeed가 설치될 수 있도록 필요한 프로그램을 설치해 줍니다. 이게 없으면 일부 오작동하는 경우가 있다고 합니다.

apt-get -y install build-essential zlib1g-dev libpcre3 libpcre3-dev unzip uuid-dev git libssl-dev

Nginx 다운

Nginx 소스 파일을 다운 받습니다. 마찬가지로 최신 버젼을 확인해야 합니다.

NGINX 최신 버젼 확인하러 가기

여기를 보면 MainLine version이 있고 안정화 버젼(stable version)이 있는데요. 앞 초장 부분에서 최신 버젼을 사용하는MainLine version을 선택했으면 여기서도 MainLine version을 택하고, 안정화 버젼을 택했으면 여기서도 안정화 버젼을 확인합니다.

저는 MainLine version을 선택했으므로 이를 기준으로 진행했습니다.

  • root로 이동, 불필요한 문제를 만들지 않기 위해 루트에서 작업
  • 먼저 몇가지 필요한 라이브러리를 설치
  • Nginx 최신 버젼을 받아 놓은 곳으로 이동
  • 여러가지 모듈을 같이 설치

2018년 6월 17일 현재 NGINX 최신 버젼이 1.15.0이므로 아래와 같은 순서로 진행합니다.

NGINX_VERSION=1.15.0
cd
wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz
tar -xvzf nginx-${NGINX_VERSION}.tar.gz
cd nginx-${NGINX_VERSION}/

./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-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=$HOME/$nps_dir ${PS_NGX_EXTRA_FLAGS}

make
make install

7.4 최적화 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;

7.5 ngx_pagespeed 설치 유무 간단 확인

ngx_pagespeed가 설치되었는지 간단히 확인하는 방법입니다.

nginx -V(대문자)를 치면 시스템에 설치된 nginx 관련 모듈 리스트가 뜨는데 여기에 ngx_pagespeed가 나오면 제대로 설치된 것이죠.

nginx -V

그러면 아래와 같은 모듈 리스트가 뜹니다. 여기에 ngx_pagespeed가 있는지 확인해 보죠.

nginx version: nginx/1.15.0
built by gcc 7.3.0 (Ubuntu 7.3.0-16ubuntu3) 
built with OpenSSL 1.1.0h  27 Mar 2018
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-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=/root/./incubator-pagespeed-ngx-1.13.35.2-stable

8. Let’s Encrypt 무료 SSL인증서 발급

보안의 일종으로 Let’s Encrypt 무료 SSL인증서 발급해 보겠습니다. 이 글은 주로 아래 글을 참조하였습니다.

[워드프레스 Tips] Let’s Encrypt 무료 SSL인증서 발급 및 자동 갱신 방법

[워드프레스 Tips] Lets’ Encrypt SSL 인증서 수동 갱신 방법

8.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 설치

8.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를 가동시킴

인증시 이메일주소를 입력 후 적용하고 싶은 사이트 주소를 입력하게 끔 되어 있는데 큰 어려움은 없이 진행됩니다. .

8.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  # 세션 티켓키도 생성 이는 시간이 거의 걸리지 않는다.

8.4. 암호화 알고리즘 설정하기

인증서를 획득하는게 중요한게 아니고 얼마나 철저한 암호화 설정을 하느냐가 중요하기에 암호화 알고리즘을 적용합니다.

아래는 시스템에 적용된 암호화 알고리즘들입니다.

# 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';

참고 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

참고하시기 바랍니다.

이후 워드프레스 설치등은 이전에 소개한 포스팅등을 참조하시기 바랍니다.

사이트 운영을 위한 안내 – 웹서버 세팅에서 워드프레스 설치까지(우분투 17.10, NGINX 1.13.6, Marian DB 10.2, PHP7.2)

가상 서버를 운영하고픈 勇者에게 전하는 가상 서버 운영 입문 노하우 – Vultr 가상서버호스팅(VPS)를 중심으로

10$ 제휴 프로모션으로 Vultr 가입하기