2.6 C
New York
화요일, 12월 23, 2025

Buy now

[광고] 쿠팡 추천 링크

안녕하세요? 올해까지 삼성전자 25년 직장 생황릃 마치고 퇴직하려 합니다. 퇴직 후 아르바이트로 쿠팡 파트너스 활동을 하려고 합니다. 쿠팡 파트너스는 쿠팡 추천 링크를...

카누 캡슐 커피머신 솔직 리뷰: ‘네스프레소 호환’ 가성비 끝판왕 (ft. 쿠팡 최저가 할인)

'공유 커피' 카누가 만든 카누 캡슐 커피머신 : 캡슐 커피머신 바리스타 브리즈/어반! 네스프레소 오리지널 캡슐 호환으로 활용도는 높이고, 카누만의 황금 레시피로 커피 맛은 깊어졌습니다....
Home Blog Page 337

우분투 서버에서 PPA(Personal Package Archives, 개인 패키지 프로그램 저장소) 삭제하기

오늘 이야기는 멜트다운 이슈로 업데이트가 꼭 필요한 상황인데 보안 문제로 일부 PPA(Personal Package Archives, 개인 패키지 프로그램 저장소)에서 업데이트 안되는 상황을 해소하는 방법입니다.

다시 이러지말아야지 하면서도 서버를 만지다보면 문제를 발견하게 되고, 이 문제 해결 과정에서 나중을 위해서 기록으로 남겨야할 필요성이 들면서 다시 포스팅을 하게 되었습니다.

멜트다운 문제로 업데이트를 시도하다.

요즘 멜트다운 문제로 시끄럽습니다. 이 서버 분야에서는 특히 민감한 문제인 것 같습니다. 하여 제가 사용하는 우분투에서도 며칠전 프로그램 패치를 내놓았습니다. 그리고 제가 운영하는 Vultr에서도 며일내로 업뎅트를 한다고 공지가 나왔더군요.

아무튼 이 중요한 시기에 업데이트를 하려고 서버에 접속했는데요. 그동안 몇번 업데이트를 하려다 이런 저런 이유로 못했는데요. 이슈가 점점 커가는 듯 싶어 오늘만은 업데이트하리라는 굳은 결심을하고 서버에 진입했지만 생각지도 못했던 문제에 봉착했습니다.

업데이트를 진행하다 서버는 아래와 같은 메시지를 내놓고 중단해 버렸습니다.

@happist:~# apt-get update
Get:1 http://security.ubuntu.com/ubuntu artful-security InRelease [78.6 kB]
Hit:2 http://archive.ubuntu.com/ubuntu artful InRelease                                               
Hit:3 http://ppa.launchpad.net/ondrej/php/ubuntu artful InRelease                                     
Hit:4 http://nginx.org/packages/mainline/ubuntu xenial InRelease                                        
Get:5 http://archive.ubuntu.com/ubuntu artful-updates InRelease [78.6 kB]                               
Ign:6 http://ppa.launchpad.net/rtcamp/nginx/ubuntu artful InRelease                                     
Hit:7 http://ftp.kaist.ac.kr/mariadb/repo/10.2/ubuntu xenial InRelease                                  
Get:8 http://archive.ubuntu.com/ubuntu artful-backports InRelease [72.2 kB]                    
Err:9 http://ppa.launchpad.net/rtcamp/nginx/ubuntu artful Release        
  404  Not Found
Reading package lists... Done                                            
E: The repository 'http://ppa.launchpad.net/rtcamp/nginx/ubuntu artful Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

이게 무슨 문제인가를 살펴보니 rtcamp/nginx라는 PPA(Personal Package Archives를 사용하는 없데이트는 보안상 허용되지 않는다고 합니다.

아무리 생각해도 rtcamp/nginx는 무엇 때문에 설치했는지 기억이 나질 않은데요. 아마 이런 저런 시도를 하면서 rtcamp/nginx라는 PPA를 사용해 Nginx를 설치했나 봅니다.

이렇듯 서버를 운영하다 보면 알게 모르게 여러가지 PPA(Personal Package Archives, 개인 패키지 프로그램 저장소)에서 프로그램을 설치하게 됩니다. 그런데 이 PPA(Personal Package Archives)는 아무래도 신뢰성이 떨어지므로 꼭 믿을만하고 널리 알려진 PPA(개인 패키지 저장소)를 이용하라는 가이드를 많이 받고 있죠.
이런 PPA가 별 문제없이 지속적으로 작용하면 좋으련만 가끔은 보안등의 이유로 시스템에서 거부하는 경우가 생김니다. 이번이 그런 케이스인가 봅니다.

문제가 되는 PPA 삭제 방법

보안이 문제된다면 당연히 이러한 위험 요소가 있는 PPA 사용은 회피해야 겠지요. 그리고 이 PPA 자체를 서버에 남겨 놓아서도 안될것입니다.

그러면 이 PPA를 어떻게 없앨까요?

리눅스에서는 PPA 삭제는 설치와 유사한 방법으로 진행합니다.

add-apt-repository --remove ***(PPA)

이러한 방법에 따라 rtcamp/nginx라는 PPA를 삭제해 보죠.

add-apt-repository --remove rtcamp/nginx

그러면 아래와 같은 메세지를 내면서 계속 삭제를 하려면 엔터를 치고, 삭제를 멈추려면 Ctrl-c 를 치라고 합니다. 당근 엔터를 쳐야지요.

그러면 별다른 메세지없이 지워집니다.

Nginx build by rtCamp. This is mainly used and maintained for EasyEngine project - http://github.com/rtCamp/easyengine

You can use it directly as well.
More info: https://launchpad.net/~rtcamp/+archive/ubuntu/nginx
Press [ENTER] to continue or Ctrl-c to cancel removing it.

그 다음에는 정상적으로 update 및 upgrade가 됩니다.

@happist:~# apt-get update

Hit:1 http://ftp.kaist.ac.kr/mariadb/repo/10.2/ubuntu artful InRelease
Get:2 http://security.ubuntu.com/ubuntu artful-security InRelease [78.6 kB]                                                
Hit:3 http://ppa.launchpad.net/nginx/stable/ubuntu artful InRelease                                                        
Hit:4 http://archive.ubuntu.com/ubuntu artful InRelease                                                                    
Get:5 http://archive.ubuntu.com/ubuntu artful-updates InRelease [78.6 kB]                                                  
Hit:6 http://ppa.launchpad.net/ondrej/php/ubuntu artful InRelease                                                          
Get:7 http://archive.ubuntu.com/ubuntu artful-backports InRelease [72.2 kB]                                                
Hit:8 https://packages.nginx.org/unit/ubuntu artful InRelease
Fetched 229 kB in 1s (135 kB/s)                    

Reading package lists... Done

광고 – Vultr 25$ 프로모션

Vultr에 관심이 있다면 아래 프로모션으로 Vultr에 가입해 보세요.
물론 그전에 더 좋은 프로모션이 있는지 체크해 봐야 합니다.

Vultr의 좋은 점이 다양한 프로모션이 많아서 초기에 저렴하게 이용할 수 있다는 점이었죠. 최근에는 그런 좋은 조건들이 많이 사라진 것 같긴 합니다.

25$ 프로모션으로 Vultr 가입하기

우분투 서버에서 PPA(Personal Package Archives, 개인 패키지 프로그램 저장소) 삭제하기 1

동영상이 쇼핑 방법을 바꾸고 있다 – 쇼핑에 가장 큰 영향을 미치는 동영상 정보

0

Executive Summary

  • 컨텐츠가 있는 곳에 검색이 있다. 쇼핑 정보가 가장 많은 아마존 검색이 활성화 되었다. 가두리지만 일정 정보를 모아 놓았던 네이버에 검색이 몰렸다. 그리고 컨텐츠가 풍부해지는 유튜브로 검색이 몰리는 것

  • 유튜브 검색은 쇼핑을 위한 검색으로 진화 중, 유튜브 사용자 40%는 상품 구매전에 유튜브에서 검생을 일상화 함

  • 소셜 정보 중 동영상이 구매로 이어지는 전환율이 가장 높았음. 86%는 동영상에서 영향을 받았으며, 텍스트는 겨우 44%에 불과

  • 동영상 쇼핑 검색에서 새로운 기회들이 창출되고 있음

1. 컨텐츠 있는 곳에 검색이 있다.

요즘 유튜브의 역활이 굉장히 커졌습니다.
예전에는 네이버 검색이나 구글 검색을 당연하다고 생각했는데, 요즘 젊은 세대는 무엇을 찾을 때 유튜브 검색을 당연 시하고 있습니다. 우리 은우나 은결이도 동영상을 많이 보기 때문이지만 검색의 상당 부분을 유튜브에서 하고 있더군요.

이는 보고 싶은 컨텐츠가 있는 곳에서 검색을 하는 것으로 어쩌면 당연한 귀결일 것입니다. 미국에서 쇼핑 검색의 70%를 아마존에서 하는것처럼 말입니다. 물론 그 사람들도 구글 검색을 그 못지 않게 합니다만 아마존 검색이 더 전환율이 높기 때문에 구글로서는 가슴 아푼 일이겠지요.

▽ 컨텐츠 있는 곳에 검색이 있다는 것을 보여주는 아마존,
미국 영국 프랑스 독일 소비자들이 상품 구매전에 탐색하는 사이트

미국 영국 프랑스 독일 소비자들이 상품 구매전에 탐색하는 사이트 Sites Used by Internet Users in Select Countries to Find and Research Products Before Making a Purchase, Aug 2017

유튜브 검색이 활성화되고 젊은층에서 유튜브 검색이 더 활성화되는 이유는 유튜브에 젊은이들이 좋아하는 컨텐츠가 있기 때문입니다.

2. 왜 소비자는 유튜브에서 상품 검색을 할까?

이러한 유튜브 검색이 이제는 단순 동영상 검색을 넘어 구매로 넘어가기전의 상품 정보 검색에서도 맹위를 떨치고 있다고 합니다.
이러한 현상에 대해서 이마케터가 How Video Is Changing The Way Consumer Shop이라는 자료를 발표했는데요. 이 내용을 간략 정리해서 공유합니다.

소비자들의 상품 구매전에 유튜브 검색이 크게 증가했습니다. Think with Google에서 밝힌 데이타에 따르면 유튜브 사용자의 40%는 상품에 대해서 더 알아 보기 위해 유튜브와 같은 동영상 플랫폼을 방문했다고 조사되었습니다.

그러면 이 소비자들은 유튜브와 같은 동영상 풀랫폼에 어떤 이점이 있다고 생각할까요? 당연하게도 그들은 제품을 실제 볼수 있기 때문이라고 답합니다. 동영상에 비해서 일반 상품 판매 사이트나 블로그는 동영상 중심으 제공하는 유튜와 같은 플랫폼 만큼의 디테일한 정보를 줄 수 없습니다.

구글 Think With Google에 따르면 Target이나 Homegoods같은 곳에서 쇼핑하는 사람들을 대상으로 제작해 상품 평가 시 가상 태그를 붙여 유튜브에서 보도록 유도했던 “shop with me”와 같은 상품 소개 동영상 시청율은 지난 2년간 1,000% 증가했다고 합니다.

이러한 동영상은 동영상 시청 시간이 증가하고(평균 미국 성인은 하루 81분 디지탈 비디오를 본다고 함), 동영상 컨텐츠가 점점 풍부해지면서 구매 과정에서 동영상의 영향이 점점 커지고 있습니다.
동영상은 다른 매체에 비해서 이미지와 나래이션을 추가하여 가장 설득력이 강한 컨텐츠로 거듭나고 있으며, 동영상을 통해서 감정 이입을 쉽게 할 수 있는 잇점이 있습니다. 활자 매체에 비해서 몰입도가 높고 이성적인 경계를 쉽게 무너뜨릴 수 있어 기존 매체가 가지지 못한 강력한 영향력을 가지게 된 것입니다. 동영상을 통해서 다른 사람들이 신상품을 고르려고 고민하는 것을 볼 수 있고, 또 신상을 입고 있는 것을 보면서 그리고 신상을 입고서 멋진 시간을 보내는 것을 보여줌으로써 기존 매체가 할 수 없었던 엄청난 감정 이입을 가능케 합니다.

인플러언서 마케팅 및 소셜 미디어가 소비자 행동에 미치는 영향을 조사한 gen.video와 Geometry Global의 조사에 따르면 소셜 사용자들에게 동영상을 통한 구매 결정 영향이 가장 컸다고 밝히고 있습니다.
이 조사에 따르면 소셜 미디어 컨텐츠 중 구매에 미치는 영향은 동영상이 86%로 가장 높았고 이미지가 78% 그리고 텍스트는 44%에 불과했습니다. (중복 응답이므로 총합이 100%를 넘는다.)

이에 대한 그래프는 아래를 참조하세요.

동영상이 쇼핑 방법을 바꾸고 있다 - 쇼핑에 가장 큰 영향을 미치는 동영상 정보 2

3. 마치며

어쩌면 트렌드가 동영상으로 흘러갔다는 사실은 진부한 언명일 수 있습니다.
근래 동영상의 중요성에 대해서 엄청나게 이야기되었기 때문이고 인스타그램이나 스냅챗이나 오래전부터 (짧은) 동영상에 승부를 걸고 있고, 페이스북이나 애플이 영상 컨텐츠를 활성화하기 위해 엄청난 노력을 한다는 것은 주지의 사실이니깐요.

그러나 쇼핑의 관점에서는 아직도라는 생각이 있을 수 있는데 이 부분도 이미 많은 부분이 shift되고 있다는 것을 보여주고 있습니다.

여기서 엄청난 새로운 기회들이 만들어지고 있습니다. 그게 어떤식으로 구현될지 고민해 봐야겠습니다.

4. 참고 자료

구글과 페이브북의 디지탈 광고 독점과 광고업계의 아마존을 통한 견제 움직임

금연 광고를 이렇게 멋지게 만들 수 있다니!! 뉴욕에서 다시 온에어 되는 아일랜드 금연 광고 I Will Survive

0

여기 아일랜드 금연 광고가 있습니다. 이 광고는 2017년 4월 아일랜드에서 제작, 방영되어 큰 호평과 소기의 금연 캠페인 성과를 거두었습니다.

아일랜드 HSE의 금연 광고 I Will Survive

아일랜드 정부 보건 서비스인 HSE가 공개한 이 광고는 글로리아 게이너(Gloria Gaynor)의 유명한 1978년 노래를 립싱크하면서 금연을 맹세하는 장면을 담고 있습니다.

이 광고는 뛰어난 작품성으로 2017년 많은 광고제에서 수상(Kinsale Shark 페스티발, Epica상 수상 등)했고 2018년 뉴욕시는 이 광고를 뉴욕에서도 온에어 하겠다고 결정했습니다.

실제 사람들이 금연를 결심하는 결정적인 진실의 순간이 있습니다. 이 광고는 글로리아 게이너(Gloria Gaynor)의 노래 “I Will Survive”의 음악과 가사를 사용했습니다. 이 노래는 금연을 결심하는 많은 사람들이 담배로부터 해방되는 기분과 건강한 상태가 되는 것을 축하하는 감정과 상태를 잘 반영하고 있습니다. – 아일랜드 HSE 관계자

실제로 2007년이후 담배를 피우는 아일랜드 사람들의 비율은 29%에서 22%로 낮아졌습니다. 이는 인구의 27%가 과거에는 담배를 피우는 사람들이었고 아일랜드 15세이의 백만명 이상이 금연을 성공적으로 이루었다는것을 말하고 있죠.

이 광고의 댓글에는 광고를 피우지 않은 사람들 이야기보다 더 많은 금연 사연들이 올라왔습니다.

Gloria Gaynor — I Will Survive Official Video HD

I Will Survive 노래 가사

I Will Survive Lyrics


At first, I was afraid, I was petrified
Kept thinking, I could never live without you by my side
But then I spent so many nights thinking, how you did me wrong
And I grew strong and I learned how to get along

And so you’re back from outer space
I just walked in to find you here with that sad look upon your face
I should have changed that stupid lock
I should have made you leave your key
If I’d known for just one second you’d be back to bother me

Go on now, go, walk out the door, just turn around now
‘Cause you’re not welcome anymore
Weren’t you the one, who tried to hurt me with goodbye?
Did you think I’d crumble? Did you think I’d lay down and die?

공익광고-금연관련

[워드프레스 최적화] 효율적인 MySQL 데이타베이스 최적화 및 복구 방법, mysqlcheck

데이타베이스 관련 이런 저런 문제를 해결하다보니 데이타베이스의 오류복구 툴까지 관심을 가지게 되었네요.

MySQL의 에러로그를 살펴보니 몇개의 에러가 발생했더군요. 이게 데이타베이스 자체에서 발생한 문제인지를 살펴보기 위해 간단하게 데이타베이스 오류를 점검해보는 툴을 찾았습니다.

바로 mysqlcheck이란 툴인데요. 가변고 간단하게 사용할 수 있습니다. 이는 별도로 설치하는게 아니라 데이타베이스 설치 시 같이 설치되기 때문에 사용법을 익혀서 적용만 하면 됩니다.

1. MySQL 데이터베이스 오류 복구 및 최적화 툴 mysqlcheck

MySQL에서 자동으로 설치되는 mysqlcheck에서는 테이블이 손상 되었는지(check table), 손상된 테이블로 판면되면 자동으로 복구(repair table), 테이블 최적화(optimize table)해 속도를 개선하는 기능을 제공합니다.

mysqlcheck은 오직 서버가 구동되어 MySQL(또는 MariaDB) 데이타베이스가 작동되는 동안만 점검할 수 있습니다. 이와 유사한 기능을 하는 myisamchk은 서버가 작동하지 않는 동안에도 점검을 할 수 있다고 합니다.

mysqlcheck에서 사용 가능한 명령어는 아래와 같습니다.

명령어 수행 내용
-c, —check Check table for errors.
-a, —analyze Analyze given tables..
-o —optimize Optimize the tables.
-r, —repair Perform a repair that can fix almost anything except unique keys that are not unique.
—auto-repair If a checked table is corrupted, automatically fix it. Repairing will be done after all tables have been checked.
-A, —all-databases Check all the databases. This is the same as –databases with all databases selected.
-B, —databases Process all tables in the named databases. With this option, all name arguments are regarded as database names, not as table names.
—tables Overrides the –databases or -B option such that all name arguments following the option are regarded as table names.
-g, —check-upgrade Check tables for version-dependent changes. May be used with –auto-repair to correct tables requiring version-dependent updates.

2. 데이타베이스 테이블 오류 체크 및 자동 복구

저는 아직 한번도 격어보지는 못했지만 여러가지 이유로 데이타베이스 테이블이 손상될 수 있습니다. 이때 mysqlcheck로 테이블 손상 복구를 시도해 볼 수 있습니다.

이 때 사용하는 명령어는 아래와 같습니다.

mysqlcheck -u [DB계정] -p[패스워드] --auto-repair [DB명]

만약 데이타베이스 전체를 검사하고 싶다면 아래 명령어를 사용합니다.

mysqlcheck -u [DB계정] -p[패스워드] --auto-repair --all-databases

3. 데이타베이스 테이블 최적화

데이타베이스가 오래되면 파편화가 생길 수 있고, 어디인지 모르게 꼬일 수도 있습니다. 그래서 데이타베이스를 최적화 시켜주는데요.
이는 컴퓨터 하드디스크 정리와 비슷합니다. 컴퓨터 하드디스크에 기록되는 정보들은 순서대로 차곡차곡 정보가 쌓이는 것이 아니라 여기 저기 분산되어 빈 공간에 데이타를 저장하게 됩니다. 그러다보면 정보를 찾는데 시간이 걸리먄서 속도가 저하되는 것처럼 데이타베이스도 여기저기에 정보가 저장되다보면 속도가 느려지게 됩니다.

데이타베이스를 최적화하기 위해서는 아래 명령을 사용합니다.

mysqlcheck -u [DB계정] -p[패스워드] --optimize [DB명]

만약 데이타베이스 전체를 최적화하고 싶다면 아래 명령어를 사용합니다.

mysqlcheck -u [DB계정] -p[패스워드] --optimize --all-databases

이렇게 명령을 수행하다보면 “Table does not support optimize, doing recreate + analyze instead”라는 메세지를 만나게 되는데요. 이는 MariaDB에게는 이런 메세지를 보여준다고 합니다.

wp.wp_commentmeta
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
wp.wp_comments
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
wp.wp_links
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
wp.wp_options
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
wp.wp_postmeta
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
wp.wp_posts
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
wp.wp_term_relationships
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
wp.wp_term_taxonomy
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
wp.wp_termmeta
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
wp.wp_terms
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
wp.wp_usermeta
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK
wp.wp_users
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK

4. 주기적으로 최적화하기

그러면 데이타베이스를 최적화한다면 조금 더 성능이 좋아진다고 하는데요. 이를 정기적으로 수행할 수 있는 방법이 없을까요?

바로 리눅스에서 제공하는 cron 명령을 사용하면 가능합니다.
매일 새벽 3시에 모든 데이타베이스를 최적화하고 오류가 있으면 자동으로 복구하도록 하겠습니다.

아래와 같이 cron에 등록해주면 매일 새벽 3시 30부나다 모든 데이터베이스를 최적화, 오류가 있으면 오류복구를 실행하게 됩니다.

먼저 cron에 주기적으로 최적화 및 오류 복구 명령을 수행하기 위해서 crontab -e 명령을 사용합니다.

crontab -e

그다음 cron에서 아래 명령을 추가합니다.

30 3 * * * /usr/bin/mysqlcheck -u root -p비밀번호 --auto-repair --optimize --all-database

이 작업을 하는데 아직 데이타베이스가 작아서인지 1분이 안걸리는군요.

광고 – Vultr 25$ 프로모션

Vultr에 관심이 있다면 아래 프로모션으로 Vultr에 가입해 보세요.
물론 그전에 더 좋은 프로모션이 있는지 체크해 봐야 합니다.

Vultr의 좋은 점이 다양한 프로모션이 많아서 초기에 저렴하게 이용할 수 있다는 점이었죠. 최근에는 그런 좋은 조건들이 많이 사라진 것 같긴 합니다.

25$ 프로모션으로 Vultr 가입하기

[워드프레스 최적화] 효율적인 MySQL 데이타베이스 최적화 및 복구 방법, mysqlcheck 3

[워드프레스 최적화] MySQLTuner 사용 워드프레스 데이타베이스 튜닝 방법

여기에서는 워드프레스 최적화를 위해서 MySQLTuner 사용, 워드프레스 데이타베이스 튜닝 방법을 살펴보도록 하겠습니다.

이전 워드프레스를 최적화 하기 위한 데이타베이스(MariaDB)최적화에 대한 포스팅을 하면서 이론적인 내용을 토대로 데이타베이스 최적화 설정을 이야기 했습니다.

그러나 데이타베이스 성능을 최대한 끌어 올리기 위해서는 데이타베이스 튜닝 툴을 사용해 제대로 점검해야 한다는 지적에 따라 오늘은 데이타베이스 튜닝툴을 가지고 데이타베이스를 최적화 해봤습니다.

갈수록 너무 깊에 들어간다는 느낌이긴 하지만 이왕 최적화의 길을 걷기로 한 이상 어느 정도 뿌리를 뽑아야 그 다음으로 넘어갈 수 있을 것 같습니다. (성격이 마음에 담아 두고 그냥 넘어가기가 어려워서…)

MySQLTuner

오늘 데이타베이스 튜닝을 시도해 볼 도구는 MySQLTuner인데요. 진단툴에는 이외에도 많은 것들이 있는데 널리 사용되고, 제 시스템에서 쉽게 적용, 작동하는 툴이 이거라서 선택했습니다.

MySQLTuner 설치 및 작동에 대한 설명은 아래를 참고했습니다.

GitHub, MySQLTuner-perl

MySQLTuner는 아래와 같은 데이타베이스 종류를 지원한다고 합니다.

  • MySQL 5.7 (full support)
  • MySQL 5.6 (full support)
  • MySQL 5.5 (full support)
  • MariaDB 10.1 (full support)
  • MariaDB 10.0 (full support)
  • Percona Server 5.6 (full support)
  • Percona XtraDB cluster (full support)
  • MySQL 3.23, 4.0, 4.1, 5.0, 5.1 (partial support – deprecated version)
  • Perl 5.6 or later (with perl-doc package)
  • Unix/Linux based operating system (tested on Linux, BSD variants, and Solaris variants)
  • Windows is not supported at this time (Help wanted !!!!!)
  • Unrestricted read access to the MySQL server (OS root access recommended for MySQL < 5.1)
  • CVE vulnerabilites detection support from https://cve.mitre.org

여기에 따르면 제가 설치한 MariaDB 10.2는 지원 List엔 없었습니다. 고민하다 그냥 해보기로 해서 시도했습니다. 결과는 아무 이상 없이 잘 진행되었습니다. 혹시 MariaDB 10.2 사용자분들은 참고하시기 바랍니다.

MySQLTuner 설치

MySQLTuner 설치는 아래와 같이 진행하면 됩니다.
당연히 터미널에서 아래 명령어를 사용해 설치할 수 있습니다.

wget http://mysqltuner.pl/ -O mysqltuner.pl
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/basic_passwords.txt -O basic_passwords.txt
wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/vulnerabilities.csv -O vulnerabilities.csv
perl mysqltuner.pl
Code language: PHP (php)

MySQLTuner 사용 명령어

MySQLTuner가 설치되었으면 터미널에서 적절한 명령어를 사용해 점검해 볼 수 있습니다. MySQLTuner 명령어에는 최소한도의 검토를 진행하는 명령어에서부터 굉장히 복잡한 분석을 하라는 명령까지 다양합니다.

  • perl mysqltuner.pl 가장 최소한의 점검 명령
  • perl mysqltuner.pl —buffers —dbstat —idxstat —sysstat —pfstat 디버깅없이 MySQL/MariDB의 대부분을 점검하라는 명령, 너무 길어서 그냥 눈앞에서 획획 지나가 버려서 이를 파일로 저장하라는 명령이 필요하다.
  • perl mysqltuner.pl —outputfile /tmp/result_mysqltuner.txt 최소 점검 결과를 파일로 저장
  • perl mysqltuner.pl —buffers —dbstat —idxstat —sysstat —pfstat —outputfile /tmp/result_mysqltuner.txt 최대 점검 결과를 파일로 저장
  • perl mysqltuner.pl —debug 디버깅 정보를 보여줌

MySQLTuner 사용 예

아래는 처음 MySQLTuner를 돌려 본 결과입니다.

perl mysqltuner.pl 처음 테스트

여기서 [!!] 표시되는 부분은 문제가 된다고 지적하는 부분이니 유념해서 보고 정정할 방안을 찾아야합니다. 그리고 맨 아래에 튜닝 툴에서 제안하는 ‘Recommendations’이 있는데 이를 적극 활용하면 됩니다.

위 MySQLTune에서 검토해 준 내용은 Log file 디렉토리가 존재하지 않는다는 지적이 있었고, Fail Execute SQL ? Return Code : 256가 같은 다소 위험해 보이는 지적도 있습니다.

Log file에는 일반 로그, 에러로그, 지연 실행 로그 등 여러가지가 있는데요. 에러로그, 지연 실행 로그가 중요해서 이들을 위한 별도의 파일 위치를 지정해 주었습니다.

먼저 my.cnf 파일에서 일반 로그, 에러로그, 지연로그가 기록될 위치를 지정하고, 기록 여부를 정해 줍니다.

  • 0은 기록하지 말라는 것으로 일반 로그는 용량이 어마어마하게 늘어난다는 지적에 따라 0으로 놓았습니다.
  • 1은 기록하라는 의미이므로 에러로그 및 지연 로그는 기록토록 했습니다.
general_log_file        = /var/log/mysql/mysql_general.log
general_log             = 0

log-error=/var/log/mysql/mysql_error.log
log_warnings        = 2

slow_query_log      = 1
slow_query_log_file    = /var/log/mysql/mysql_slow.log
long_query_time     = 1
log_slow_verbosity    = query_plan
Code language: PHP (php)

이어서 권한을 지정을 지정하고 소유권을 mysql로 변경해 줍니다.
먼저 권한 변경,

chmod 644 /var/log/mysql/mysql_general.log
chmod 644 /var/log/mysql/mysql_slow.log
chmod 644 /var/log/mysql/mysql_error.log

Code language: PHP (php)

다음으로는 소유권을 mysql로 변경

chown mysql:mysql /var/log/mysql/mysql_general.log
chown mysql:mysql /var/log/mysql/mysql_slow.log
chown mysql:mysql /var/log/mysql/mysql_error.log
Code language: PHP (php)

그 외 가이드에 따라 각 옵션 값을 적정하게 부여합니다.

튜닝 결과, 아래는 완벽하지는 않지만 데이타베이스관련 자잘한 문제만 남겨놓은 상태로 튜닝을 종료합니다. 아래는 마지막에 돌려본 내용입니다.

perl mysqltuner 튜닝 결과

워드프레스 최적화를 위한 18개월간의 고민, 그 노하우를 담다.

워드프레스 최적화를 위해서 많은 시간을 투자해서 이것 저것 알아 보고, 여러가지 시행 착오를 거쳤습니다. 이러한 시간이 거의 18개월에 이르고 있네요. 그동안 경험을 토대로 워드프레스 최적화 방안에 대해서 전체적으로 정리해 봤습니다.

인터넷에 워드프레스 최적화 관련 많은 포스팅이 있습니다. 이러한 포스팅들도 많은 인사이트를 주지만 여기서는 제 경험을 토대로 조금 전문적인 내용을 추가해서 도움이 될 수 있는 내용을 정리해 보고자 합니다.

그리고 여기서 소개하는 방법들은 가능하면 무료로 할 수 있는것들 중심으로 설명했습니다.

개인 블로거로서 뚜렸한 수입원이 없기에 사이트 운영 투자에 많은 돈을 들일 수 없기 때문입니다. 물론 영리 목적으로 사이트를 운영한다면 보다 효과적인 서버 등 인프라와 툴들을 돈을 들여서라도 적극 도입할 수 있겠죠..

많은 경우 돈이 곧 성능, 효율이 되는 경우가 많기 때문입니다.

1. 워드프레스가 작동하는 원리

본격적으로 워드프레스 최적화 방안에 대해서 이야기 하기 전에 워드프레스가 작동하는 방식을 간단하게 이해하고 넘어가고자 합니다.

1.1. 브라우저가 사이트 서버를 찾는 단계

사용자가 워드프레스 컨텐츠를 보기 위해 인터넷 브라우저에서 명령을 내리면 브라우저는 컨텐츠가 있는 사이트 서버가 어디에 있는지를 찾습니다.

이를 전문 용어로 DNS Lookup이라고 하는데요. 브라우저가 사이트 서버가 있는 곳을 빠르게 찾을 수 있는 DNS 업체에 등록하는 것이 필요합니다. 아무래도 외국에 있는 업체보다는 국내 업체 또는 구글이나 클라우드플레어와 같은 업체들이 거론되기도 합니다.

1.2. 요청 받은 내용을 서버에서 준비하는 단계

사이트 서버를 찾아 명령을 전달하면 사이트 서버는 이 내용이 어디에 있는지를 찾습니다. 이를 찾은 다음, PHP를 통해서 사람들이 이해할 수 있는 HTML 파일로 만들도록 합니다.

그러면 PHP는 데이타베이스에서 정보를 찾아 HTML 파일을 만듭니다. 이렇게 만들어진 HTML 파일을 크롬같은 브라우저에게 보내죠,

이처럼 서버단에서 많은 단계를 거쳐서 작업이 이루어지다보니 이러한 단계를 빨리 처리할수 있도록 빵빵한 하드웨어가 필요 합니다.

성능이 좋은 서버 CPU가 필요하고, 빠르게 작업할 수 있는 많은 메모리 그리고 많이 저장할 수 있고 빨리 꺼내올 수 있는 빠른 입출력속도를 가진 SSD와 같은 디스크가 필요합니다.

소프트웨어적으로는 보내는 내용을 압축하거나, 많은 단계를 압축적으로 처리할 수 있는 기법들 예를 들어 caching과 같은 방법들이 필요합니다.

1.3. 브라우저에서 컨텐츠를 띄워주는 단계

브라우저는 서버로부터 HTML 정보를 받아서 받아서 사용자의 데스크탑 컴퓨터나 모바일 단말기에 보여주는 단계를 거칩니다. 이를 렌더링(Rendering)이라고 부르는데요.

이 렌더링 단계에서는 서버로부터 폰트, 이미지, JS, CSS와 같은 정보가 담긴 파일을 받게 되는데요. 이러한 파일의 크기를 최소화하는 게 속도를 높이는 지름길이 됩니다.

그래서 관련 파일을 압축해서 작게 만들거나, 처음부터 작은 파일로 만들어서 다운 받아야하는 용량을 줄이는 최적화가 필요합니다.

2. 경쟁력있는 웹서버 /웹호스팅 선택

어떤 웹서버를 사용해야 할까요? 이는 모든 제품을 살때 공통으로 적용되는 격언에 부합합니다. 운영 가능한(허용 가능한) 비용내에서 가장 좋은 성능의 웹서버를 선택하라는것입니다.

워드프레스 속도에 가장 큰 영향을 미치는 요인이 바로 이 서버 사양입니다. 빵빵한 사양이 최종 속도에 미치는 영향은 거의 절대적이지 않을까 싶습니다. 그렇기에 가장 많이 고민해야만 하는 부분입니다.

웹서버 선택에는 기 구축된 웹서버를 이용하는 방식과 사용자 본인이 직접 서버를 운영하는 방식의 2가지로 나눌 수 있습니다.

기 구축된 웹서버를 이용하는 방식은 우리나라에서 가장 흔한 방법으로 웹서버를 제공하는 웹호스팅 업체를 이용하는 것입니다.

이러한 웹호스팅 업체들은 최소의 자본 투자로 최대의 이익을 얻기 위해 한개의 서버당 수백개(?)의 사이트가 운영할 수 있도록 하고 있습니다.

제한된 자원에 많은 사이트를 운영하다보니 사이트당 할당 받을 수 있는 시스템 성능이 낮을 수 밖에 없습니다. 그리고 사용자 전체의 공통 분모를 맞춰야 하므로 새로운 기술 적용이 매우 느립니다.

예를 들어 속도가 50%이상 개선되었다는 php7.0이 출시된지 몇년이 흘렀지만 여전히 PHP 5.X를 제공하고 있는 업체도 많습니다.

이에 반해서 직접 서버를 운영하는 방법은 서버 공부를 해야하는 부담은 있지만(물론 이런 사이트 하나 운영하려고 서버 공부를 한다는게 본말이 전도된 일 일 수 있습니다.) 가장 효과적으로 사이트를 운영할수 있는 방법이기도 합니다.

여기에는 단독 서버를 운영할 수도 있고, 클라우드 기술을 적용한 가상서버호스팅(VPS)를 이용할수 있습니다. 특히 가상서버호스팅을 이용하면 적은 비용을 가지고 높은 성과를 낼 수 있습니다.

저는 Vultr에서 5$ 플랜을 사용하고 있는데요. 여기에는 1GB 메모리에 25GB SSD 그리고 1TB 트래픽이 주어집니다.

우리나라 웹호스팅 업체 중 가장 크다는 카페24에서 월 5500원 플랜을 보니 SSD가 아닌 일반 HDD 3GB, 트래픽은 월 5.5GB를 주고 더우기 초기 설치비를 11,000원을 받고 있네요.

저의 경우 데이타가 5GB에달하고 월 트래픽이 60GB정도 나오므로 이를 수용하려면 카페24에서는월 33,000원 플랜은 선택해야 합니다. 이것만 보아도 웹호스팅과 가상서버호스팅과의 엄청난 차이를 느낄 수 있습니다.

제가 Vultr 사용했던 경험을 간단히 정리한 아래 포스팅을 참조하시면 도움이 될 것 같습니다.

결국 서버 운영에 대해 어는 정도 배워서 능력과 의지가 되면 가성비가 뛰어난 가상서버호스팅(VPS)를 사용하시고 그런 시간적 여유가 없다면 웹호스팅업체 중 평이 괜찮은 웹호스팅 업체를 고르면 좋을 것 같습니다.

제가 이전에 이용했던 업체 중에서는 루아틱이 그나마 괜찮았었습니다. 문제가 생겨 새벽에 전화해도 대응해 주셨으니깐요. 그리고 서버당 사용 사이트가 많지 않았다고 알고 있습니다.

3. 서버 세팅 – 어떻게 서버를 꾸릴 것인지?

아래 내용은 가상서버호스팅(VPS)를 사용한다는 것을 전제로 이야기를 풀어가도록 하겠습니다.

가상서버호스팅(VPS)을 선택했다면 본인이 직접 서버를 설치해야 합니다. 처음 하기엔 두려운 일이지요.

국내에서 제공하는 가상서버호스팅(VPS) 중에서는 별도로 서버 설치비를 받고 서버를 설치해 주는 곳도 있습니다. 업체에서 알아서 설치해주죠. 설치가 두렵다면 이런 업체를 이용하는것도 방법입니다.

다만 이 경우 자유롭게 설버를 변경하면서 테스트해보기 힘듭니다. 서버 설치할때마다 일정 수수료를 내고 설치해달라고 해야 합니다.

가상서버호스팅

그러나 Vultr, Linode와 같은 해외 가상서버호스팅은 철저히 개인이 알아서 해야 합니다.

사용료만 받기 때문에 서버 설치를 무한 반복해도 추가 비용이 들지는 않습니다. 인터넷에는 서버 설치에 대해 잘 설명된 매뉴얼들이 많으므로 이를 보고 차근 차근 하면 문제없이 설치할수 있습니다.

저는 라엘님의 글 Ubuntu 16.04 LTS 웹서버 세팅방법 (Nginx + PHP7-FPM + MariaDB) 를 참조해서 연습을 했습니다. 여기서 가이드하는대로 차근 차근 따라하면 별 문제없이 설치 할 수 있었습니다.

[업데이트] 최근 사양을 적용한다면 우분투 20.04와 PHP 8 기반 워드프레스 설치 방법이란 글도 참조하면 좋을 것 같습니다.

가상서버호스팅을 시작했다면 서버를 설치해보고 기본 세팅 정도는 할 수 있어야 할것 입니다. 저도 이 분야를 전혀 모르는 문외한 이었지만 구글링의 힘을 빌어서 거의 1년 반동안 서버를 운영해 오고 있습니다. 물론 상당히 많은 시간 투자를 해야 합니다.

서버 설치 시 엔트리급 서버를 운영한다면 아래 내용을 참고하는 게 좋을 것 같습니다. 엔트리급은 Vultr아나 Linode 기준으로 월 2.5$,또는 5$ 플랜으로 디스크 용량은 크지만 메모리가 작은 경우입니다.

  • 메모리가 적은 엔트리급에서는 32비트 운영체제를 사용하는게 도움이 됩니다. 원래 윈도우즈에서도 32비트 운영체제는 기본 4GB만 지원할 정도로 적은 메모리에서 작동하도록 만들어져 있습니다. 그렇기에 램 512MB, 765MB, 1GB등 엔트리급 사양으로 워드프레스 사이트를 운영한다면 32비트 Ubuntu나 Centos등 운영 체제를 선택하면 조금 도움이 됩니다.
    요즘 대세인 64비트 운영체제는 풍부한 메모리사용을 지원하기 위해서 개발되었고 그러다보니 기본적으로사용하는 메모리가 큽니다.
    운영 체제별 최소 사양을보니 Centos/ Ubuntu 32비트는 최소 메모리로 512MB를 권장합니다. 64비트는 1GB를 권장하는데 예전 경험으로 보면 512MG나 756MB도 돌아가긴 하더라구요.
  • 데이타베이스 설치 시 메모리를적게 사용하는 MyISAM 같은 데이타베이스를 선택할 필요가 있습니다. 요즘 InnoDB가 대세이고, 이를 적용하는 것중에 MariaDB가 가장 좋다고 많이 선택합니다, 그런데 이게 기본적으로 예전에 사용하던 것에 비해서 많은 메모리를 사용합니다. 그래서 조금 성능은 떨어지지만 MyISAM를 적용할 수 있습니다.

사이트 운용에서 빠른 메모리를 많이 확보하는것이 성능을 높일 수 있는 지름길이므로 엔트리 사양이라면 가능하면 많은 메모리를 확보할 수 있는 운영체제, 데이타베이스, 플러그인등을 선택하는 게 좋습니다.

이렇게 말씀드리지만 저는 1GB 메모리지만 이미 64비트 운영체제,MariaDB를 설치해 적용하고 있어서 이를 중심으로 설명드릴 예정입니다. 그리고 조만간 RAM을 2GB로 업그레이드할 예정입니다.

서버 세팅에서 워드프레스 설정까지 정리했던 아래 포스팅을 참고하면 좋을 것 같네요.

서버 세팅 관련 XETOWN에서 활동하시는 가진곰님이 서버 세팅, 성능 튜닝 등의 컨설팅을 제공하고 있는데 필요하면 이 서비스를 이용해보는 것도 도움이 됩니다.

가진곰, 2015.08.19 16:08:33
서버 세팅, 성능 튜닝, 이전, 관리대행 해드립니다.

4. 어떤 테마를 쓸 것인가? 빠르고 가벼운 무료 테마?

워드프레스 속도 개선 방법 중 많이 언급되는 내용중의 하나가 웹서버에 요청하는 내용을 최소화하라는 내용이 있습니다. 웹서버는 요청 내용 하나 하나마다 별도로 작업해서 대응 하므로 요청 명령을 최소화하는 게 속도를 빠르게하는 지름길이긴 합니다.

그러면 어떤 경우 요청 명령이 많아질까요? 웹페이지에 다양한 효과와 기능을 적용하면 이를 구현하기 위햐서 필연적으로 많은 요청을 할수 밖에 없습니다.

제가 처음으로 유료로 구입한 테마가 Newspaper 7.0였는데요. 테마에서 제공하는 멋진 기능들을 적용하니 요청 명령이 120개에서 150개까지 증가하더군요. 이 많은 명령을 처리하다보면 속도가 느려지겠지요.

이에 반해서 기본 기능 중심으로 구현된 테마는 첫 화면의 요청 명령이 30개 이하로 간단하게 구성됩니다. 이런 테마는 실행 명령이 많지 않으므로 빠르게 작동될 수 있습니다.

결국 요청 명령이 적도록 최적화하는 게 필요합니다.

제가 사용하는 newspaper 테마를 처음에는 대부분의 기능을 적용해 요청 명령이 120개가 넘었습니다. 어떻게하면 그 요청 명령 수를 줄일까 고민한 끝에 사용 기능을 단순화하고 화려한 디자인 요소들을 최소화해 요청 명령을 80개수준까지 줄였습니다.

정답은 아니지만 무료이면서도 어느 정도 기능을 갖추면서도 가벼운 테마로는 다음과 같은 테마들이 많이 거론됩니다.

무료 테마와 보안 문제

속도를 고려하면 무료로 배포되는 심플하고 단순한 테마가 답일 수 있습니다.

저도 Newspaper를 사용하다 진짜 가볍고 단순하면서도 디자인적으로 나쁘지 않은 테마로 변경 사용을 시도했습니다. 처음에는 가볍기 때문에 만족하면서 사용했는데요. 어느 순간 이것도 문제가 있다는 것을 알았습니다.

어느날 사이트가 갑자기 이상하게 작동하기 시작하는 것 입니다. 어떤 주소를 입력해도 똑같은 페이지로 이동해버리는 문제가 발생했는데요. 원인을 알기 위해 이런 저런 시도를했지만 워드프로세스를다시 설치하는 것외는 방법을 찾지 못했습니다. 그런데 테마를 Newspaper와 같은 최신 유료 테마로 변경하니 단박에 문제가 해결되더군요.

제가 적용했던 가벼운 테마들은 개인이 무료로 공개하는 것들이었는데요. 이들은 업데이트가 거의 없었고 특히 보안 이슈로 반드시 업데이트가 필요한 경우에도 대응을 않하거나 못하는 경우가 많은 것 같았습니다.

이런 경험을 하니 꼭 속도가 빠른 가벼운 무료 테마가 좋은 것은 아니다라는 생각이 들었습니다. 어느 정도 돈이 들더라도 꾸준히 기능 및 보안 업데이트가 빨리 빨리 이루어지는 테마를 사용하는 게 장기적으로는 이익이라는 결론을 얻었습니다. 그래서 다시 유료 테마인 Newspaper 8.5로 돌아왔습니다.

결론은 안정성있는 유료 테마중에서 꼭 필요한 기능 중심으로 커스터마이징해서 사용하는 게 좋습니다.

[업데이트] 워드프레스를 사용한지 5년 가까이 되면서 생각해보묜 Newspaper와 같은 완전한 유료보다는 위에서 언급한 Astra, GeneratePress, OceanWP와 같은 무료 버전과 유료 버전이 같이 있는 테마를 사용하는 것이 좋다는 생각을 합니다.

이러한 테마들은 무료 버젼도 유료 버전을 유지하기 위해서는 계속 업데이트 및 업그레이드를 해야 하기 때문에 상대적으로 안전합니다.

5. 웹브라우저에서 서버까지 길 빨리 찾기

앞에서 사용자가 워드프레스 컨텐츠를 보기 위해 인터넷 브라우저에서 명령을 내리면 브라우저는 컨텐츠가 있는 사이트 서버가 어디에 있는지를 찾습니다. 이를 전문 용어로 DNS Lookup이라고 하는데요. 브라우저가 사이트 서버가 있는 곳을 빠르게 찾을 수 있도록 만들어 것이 필요합니다.

그러면 DNS Lookup 시간을 어떻게 줄일 수 있을까요?

일반적으로 한국 업체에서 도메인을 구입하고 한국 서버를 사용하면 DNS Lookup 시간은 거의 걸리지 않는 것 같습니다. 네이버의 경우 30ms가 나오네요.

저는 미국 업체인 LuckyRegister 에서 도메인을 구입하고 서버도 일본에 있는 vultr을 사용해서인지 처음엔 DNS Lookup 시간이 250ms까지 나오더군요.

이를 개선하기 위해 아래와 같은 조치를 취했습니다.

5.1. 도메인 등록처를 한국 업체로 변경

우선 도메인 등록 업체를 반값도메인 으로 옮겼습니다.

5.2. DNS관련 서버 설정 변경

데이타베이스 최적화를 위한 my.cnf 항목중에 name-resolve 항목이 있는데요. 여기에서는 DNS lookups 호스트 네임과 IP를 매번 확인 후 작동하므로 느려질 수 있다고 합니다.

따라서 skip-name-resolve 명령어를 추가해서 이를 방지합니다.

skip-name-resolve
Code language: PHP (php)

다음으로는 구글 페이지스피드 모듈(Google PageSpeed Module)에서 DNS resolution time 축소하는 아래 모듈을 활성화 합니다.

pagespeed EnableFilters insert_dns_prefetch;
Code language: PHP (php)

이 결과(솔직히 어는 항목이 효과를 보았는지 분간이 잘 안됩니다.) DNS lookup 시간은 30ms 정도로 줄었습니다. 물론 때에 따라서는 100ms가까이 가는 경우도 간혹 나오지만 30ms 정도로 안정적인 속도가 나옵니다.

[업데이트] 여기서 이야기하는 구글 페이지스피드 모듈(Google PageSpeed Module)은 구글에서 야심(?) 시작한 웹 개선 프로젝트였지만 몇년전부터 중단되었습니다. 그리고 서버에서 엄청난 자원을 사용하면서 오히려 성능이 낮아지는ㅁ 누제도 있기 때문에 거의 사용하지 않습니다.

6. 캐시 플러그인?

이 단계부터는 서버단에서 작업 효율을 높이는 방법에 대해서 살펴 보겠습니다.

가장 먼저 살펴볼 것이 cache를 잘 활용하는 것인데요. 어쩌면 가장 극적으로 성능이 개선 되는 것을 볼 수 있는 것이 바로 이 캐시(cache) 사용이 아닐까 합니다.

앞에서 설명했지만 서버는 브라우저에게서 받은 요청을 수행하려고 이 내용이 어디에 있는지를 찾고, PHP에게 사람들이 이해할 수 있는 HTML 파일로 만들도록 시키죠. 그러면 PHP는 데이타베이스에서 정보를 찾아 HTML 파일을 만드는데요. 이런 과정을 건너 뛰게 하거나 쉽게 할 수 있도록 만드는 게 캐시의 역활입니다.

이 캐시에는 여러 가지 종류가 있는데요. 제가 보기엔 3가지로 정리할 수 있습니다.

  • HTML 파일 전체를 cache하는 Full Page Cache
  • PHP Script한 결과를 보관하고 있는 PHP Script Cache
  • 데이타베이스 관련해 Query 결과를 모아 두는 Query Cache
NGINX 서버 작동 플로우차트 Flow chart

일반적으로 cache라고하면 캐시 플러그인(cache plug-in)을 떠올리는데요. 저는 이런 캐시 플러그인들이 충돌을 많이 일으켜서 가능하면 서버에서 제공하는 cgche 기능을 활용하는 것을 선호합니다.

6.1. Full page caching – FastCGI

Full page caching은 완성된 HTML 페이지를 디스크(RAM 용량이 많다면 RAM Disk)에 저장하고 있어서 브라우저로부터 요청 시 여기서 바로 컨텐츠를 보여주므로 실제로 속도도 빨라지고 체감 속도도 엄청 빨라 집니다.

이러한 Full page caching은 웹서버를 설치시 같이 설치되는 FastCGI의 성능이 우수하다고 알려져 있습니다.

아래는 FastCGI가 작동하는 다이어그램인데요. NGINX, PHP-FPM, MySQL 사이의 관계를 잘 보여주고 있습니다. 이 다이어그램은 ashleys라는 곳에서 배포한 것입니다.

FastCGI 작동 방식 다이어그램 ashleys-server-architecture

FastCGI cache는 서버 부하를 줄여주고, 사이트 속도를 빠르게 해주는데요. cache된 페이지 중심으로 로딩 속도가 빨라지고, TTFB(Time To First Byte, 서버에 요청해 첫 데이타를 받기까지 걸리는 시간)가 절반 이하로 줄어듭니다.

이 FasrCGI 설정 및 사용 방법에 대해서는 아래 포스팅을 참조하시기 바랍니다.

6.2. PHP Script Cache

NGINX 요청은 받은 PHP는 PHP script를 수행하게 되는데요. PHP Interpreter는 PHP Script를 컴파일하고 그 결과를 Shared Memory에 저장한 후 결과를 수행하게 됩니다. 나증에 똑같은 요청이 오면 Shared Memory에 Cache된 결과물을 이용하므로 속도를 증대시킬 수 있습니다.

아래는 PHP Script를 처리하는 과정에 대한 플로우 차트인데 Cache와 PHP Script 컴파일이 잔행되는 프로세스를 살펴볼 수 있습니다. 이 플로우 차트는 Basics of PHP opcode cache 에서 가져왔습니다.

php opcache flow chart

이런 PHP Script 결과를 Cache해주는 프로그램에는 여러가지가 있지만 PHP에 기본 내장되는 OPcache가 가장 성능적으로 우수하다고 합니다.
OPcache 사용에 대해서는 아래 포스팅을 참조하시기 바랍니다.

6.3. Query Cache

그 다음으로는 HTML 문서를 구성하기 위해서는 데이타베이스에 접속해 결과를 받아와야 하는데요. 이 단계에서도 자주 사용하는 데이타베이스 질문, 이를 query라고 부르는데요. 이 쿼리(query)에 대한 결과를 모아 놓아 효율을 높이고 있습니다.

이런 cache는 데이타베이스 자체적으로 지원하고 있지만 별도로 memcached라는 프로그램을 설치해 사용하기도 합니다.

memcached 설치 및 활용에 대해서는 아래 포스팅을 참조해 보세요.

6.4. Cache 플러그인

위에서 거론한 방식들은 서버단에서 직접 적용하는 것이라서 일방 웹호스팅에서는 적용하기 어려울 수 있습니다.

이럴 경우는 비슷한 효과를 내주는 캐시 플러그인을 설치할 수 있는데요. 여기에는 WP Super Cache, W3 Total Cache, WP Rocket 등등이 있습니다.

이러한 캐쉬 플러그인들은 각기 독특한 특징을 가지고 워드프레스 성능을 높여주고 있는데요. 각기 특징이 다르고 운영하고 있는 사이트와 잘 맞는지를 점검해서 사용해야 합니다.

기능이 많다고 좋은 성과를 내는 것도 아닙니다. W3 Total Cache는 캐쉬 플러그인중에서 가장 다양한 기능들을 적용하고 있습니다. 그렇다고 W3 Total Cache가 가장 좋은 성과를 보여 준다는 것은 아닙니다. 우수한 편이지만 가장 우수하다고 볼 수는 업죠. 그리고 복잡한 기능을 적용하다보니 충돌이 많은 편입니다.

캐쉬 플러그인에 대한 여러가지 벤치마킹한 자료들을 보면 이 테스트 결과에서 수위를 차지하는 것은 CacheEnabler, WP Rocket 또는 WP Super Cache등이 많이 거론되고 있습니다.

6 Best WordPress Caching Plugins Compared

[업데이트] 위에서 언급한 cache 플러그인들은 서버와 충돌하는 경햐잉 있고 기본적으로 cache를 하드디스크에 저장할 수 밖에 없기 때문에 Nginx나 아파치 웹서버에서 제공하는 FastCGI를 이용하는 것이 가장 낫다는 생각입니다.

7. 렌더링 속도를 빠르게 하기 – 압축과 용량 줄이기의 모든 것

서버에서 사용자에게 HTML 형식으로 보여질 준비를 마치면 서버는 크롬같은 인터넷 브라우저를 통해서 HTML 내용을 보여주는 렌더링을 시작합니다.

이 렌더링 속도를 빠르게 하기 위해서는 절대적으로 서버로부터 다운 받아야 하는 양이 적어야 합니다.
이를 위해서 여러가지 방법이 동원됩니다. 아래처럼 크게 4가지로 분류해 볼 수 있습니다.

7.1. 절대 요청 명령 수를 줄이기

앞의 테마 이야기에서에서도 강조했던 절대 요청 명령 수를 줄이는 방법이 있습니다. 이는 서버가 작업하는 시간을 줄여주는 동시에 다운 받을 절대 용량을 줄여주는 효과가 있기 때문입니다.

이는 인터넷 사용자들에거 어떤 컨텐츠를 보여줄지 어떤 디자인으로 보여줄지라는 기획적 요소와 많이 연관이 되어 있습니다. 여기서는 디자인/기능과 효율과의 절묘한 줄타기가 필요한 순간이긴 합니다.

7.2. 압축으로 절대 용량을 줄이기

이왕 받을 내용이라면 압축을 통해서 가볍게 하는 방법이 있습니다. 여기에는 리눅스 계열의 압축 프로그램인 gzip을 통해서 압축하는 방법이 널리 사용됩니다.

gzip을 할 수 있는 파일 형식은 다양합니다.
아래는 제가 gzip 압축 적용하고 있는 파일 형식들입니다.

  • text/html
  • application/x-javascript
  • text/css
  • application/javascript
  • text/javascript
  • text/plain
  • application/json
  • application/vnd.ms-fontobject
  • application/x-font-opentype
  • application/x-font-truetype
  • application/x-font-ttf
  • application/xml
  • font/eot
  • font/opentype
  • font/otf
  • image/svg+xml

7.3. 필요없는 내용을 없애 용량을 줄이는 minify

다운 받을 파일에서 필요 없는 부분, 예를 들어 주석이라든지, 빈 공간이라든지를 지워 용량을 가볍게 하는 방법입니다. 이를 Minify라고 부르는데요.

이렇게 minify하는 방법에는 여러가지가 있습니다.

  • 가장 무식한 방법으로 서버 운영자가 각각 CSS 파일, Java Script 파일 등등을 줄일 수도 있습니다. 이는 것은 너무 힘들고 비효율적입니다. 그리고 수시로 업데이트되기 때문에 대응 불가능하죠.
    저도 Newspaper 테마의 style.css 파일이 무려 1MB에 육박하기 때문에 필요없는 부분을 지워서 0.5MB로 만들어서 사용한적이 있습니다. 우선 속도가 얼마나 빨라졌는지 차이가 나지않고요. 업데이트될때마다 이런 작업을 매번 다는 할 수는 없어서 포기 했습니다.
  • 다음으로는 Minify를 해주는 워드프레스 플러그인을 활용하는 방법입니다. 널리쓰이는 Autoptimize는 이런 파일들을 minify해주고 caching해 줍니다. 다만 이 방법은 다소 느리기 때문에 별로 권장하지 않는 방식입니다.
  • 가장 속도가 빠른 것은 NGINX나 APACHE 서버를 설치 시 구글 페이지스피드 모듈(Google PageSpeed Module)을 포함해 컴파일해서 서버에서 직접 알아서 minify 하도록 하는 방식입니다.
    이는 제가 사용하는 방식인데요. 뒤에서 소개하는 구글 페이지스피드 모듈(Google PageSpeed Module)을 참조하시기 바랍니다.
    이 방식의 단점은 컴파일이 다소 복잡하고 조금(20분정도?) 시간이 걸립니다.
  • 서버에서 작업케하는 Perl 모듈과 Minifier 패키지를 설치해 사용하는 방법이 있습니다. 여러가지 세팅을 건들어야해서 복잡하긴 합니다. 이 방법에 대해서는 NGINX 사이트 속도 최적화 html CSS JS 파일 Minify 전송 하는 방법 을 참조하시면 좋을 것 같습니다.

[업데이트] 워드프레스 속도를 높여주는 minify나 스트립트 작동을 제어를 도와 주는 많은 플러그인들이 있습니다. 대표적으로는 아래와 같은 플러그인들이 많이 거론됩니다.

제가 여러가지로 테스한 결과로는 Asset CleanUp은 유료 버전에서나 제대로 성능을 내는 것 같고, Perfmatters는 유료 버전만 있는데 상대적으로 저렴합니다.그리고 성능도 괜찮습니다. 그래서 Asset CleanUp 무료 버전 사용하다가 Perfmatters를 사용하고 있습니다.

7.4. 이미지 압축

렌더링이 시작되면 다운 받는 내용중 가장 많은 비중을 차지하는 것 중의 하나가 이미지입니다.

아래는 제 사이트 메인의 컨텐츠 종류별 요청 비중과 다운받은 용량 비중을 나타낸 그래프인데요. 이미지 요청은 68개로 비중이 52.3%나 차지하지만, 실제 다운 용량 비중은 35%로 오히려 적어지고 있습니다.

이렇게 68개나 되는 많은 이미지이지만 적절하게 압축해서 다운 용량을 0.4MB로 최적화했기 때문에 비중이 줄어드는 효과를 본 것입니다.

컨텐츠 중 이미지 비중 happist.com

그러면 여기서 제가 어떻게 이미지를 최적하하고 있는지 이야기 해보겠습니다.

  • 먼저 포스팅 시 이미지는 가능하면 jpg 중심으로 사용합니다. 가장 압축율이 높기 때문입니다.
  • JPG라도 압축율을 70%~85%로 높여 이미지를 가볍게 만듭니다. 이반 이미지는 70% 압축율을 적용하고, 글씨들이 많이 포함된 이미지는 85% 정도로 압축을 약하게 합니다.
    압축율이 높아지면 글자가 흐릿해지더군요. jpg 아축율은 80%정도가 적절하고 하는데 80% 압축하면 구글 페이비스피드로 측정해보면 압축을 더하라고 가이드하더군요.
  • 서버단에 적용된 구글 페이지스피드 모듈(Googke PageSpeed Module)에서 각종 이미지 압축 기술을 적용토록 옵션을 두고 있고 특히 크롬등에서 적용하는 webP 포맷을 적ㅇ요토록 하고 있습니다.
    이에 대해서는 아래 포스팅을 참조하세요.

7.5. 디자인과 속도를 고려한 폰트 사용

사이트를 유려하게 보이기 위해서는 각자 취향에 맞는 폰트를 적용합니다. 흔히 알려쟈 있듯 영문 폰트는 크기가 작아서 폰트 적용에 큰 부담이 없습니다. 그래서 폰트 디자인 사상대로 다양하게 폰트를 적용할 수 있습니다. Bold, Italic 등등

그러나 한글 폰트는 용량이 크기때문에 이러 사치를 부릴 여유가 많이 없습니다.

저는 폰트 디자인과 속도 사이에 타협점으로 사용자 PC에 설치된 폰트를 최대한 활용하는 방안을 사용하고 있습니다.
사용자가 PC에 설치해놓은 다양한 폰트를 불러오고 만일 이것도 없다면 웹폰트를 다운하는 방식입니다.

즉 사용자 PC에 나눔바른고딕(애플 계열이라면 애플 SD 산돌 고딕)이 있는 지 확인하고 없으면 → 맑은고딕(애플 계열이라면 Apple SD Gothic Neo)을 찾고 이 또한 없으면 → 나눔 바른 고딕이나 최근에 각광을 받고 있는 본고딕을 다운받도록 한 것이죠.

그리고 스마트폰은 이미 스마트폰에서 최적화된 폰트로 보여주므로 신경을 끄는 게 좋기에 스마트폰은 대응을 하지 않고 있습니다.

이에 대해서 잘 정리했던 포스팅을 참고해 보시기 바랍니다.

7.6. CDN(contents delivery network)

외국이라면 전체 속도에 효과 있고, 트래픽이 절감되며 보안에도 유리한 방법이 바로 CDN(contents delivery network)인데요,

위키에서 CDN(contents delivery network)을 아래와 같이 정의하고 있습니다.

콘텐츠 전송 네트워크(Content delivery network 또는 content distribution network (CDN))는 콘텐츠를 효율적으로 전달하기 위해 여러 노드를 가진 네트워크에 데이터를 저장하여 제공하는 시스템을 말한다.

서버와 사용자사이 인터넷 중간에 CDN이라는 별도 cache 역활을 하는 다수의 서버에 컨텐츠를 저장해놓고 사용자는 가장 가까운 CDN 서버에서 컨텐츠를 받을 수 있도록 한 것으로 먼곳의 사용자가 빨리 접속할 수 있습니다.

그러나 이 서비스에는 두가지 문제가 있다고 알려져 있습니다.

  1. 첫째는 CDN을 걸쳐서 컨텐츠를 받기 때문에 TTFB가 느리게 나옵니다.
    이 TTFB 속도에 대해서 CDN 서비스의 대표격인 클라우드 플레어에서는 TTFB가 중요하지 않다고 발표했었고 구글에서 반박하는 해프닝이 있었습니다.
    이에 대해서는 hackYa님의 글 클라우드플레어 (CloudFlare)를 쓰지 말아야 하는이유를 참고하세요.
  2. 둘째는 클라우드플레어 (CloudFlare)같은 글러벌 서비스는 여러가지 정책 상 비지니스 플랜이외에는 한국 서버가 아닌 해외 심지어는 유럽 서버로 연결되어 속도가 엄청 느려 진다고 합니다.
    특별히 트래픽 절약 목적이 아니라면 사용하지 말자는 이야기가 많습니다.
    이에 대해서는 XETOWN 가진곰님의 글을 참고해 보세요. 제발 해외 CDN 좀 사용하지 맙시다.

이러한 이유로 저는 CDN(contents delivery network)은 사용하고 있지 않습니다. 아직 트래픽을 5%(월 1TB 트래픽 중 약 60GB 사용)밖에 사용하지 않아서 트래픽을 절약할 이유도 없구요.

8. 워드프레스 군더더기 없애기

다음으로 생각할 게 워드프레스에 불필요한 군더더기를 최소화 하는 것 입니다.

이러한 군더더기에는 무엇이 있을까요? 군더더기라고 표현하니 쓸모없는 것이라고 생각하기 쉽지만 정확히 표현해서 중요성이 떨어지는 것입니다.

8.1. 워드프레스 리비젼(Revision) 갯수 제한

워드프레스로 글을 작성하다보면 계속 내용을 업뎅트 하게 됩니다. 그러면 워드프레스는 무한적으로 수정 버젼을 기록하는데요. 이를 리비젼(Revision)이라고 부릅니다.

정말 중요한 문서가 아닌 이상 글의 히스토리를 기록할 필요가 없고 대부분 이전 버젼을 참고하므로 리비젼(Revision)이 거의 필요 없거나 최소로 남겨 놓는 게 효율적입니다.

가장 쉽게는 wp-config.php에서 아래 문구를 넣어 리비젼(Revision) 갯수를 제한 합니다.

/** 리비젼(Revision) 3개만 남기기 */
define( 'WP_POST_REVISIONS', 3 );
Code language: PHP (php)

이와 관련해서는 아래 포스팅을 참고해 보시기 바랍니다.

8.2. 휴지통을 관리

워드프레스는 2.9버젼부터 휴지통 기능이 생겨 포스팅, 댓글, 미디어 등을 삭제하면 휴지통으로 이동해 치종 39알 경과하면 완전히 없어집니다.

자주 포스팅, 댓글, 미디어등을 지운다면 휴지통에 많은 정보들이 모여 데이타베이스 공간을 차지하고 데이타베이스가 커지면 실행 속도가 느려질 수 있습니다.

따라서 주기적으로 휴기통을 지워주든지 휴지통에서 비워주는 기간을 30일보다 앞당기는 것도 한 방법입니다.

워드프레스 wp-config.php에서 아래 문구를 넣어 휴지통에서 완전 삭제하는 기간을 단축합니다.

/** 휴지통 완전 삭제 기간을 10일로 단축하기 */
define ('EMPTY_TRASH_DAYS', 10);
Code language: PHP (php)

8.3. 트랙백과 핑백 알림을 사용하지 않기

워드프레스는 커뮤니케이션 활성화를 위해 트랙백과 핑백을 기본으로 알려주는 기능을 적용하고 있습니다.

그러나 스팸등의 이유로 이런 기능을 없애는 블로그 툴들이 늘어나고 있습니다. 네이버 블로그나 티스토리는 아예 트랙백 기능을 없앴습니다.

워드프레스에서도 스팸 위험이나 데이타베이스를 가볍게 만들기 위해 트랙백과 핑백 알림을 사용하지 않토록 설정할 수 있습니다.

워드프레스 설정 – 토론의 기본글 설정에서 “새로운 글에 다른 블로그에서 오는 링크알림(핑백이나 트랙백)을 허용”부분의 체크를 없애면 됩니다.

워드프레스 최적화 트랙백과 핑백 알림을 사용하지 않기

저는 이게 워드프레스 속도에 미치는 영향이 크지 않다고 생각하며, 스팸의 위협도 Disqus 등을 적용하면 거의 없으며 블로그의 본질이 커뮤니케이션에 있다고 생각해서 아직은 유지하고 있습니다.

8.4. 플러그인 최소화, 가벼운 플러그인 사용

워드프레스로 사이트를 운영하다보면 매력적인 기능을 제공하는 다양한 플러그인을 만나게 됩니다. 그러면 그 기능과 디자인에 혹해서 하나 둘씩 플러그인을 늘랴가게 되죠.

하지만 워드프레스는 이러한 플로그인이 늘어날수록 이런 플러그인을 모두 처리하고 컨텐츠를 보여주므로 워드프레스를 느리게 할 수 있습니다.

앞에서 계속 강조했던 최적화를 위해서 요청 명령수를 최소화하자는 원칙에서 벗어나 요청 명령수를 늘리고 속도를 저하하게 됩니다. 따라서 정말 꼭 필요한 플로그인인지 심사 숙고한 후 설치해야 합니다.

저는 플러그인을 7개 내외로 최소화하고 있습니다.

그리고 꼭 필요한 플러그인이라면 상대적으로 가벼운 플러그인이 무엇인지를 고민할 필요가 있습니다.

SNS 공유 플러그인을 검토한 예를 말씀드리면 플러그인에 따라 로딩 속도차이가 컸습니다. 당시 Monarch, AddThis, AddToAny 그리고 Sassy Social Share를 검토했는데요. 플러그인에 따라서 로딩 시간이 최대 1초까지 차이가 났습니다.
기능이나 멋진 디자인에도 불구하고 0.5초 ~1초 까지 감수할 이유는 없었습니다. 결국 가장 가벼워 보이면서도 커스터마이징이 가능한 Sassy Social Share를 적용했습니다.

따라서 목적에 맞추되 로딩 속도가 빠른 가벼운 플러그인을 선택하는게 필요합니다.

9. 속도 측정 결과

이런 여러가지 최적화를 통해서 최종 속도는 어느정도 나올까?
아래는 여러 측정도구 중 가장 잘 나왔던 Webpagetest.org에서 측정한 값 입니다. 로딩 타임 1.42초, TTFN 0.47초, 렌더링 시작 시간 1.09초로 비교적 양호합니다.

워드프레스 세팅 후 Webpagetest.org 테스트 결과 20180114 crop

10. 마치며

이상으로 간단하게 워드프레스 최적화 방안에 대해서 정리해 보았습니다.

개인적으로는 (아마 많은 원드프레스 사용자들이 공감할 것입니다. FastCGI를 제대로 적용했을 시 가장 급격하게 속도가 좋아졌습니다. 아마 이와 비슷하게 Full page cache에 집중해주는 cache enabler 등이 속도가 좋았던 이유도 마찬가지라고 생각합니다.

다음으로는 이미지 압축을 통해서 약 2.5GB의 이미지를 0.9GB로 줄였는데요. 이 때도 확실하게 다운 이미지 용량이 감소하니 도움이 되었던 것 같습니다.

이외에도 더 다양한 방안들이 있는데 이에 대해서 추후 업데이트 해보도록 하겠습니다.

[워드프레스 최적화] gzip 압축으로 워드프레스 로딩 속도를 개선 방법

인터넷 웹라우저 통신에서 http는 많은 부분을 차지하는데요. 이런 웹 브라우저 통신에서 속도 개선하기 위해서 gzip 압축, 브라우져 캐싱, js & css 압축 그리고 CDN(contents delivery network)과 같은 방법들이 적용되고 있습니다.

이러한 위의 웹 사이트를 최적화 방법 중 gzip 압축을 적용해 사이트 속도를 높이고 트래픽도 감소시키는 방법에 대해서 알아 봅니다.

아래 내용은 저자와의 협의하에 웹서버 최적화 -NGINX에서 gzip 압축으로 트래픽과 로딩 속도를 개선해 보자를 그대로 인용하였습니다.

1. gizip이란 무엇일까요?

위키백과 에서 gzip 설명 내용을 토대로 다시 정리해 보면

  • gzip은 GNU zip의 준말로 유닉스시스템에서 사용하는 압축 프로그램으로 시작되었다.
  • 1992년 10월 31일 Jean-loup Gailly와 마크 애들러가 만들어 처음 배포하였다.
  • 압축 구현 방법은 LZ77과 허프만 코딩을 조합한 DEFLATE알고리즘에 기반한다고 알려져 있다.

즉 gzip은 웹서버에서 사용하는 압축 프로그램으로 여기서 압축한 방식을 대부분의 웹 브라우저에서 지원하는 범용성때문에 웹서버 최적화 시 많이 사용하는 소프트웨어입니다.
리눅스계열등을 설치 시 기본으로 배포하는 프로그램으로 이를 사용하기 위해 프로그램을 설치할 필요가 없습니다.

2. gzip설정 옵션

gzip의 옵션에는 아래와 같은 것들이 있습니다.

  • gzip [on/orr] : gzip의 설정을 on/off하는 명령
  • gzip_disable [regex] : 해당 명령어 다음에 오는 문장이 요청 헤더에 User-Agent와 일치 시 압축하지 않음
  • gzip_vary [on/off] : gzip, gzip_static, or gunzip 설정이 on일 시 응답 헤더에 “Vary: Accept-Encoding”를 넣을지 말지에 대한 명령
  • gzip_proxied : 요청과 응답에 따라서 프록시된 요청을 압축할지 말지에 대한 설정으로 “any”로 설정하면 모든 응답에 대해 gzipping 압축을 수행
  • gzip_comp_level [level] : 응답에 대한 압축의 정도를 의미하며 level의 값은 1부터 9까지 가능
  • gzip_buffers [num] [size] : num은 버퍼의 갯수, size는 버퍼의 크기를 의미
  • gzip_http_version [versino] : minimum HTTP 통신 버전
  • gzip_types [types in array] : “text/html”외 추가로 gizip항 타입 정의

3. nginx에서 gzip설정

nginx에서 gzip을 설정하는 방법은 /etc/nginx 경로에 있는 nginx.conf 파일을 수정해서 설정합니다.

gzip을 적용 시 주의할 점이라고면 욕심에 모든 파일 압축을 요구하는데 이는 오히려 서버의 부하를 가중시켜 속도를 떨어뜨린다고 합니다.

  • gzip_min_length 1024;와 같이 압축해야 할 최소 크기를 지정, 어느 정도 큰 파일만 압축하라고 가이드 함
  • 이미지 파일은 압축이 안되기 때문에 압축 타입에서 빼라고 함
  • 단 이미지 파일이지만 SVG 파일은 코드 형태로 되어 있으므로 적용 가능

3.1. SVG 파일 압축 가능한지 확인

SVG 파일을 gzip 압축이 가능하게 하려면
먼저 NGINX에 이를 가능케 되어 있는지 mime types을 확인해야 합니다.

  • /etc/nginx/mime.types 파일을 열어 image/svg+xml svg svgz;가 있는지 확인하고 없으면 추가
  • 최근 NGINX에는 포함되어 있음

3.2. gzip 설정

아래와 같이 gzip 옵션을 적용합니다.

# enable gzip compression

gzip on;
gzip_disable "MSIE [1-6].(?!.*SV1)";  # IE 6이하에는 적용시키지 않음
gzip_vary on;
gzip_min_length  1024;
gzip_buffers     16 8k; 
gzip_proxied any;
gzip_comp_level 6; # 압축 레벨 1~9 사이 선택 
gzip_http_version 1.1;
gzip_types       text/html application/x-javascript text/css application/javascript text/javascript text/plain application/json application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/xml font/eot font/opentype font/otf image/svg+xml ;

#end gzip configuration

저장하고 nginx가 제대로 작동하는 지 테스트 한 후 문제가 없다면 nginx를 재 가동시킵니다.

nginx -t
service nginx reload

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

[워드프레스 최적화] gzip 압축으로 워드프레스 로딩 속도를 개선 방법 4

[워드프레스 최적화] FastCGI 적용 워드프레스 반응 속도 및 서버 로드 줄이기

오늘은 워드프레스 속도를 빠르게 하는 방법 중 상당히 효과가 좋다고 알려진 FastCGI 적용 방법에 대해서 알아보도록 하겠습니다. 이는 웹서버로 NGINX를 사용하는 경우 유용합니다.

웹서버로 아파치를 많이 사용하고 점유율도 높지만 얼마 전부터는 단순하면서 성능이 좋은 NGINX를 웹서버로 사용하는 경우도 늘었습니다. 특히 동접자가 많은 경우 NGINX가 메모리 관리 등에서 효율성이 있다고 알려져 그런 흐름이 가속화 되기도 했습니다.

그렇지만 아파치에서도 NGINX만의 장점들을 쉽게 구현하는 방법들이 등장해 아파치를 사용에도 별 문제가 없어져 차별화가 많이 희석되기도 했습니다.

1. FastCGI cache란?

일반적으로 사용자가 브라우저를 통해서 특정 페이지를 보겠다고 요청하면 NGINX는 PHP와 MySQL이라는 데이타베이스에게 명령을 내려 사용자가 요청한 페이지를 구성하게 하는데요. FastCGI는 NGINX와 PHP 사이에서 기존에 불러왔던 페이지를 저장해 놓고 있다가 사용자 요청이 오면 PHP나 MySQL의 도움없이 바로 사용자에게 보여주어 굉장히 빨리 처리해 속도를 높이고 시스템의 부하를 줄이는 역활을 합니다. 이를 업계에선 Full page caching이라고 부르고 있네요.

아래는 FastCGI가 작동하는 다이어그램인데요. NGINX, PHP-FPM, MySQ 사이의 관계를 잘 보여주고 있습니다.

FastCGI 작동 방식 다이어그램 ashleys-server-architecture

FastCGI cache는 서버 부하를 줄여주고, 사이트 속도를 빠르게 해주는데요. cache된 페이지 중심이긴 하지만 속도가 빨라지고 TTFB(Time To First Byte, 서버에 요청해 첫 데이타를 받기까지 걸리는 시간)가 절반 이하로 줄어듭니다.

2. FastCGI 적용 방법

그러면 이런 FastCGI cache를 적용하려면 어떻게 해야 할까요?

아래와 같이 순서대로 적용해 보시지요. FastCGI cache는 서버를 설치(NGINX, PHP, MariaDB 등) 시 자동으로 설치되므로 설되어 있는 기준으로 세팅을 어떻게 하는냐를 말씀드리겠습니다.

2.1. Nginx의 설정파일 nginx.conf 설정하기

먼저 Nginx의 설정파일인 nginx.conf에서 FastCGI cache 관련 내용을 설정합니다.

여기는 Nginx의 설정 파일 중 http 구간에 적용하는 코드가 되겠습니다.

FastCGI cache path 위치 지정

FastCGI cache path 위치는 아무 곳이라도 상관이 없습니다. 심지어 별도로 위치를 지정하지 않아도 NGINX가메모리 여유가 있으면 자동으로 Cache를 램에 올려 사용하고 모자라면 스압을 사용한다고 합니다.

그렇지만 필요에 따라서 FastCGI Cache 파일을 지우는 등 Cache 관리를 하려면 일정 폴더를 지정해 주어야 합니다. FastCGI Cache를 관리해주는 플러그인들은 대부분 Cache 폴더를 지정토록 하고 있습니다.

물론 폴더와 상관없이 FastCGI cache를 관리하는 방법이 있기는 한데 불안정하고 설치 버젼에 따라서 작동하지 않은 경우도 많기 때문에 cache 폴더 지정해 관리하는 것이 좋습니다.

그리고 몇가지 옵션을 테스트했지만 명확히 메모리 폴더를 지정하지 않으면, 우선 순위에서 밀리기 때문에 램에서 작동하지 않는 경우도 많아지는 것 같습니다.

그렇기 때문에 램에서 작동토록 하려면 Cache 폴더를 지정해 주어 확실하게 우선 순위를 설정하는 것이 나은 선택입니다.

또한 메모리가 충분하지 않다면 SSD로 구성된 스토리에 FastCGI cache 폴더를 지정해 운영하는 것도 차선책이 될 수 있습니다. 그렇지만 예전 느려빠진 HDD 스토리지라면 별로 추천하고 싶지는 않습니다. 콘텐츠 내용이 많지만 자주 업데이트 되지 않는 사이트의 경우 Cache 기간을 며칠 정도로 길데 잡아 효율성을 높일 때 유용할 것 같습니다.

제가 아는 사이트는 콘텐츠 양이 많다보니 8시간 정도로 길게 잡으니 cache 용량이 2GB를 넘어 버리드라구요. 이런 경우는 램을 업그레이드 할 수 없다면 SSD 스토리에 Cache 폴더를 설정해 운영하는 것도 아주 나쁘지는 않습니다.

당연히 비즈니스 사이트라면 램을 업그레이드해서 Cache 전체를 램에 올리는게 좋겠죠.

저는 용량은 적지만 빠른 RAM 메모리에 했는데요. 여기서는 두가지 경우를 모두 표현 했습니다.

# 일반 디스크에 6999MB 용량에 cache해 캐시 유효기간을 10분으로 유지하는 WORDPRESS라는 캐시 이름
#fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=WORDPRESS:2048mb inactive=8h; # Disk애 적용 시 

# RAM 메모리 512MB 용량을 할당, 10분동안 유지하는 WORDPRESS라는 캐시 이름
fastcgi_cache_path /dev/shm/fastcgi levels=1:2 keys_zone=WORDPRESS:512m inactive=10m; #RAM에 적용 시
Code language: PHP (php)

여기서 정말 강조하고 싶은 것은 위치 지정 후 정말 제대로 작동하는지를 꼭 확인하라는 것입니다. path 설정해 놓는다고 다 작동하지는 않으며 RAM에 올리는 방식 또는 Disk에 설정 시 스왑등이 제대로 설정되어 있는지에 따라서 제대로 작동하지 않을 수 있습니다.

FastCGI cache 중 발생 상황 대응 지정

그 다음은 FastCGI가 디스크에 파일을 배치하는 방법, FastCGI 서버와의 통신 중에 오류 발생 시 하는 경우 등 오래된 캐시를 사용할 수 있는 경우, 워드프레스 테마 중 종종 부적절한 헤더값을 보내주는 경우 무시하라는 옵션을 표기합니다.

fastcgi_cache_key "$scheme$request_method$host$request_uri$mobile_request";
fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
Code language: PHP (php)

FastCGI cache 조건 설정

fastcgi_cache_valid 200 301 302 60m;
fastcgi_cache_valid 404 30s; 
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_keep_conn on;
Code language: PHP (php)
  • 여기서 fastcgi_cache_valid 200 301 302 60m;은 응답코드가 200 301 302인 것을 캐시하고 그 캐시파일의 유효기간을 60분을 잡는 것입니다. 개인 사이트는 변경 내용이 많지 않으니 넉넉하게 시간을 주어도 좋을 것이고, 커뮤니티 사이트는 빨리 내용이 갱신되므로 1m(1분) 또는 30s(30초) 단위로 짧은 시간을 주는게 좋다고 합니다.
  • fastcgi_cache_valid 404 30s;은 응답코드가 404인 것은 30초마다 다시 갱신토록 했습니다.
  • fastcgi_buffers 16 16k; , fastcgi_buffer_size 32k;는 캐시 버터 크기 설정입니다.

FastCGI 캐시를 메모리에서 작동시키기

FastCGI를 일반 디스크에서 실행하는 것보다도 RAM 메모리에서 실행시키면 더욱 빠르겠죠.
RAM 시스템 메모리는 디스크보다 훨씬 빠르니 반응시간도 훨씬 빨라질 것 입니다.

먼저 RAM 디스크를 등록해 줍니다. /etc/fstab 파일을 nano 편집기를 열어 편집할 수 있도록 합니다.

nano -w /etc/fstab
Code language: PHP (php)



fstab에서 아래와 같이 RAM 디스크를 등록해 줍니다.

tmpfs /dev/shm/fastcgi tmpfs defaults,size=128M 0 0
Code language: PHP (php)



다음에는 RAM Disk를 구성할 디렉토리와 소유권등을 정리해 줍니다. RAM Disk로 /dev/shm/fastcgi를 나들겠습니다.

mkdir  /dev/shm/fastcgi
chown www-data:www-data /dev/shm/fastcgi
chmod +x /dev/shm/fastcgi
Code language: PHP (php)

이러면 자동으로 디렉토리를 만들고 그리고 나서 NGINX 시스템을 다시 실행합니다.

service nginx restart
Code language: PHP (php)

이제 새로운 RAM Disk를 마운트합니다.

mount -a
Code language: PHP (php)

참고로 RAM Disk를 없애려면 /etc/fstab에서 Ram 디스크를 지우고, 터미널에서 umount 명령을 사용합니다.

umount /dev/shm/fastcgi
Code language: PHP (php)


Nginx에 캐시폴더 권한을 줍니다

chown www-data:www-data /dev/shm/fastcgi
Code language: PHP (php)

이렇게 별도 폴더를 만들지 않고 우분투 설치 시 자동으로 만들어지는 /dev/shm 폴더를 그대로 사용하는 것도 방법입니다. 별도 폴더를 만들지 않아도 되기 때문에 더욱 간편하긴 한데요. 이 폴더에 다른 프로그램도 사용할 수 있어 fastcgi 폴더를 만드는 것도 나쁘진 않습니다.

2.2. 서버 블락에서 FastCGI cache 설정

지금부터는 서버 블락에서 FastCGI cache 관련 옵션 정리 방법입니다.

캐싱을 하지 말아야 할 경우 설정

캐싱을 하지 말아야 할 경우가 있는데 이 구간을 정의하는 부분입니다.

    set $skip_cache 0;

    # ---------------------------------------------------------------------
    # 캐싱을 하지 말아야 할 경우가 있는데 이를 정의하는 구간 CACHE SKIP RULES - START
    # ---------------------------------------------------------------------

    # Do not cache POST requests - they should always go to PHP
        if ($request_method = POST) {
       set $skip_cache 1;
    }

    # Do not cache URLs with a query string - they should always go to PHP
    if ($query_string != "") {
       set $skip_cache 1;
    }

    # WooCommerce-specific cache skip rules
    if ($request_uri ~* "/store.*|/cart.*|/my-account.*|/checkout.*|/addons.*") {
    set $skip_cache 1;
       set $skip_cache_reason WP_WooCommerce;
    }

    if ($cookie_woocommerce_items_in_cart) { 
       set $skip_cache 1; 
       set $skip_cache_reason WP_WooCommerce;
    }

    if ($request_uri ~* ("/cart.*")) { 
       set $skip_cache 1; 
    }

    # Don't cache URIs containing the following segments (admin panel, sitemaps, feeds, etc.)
    if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
    set $skip_cache 1;
    }

    # Don't use the cache for logged-in users or recent commenters
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
    set $skip_cache 1;
    }

    # ---------------------------------------------------------------------
    # CACHE SKIP RULES - END
    # ---------------------------------------------------------------------
Code language: PHP (php)

FastCGI와 PHP-FPM과 통합

이제 FastCGI cache와 PHP간 통합을 정의합니다.
이 부분도 마찬가지로 server 블락에 아래 내용을 추가 합니다.

    # Add PHP handler
    location ~ \.php$ {

    try_files $uri =404; # comment out this line if php-fpm is hosted on a remote machine
    include /etc/nginx/fastcgi.conf;
    fastcgi_cache WORDPRESS;
    add_header X-Cache $upstream_cache_status;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;

    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;

    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
        }
    }
Code language: PHP (php)

3. NGINX 재가동 및 작동 테스트

FastCGI 설정이 완료되면 nginx를 다시 가동시키고 제대로 작동하는지 테스트 해 봅니다.

먼저 문법 상 충돌되거나 오류가 없는지 config test를 진행합니다.

service nginx configtest
Code language: PHP (php)



“the configuration file /etc/nginx/nginx.conf syntax is ok” 라는 문구가 나오면 정상적으로 작동 가능한 것이므로 nginx를 다시 가동시킴니다.

service nginx restart
Code language: PHP (php)



이제 FastCGI가 제대로 작동하는지 확인해 봅니다.

ls -alhR /dev/shm/fastcgi
Code language: PHP (php)



그러면 현재 cache되고 있는 리스트가 주욱 나옵니다. 그러면 정상적으로 작동하는 것이니 기쁜 마음으로 마무리 합니다.

4. 시행 착오

무사히 FastCGI를 설치하고 작동하는 것을 확인하고부터 사이트의 속도가 굉장히 빨라졌습니다. 그리고 욕심을 내어서 몇가지를 조정했습니다.

  • 먼저 cache를 램에 올리고 메모리를 512MB을 할당했습니다.
  • 다음 cache 교체 시간을 1440m으로 상당히 길게 잡았습니다. 내용이 많이 바뀌지 않기 때문에 여유있게 잡아본 것입니다.

이렇게 설정을 바꾼 후 처음 엄청 빠른 속도를 보여 주었던 것이 시간이 지나면서 엄청 느려지기 시작했습니다. 사이트 메인의 TTFB가 처음에는 0.3ms정도였는데 어느 순간 1.3s까지 느려지더군요.

세팅 초기의 webpagetest.org 측정 결과

일정 시간 경과 후 webpagetest.org 측정 결과

왜 이런 문제가 발생했을까 여러가지 설정 테스트를 해보니 cache 유지 시간이 길고, RAM 512MB에 세팅한 cache가 꽉 찬 상태에서는 무엇인가가 제대로 작동하지 않는다는 결론을 얻었습니다.
cache를 비우고 cache 설정 시간을 30m 정도로 줄이니 제대로 작동했으니깐요.

결국 cache 메모리가 적다면 cache 교체 시간을 짧게 설정해야 한다는 결론을 얻었습니다.

하지만 나중에 생각해보면 Fastcgi는 설정한 용량이 차면 순서대로 Cache를 지우도록 되어 있기 때문에 위와 같은 해석은 근거가 없습니다. 어느 분이 스왑으로 변경하기 때문에 그럴 것이라는 의견을 주셨는데 앞에서 설명드린대로 SSD도 상당히 빠르기 때문에 설령 나머지가 스왑으로 전환되어 SSDㅇ서 작동한다고 해도 그 정도로 느려지지는 않습닏.

그후 FastCGI와 구글 모드 페이지 스피드를 같이 운영 시 나타나는 문제라는 것을 알았습니다. 구글 모드 페이지 스피드는 너무 열심히 일을 해서 구글 모드 페이지 스피드 캐시를 끊임없이 업데으이트하면서 CPU자원을 100%이상으로 사용하고 여기에 FastCGI Cache도 만드느라 이중 일을 하면서 속도가 느려지는 현상이었습니다. 이후 구글 모드 페이지 스피드를 제거 후 이런 문제를 만나적은 없습니다.

5. 참고 포스팅

[워드프레스 최적화] 스왑 메모리 설정으로 워드프레스를 안정적으로 운영 하기

Vultr 가상서버호스팅(VPS)에서 워드프레스 운영 중 메모리 스왑 파일을 적용해 속도를 향상시키는 방안에 대해서 알아 보겠습니다.

사이트 운영을 위해 서버를 설치 시 운영체제나 데이타베이스 종류는 최신의 트렌드를 반영하여 선택하기 마련입니다.
예를 들어 운영체제는 대부분 64비트를 선택하죠. 그리고 데이타베이스로 InnoDB가 적용된 MariaDB를 선택하곤 합니다. 이들은 가장 최신이고 가장 성능에서 앞선다고 알려진 것들 입니다.

그런데 여기에 함정이 있네요. 본격적인 사이트 운영을 위해 서버 사양을 빵빵하게 운영한다면 별로 문제가 되지 않겠지만 엔트리급을 선택하는 경우는 조금 다릅니다. 예를 들어 Vultr의 756MB 메모리를 가진 2.5$ 플랜이나 1GB 메모리를 가진 5$ 플랜을 선택하는 경우 잘못하면 메모리 부족에 허덕일 수 있기에 가장 적은 메모리를 사용하는 사양을 선택해야 합니다.
그런 관점에서 최소 메모리 요구 조건은 64비트보다는 32비트 운영체제가 더 낫고, InnoDB가 적용된 MariaDB보다는 MyISAM를 적용한 일반 MySQL이 차라리 낫습니다.

그러나 이미 64비트에 MariaDB를 적용해 사용하고 있는데 다시 설치하고 최적화시키는 것은 무지 귀찮은 일이죠. 선수가 아니라면 또 엄청난 시간을 들여서 구글링을 해야겠지요.

서두가 조금 길었는데요. 이렇게 엔트리 사양에서 메모리 부족이 발생하는 경우가 많은데 이를 해결하는 방법으로 디스크를 이용 스왑 메모리를 만드는 방법에 대해 간략히 살펴 봅니다.

1. 시스템 저장 공간 사용 현황 파악

다행히 요즘은 SSD로만 운영되는 상품이 많기 때문에 SSD 디스크에 스왑 메모리를 만들면 어느 정도 성능이 나오기 때문에 시도할 만합니다.

그러면 어떻게 이 스왑 메모리를 만들어 이용할 수 있을까요?
우선 시스템에 스왑 메모리를 적용할 여유가 있는지 확인합니다.

이때 시스템 내 디스크 및 메모리 사용 현황을 파악하기 위해서 df -h라는 명령을 사용합니다. 이 명령을 내리면 시스템에 구성된 각종 디스크와 RAM 메모리 사용 현황을 보여 줍니다.

# df -h

Filesystem      Size  Used Avail Use% Mounted on
udev            469M     0  469M   0% /dev
tmpfs            99M   11M   89M  11% /run
==/dev/vda1        25G   16G  7.8G  67% /==
tmpfs           495M     0  495M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           495M     0  495M   0% /sys/fs/cgroup
tmpfs            99M     0   99M   0% /run/user/0


이에 따르면 SSD 디스크 공간 25GB중에서 16GB가 남아있다는 것을 알 수 있습니다.

2. 스왑 메모리 파일 만들기

16GB 용량이 남아 있다는 것을 확인했으면 어느 정도 크기의 스왑 파일을 만들 것인지를 결정해야 합니다.

저의 경우 1GB 메모리가 있는데 조금 넉넉한 스왑 메모리를 확보하고 싶어서 4GB를 선택했습니다. 어짜피 놀고있는 SSD 공간이므로..

아래와 같은 명령을 사용해 스왑 파일을 만듭니다. 스왑 메모리 파일을 만들고, 권한을 부여하고 포맷하는 일련의 과정을 바로 이어서 진행 합니다.

fallocate -l 4G /swapfile  # 4GB 스왑 메모리 파일을 만든다.
chmod 600 /swapfile     # 스왑 메모리 파일에 쓰기 권한을 부여한다.
mkswap /swapfile        # 스왑 메모리 파일을 포맷한다.
swapon /swapfile        # 스왑 메모리 파일을 활성화 한다.



위와 같은 작업을 통해서 4GB의 스왑 메모리 파일이 생성되었습니다.
그러면 정말로 스왑 메모리가 만들어졌는지 확인을 해봅니다. 이때 사용하는 명령은 free -m 또는 swapon -s 명령입니다.
free -m 명령은 일반 메모리와 스왑 메모리 상태를 보여줍니다. 스왑 메모리가 없다면 0으로 표기됩니다. 아래에서는 생성된 스왑파일 4095가 보이네요.

@happist:~# free -m
              total        used        free      shared  buff/cache   available
Mem:            988         540          85         117         362         187
Swap:          4095         108        3987



swapon -s 명령을 사용하면 아래와 같은 결과를 보여 줍니다.

@happist:~# swapon -s
Filename                Type        Size    Used    Priority
/swapfile                                  file        4194300    108288    -1


3. 영구 스왑 메모리 파일로 만들기

위와 같이 만들어진 스왐 메모리는 다시 부팅하면 없어져 버립니다. 따라서 시스템이 존재하는 한 계속 사용할 수 있도록 만드는 작업이 필요합니다.
이는 /etc/fstab의 파일에 아래 내용을 추가하는 것입니다.

nano /etc/fstab   # fstab 파일을 편집



fstab 파일 맨 아래 부분에 아래 내용을 추가

/swapfile   none    swap    sw    0   0


4. 스왑 메모리 죽이기

메모리를 충분히 증설했거나 스왑 파일을 활용함에도 별로 성능에 도움이 되지 않은다면 과감히 지워버릴 필요가 있겠죠.
스왑 메모리 파일을 지우는 것은 아래 rm 명령을 사용합니다.

rm /swapfile

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

[워드프레스 최적화] 스왑 메모리 설정으로 워드프레스를 안정적으로 운영 하기 5

[워드프레스 최적화] 워드프레스 성능 개선을 위한 데이타베이스(MariaDB) 최적화 방법

오늘은 워드프레스 운영을 위해 Vultr 가상서버호스팅(VPS)에 서버 설치 후 최적화하는 방안에 대해서 살펴보고 있습니다.
서버 최적화는 웹서버 최적화, DB 최적화 그리고 PHP 최적화등으로 나누어질 수 있는데요. 오늘은 이 중 DB 최적화에 대해 살펴 보겠습니다.

여기 워드프레스를 설치한 서버에는 MariaDB가 기본으로 설치되어 있으므로 MariaDB 최적화 방안 중심으로 살펴 보겠습니다.
사실 그동안 DB 부분은 접근할 엄두가 나지 않았고, 최적화가 크게 필요 없다는 생각을 했는데, 자료를 보다보니 여기에서의 최적화가 절대적으로 필요하다고 하고, 여기까지 최적화하지 않으면 두고 두고 후회할 것 같아 없는 시간을 내서 시도해 보았습니다.

1. my.cnf 위치

MariaDB를 설치했기 때문에 InnoDB 최적화에 대한 내용이니 참고하시는게 좋겠습니다.

다 아시는 것처럼 MariaDB를최적화하기 위해서는 my.cnf에서 설정을 변경해 주는데요.
이 파일은 /etc/my.cnf 또는 /etc/mysql/my.cnf에 위치하고 있습니다.

2. 최적 메모리에 대한 생각

MariaDB 최적화를 위해서 자료를 조사하다보니 메모이이야기 많이 나옵니다. 메모리는 많으면 많을수록 좋다는게 일반적인 상식이고, 이 DB와 관련해서도 마찬가지입니다.

DB가 작업하는 공간이 속도가 빠른 메모리에서 모두 진행하는게 속도를 올릴 수 있는 지름길이기 때문이죠.

그러면 도대체 어느 정도 메모리를 가지고 있어야 할까요?

일반적으로 메모리의 크기는 최소 데이타베이스 크기 정도는 확보해야 한다고 합니다. 데이타베이스 크기와 RAM의 크기가 비숫하면 별다른 세팅을 하지 않고도 어느 정도 성능을 낼 수 있다고 합니다. 만약 6GB의 데이타베이스가 있다면 메모리도 최소 6GB가 있어야 하고 이보다도 20%~30%정도 더 메모리가 있다면 최상이라는 것이죠.

그러나 일반적으로 비용의 문제이기 때문에 충분한 메모리를 가지지 못하는 경우가 생기죠. 이렇게 서버에 충분한 메모리가 없는 경우 제대로 된 MySQL/MarianDB가 작동하지 않을 수 있습니다. 그렇기에 최적화가 필요합니다.

3. MariaDB 필수 최적화 항목들

my.cnf에는 많은 설정 변수들이 있는데요. 이러한 설정들을 최적화해서 적은 메모리로 가능하는한 최고의 성능을 낼 수 있는 옵션이 무엇이 있는지 살펴 보겠습니다.

이는 가능하면 디스크 대신 빠른 메모리 영역에서 작업을 처리할 수 있도록 설정을 유도함으로써 CPU 성능과 조화를 이루어 전체 성능을 높일 수 있습니다.

3.1. innodb_buffer_pool_size

이 설정은 데이카베이스가 얼마만큼의 메모리를 가져다 쓸 것이냐를 지정하는 것으로 가장 중요한 설정 중의 하나입니다.

설치 시 기본으로 세팅되어 있는 값은 128k인데요. 많은 문헌에서 시스템 메모리의 65%~75% 권장하고 있습니다.

  • 일반적으로 5~6GB (8GB RAM)
  • 20~25GB (32GB RAM)
  • 100~120GB(128GB RAM)

Vultr에서 사용하는 5$ 플랜은 기껏 1GB 시스템 메모리를 가지고 있으므로 750MB를 할당하였습니다.

innodb_buffer_pool_size= 750M

3.2. innodb_log_file_size

innodb_log_file_size는 데이타베이스 충돌 발생 시 다시 실행하거나 이전으로 되돌릴 때 사용하는 메모리이빈다.

이 사이즈는 기본으로 48M이 할당되어 있는데요. 일반적으로 앞서 설정한 innodb_buffer_pool_size의 25% ~ 50% 정도 할당하는 게 좋다고 합니다. 다만 너무 클 필요는 없다는 지적이 있네요.

innodb_buffer_pool_size= 185MB

3.3. innodb_flush_log_at_trx_commit

이는 데이타베이스가 작동을 어떤 방식으로 기록하느냐를 설정하는 것이죠.

설정값은 1, 2, 0의 세가지가 있는데 기본은 1로 설정되어 있습니다.

1로 설정되면 트랜잭션을 수행할때마다 버퍼가 로그 파일에 기록되고 로그 파일은 다시 디스크로 플러시 됩니다.

2로 설정되면 데이타베이스가 각 트랜잭션을 완료 시 로그 파일에 기록되고 로그 파일은 1초마다 디스크로 플러시 됩니다.

0으로 설정되면 각 트랜젝션 시 아무런 기록을 하지 않고 로그 버퍼는 로그 파일에 기록되어 1초마다 디스크로 플러시 됩니다.

가장 성능이 좋은 것은 0을 선택하는 것이고, 1을 선택하면 가장 높은 신뢰성을 보여 준다고 합니다.

정전 등에 대비가 잘 되어 있다면 성능을 중요시해 0을 선택할 수도 있는데요. 저는 성능 지상주의이므로 0을 선택했습니다.

3.4. query_cache_size

query_cache_size는 SQL 실행 결과를 미리 특정 공간에 저장해 놓고, 다음 번 같은 문장으로 호출 시 빠르게 해당 결과를 보여주는 것인데요.

query_cache_size가 너무 크다면 갑자기 엄청난 쓰기 작업이 발생하면 서버는 바로 쿼리 작업을 하는 대신 cache를 찾아 작동하는데 집중해 오히려 속도가 느려집니다.
query_cache 때문에 발생하는 병목 현상은 자주 나타나는 현상으로 아주 악명이 높다고 알려졌는데요. query_cache_size는 너무 크지 않게 설정하는 게 좋으며 최고 512M이면 충분하다는 의견입니다.

또 어떤 가이드는 차라리 query_cache_size를 0으로 놓는 것을 고려하라고 충고하고 있습니다.

3.5. Disable MySQL DNS Lookups

DNS lookups 호스트 네임과 IP를 매번 확인후 작동하므로 느려질 수 있다고 합니다. 따라서 skip-name-resolve 명령어를 추가해서 이를 방지합니다.

skip-name-resolve

3.6. innodb_io_capacity

SSD와 같은 성능 좋은 Disk를 사용하고 있다면 이를 크게 올려주는 게 성능에 좋다고 합니다.
Vultr는 모두 SSD로 운영되므로 nnodb_io_capacity를 105000 이상으로 설정했습니다.

innodb_io_capacity = 15000

3.7. tmpdir

데이타베이스 서버에서 작동하는 많은 수의 쿼리를 디스크에서 메모리로 MySQL 임시 디렉통리를 변경하면 획기적으로 속도를 개선 가능합니다.

로드가 느린 쿼리가 포함된 일반적으로 최적화되지 않은 워드프레스 데이타베이스인 경우 이 설정은 큰 성능 개선이 가능하다고 하는데요.
이를 위해서 는 tmpdir을 램디스크인 tmpfs 디렉토리로 설정하면 성능을 개선할 수 있습니다.

램디스크인 tmpfs 위치가 어디인지를 확인하려면 df -h 명령어를 사용합니다.
일반적으로 linux의 fstab 파일에는 tmpfs가 /dev/shm가 기본으로 지정되어 있습니다.

# df -h

Filesystem      Size  Used Avail Use% Mounted on
udev            469M     0  469M   0% /dev
tmpfs            99M   11M   89M  11% /run
/dev/vda1        25G   16G  7.8G  67% /
tmpfs           495M     0  495M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           495M     0  495M   0% /sys/fs/cgroup
tmpfs            99M     0   99M   0% /run/user/0

[워드프레스 최적화] 워드프레스 성능 개선을 위한 데이타베이스(MariaDB) 최적화 방법 6

우리는 TMPDIR을 램디스크에 위치시키도록 만들고자 합니다. 이를 위해서는 기존에 만들어진 램디스크인 tmpfs 디렉토리를 활용하는 방법과 새롭게 램디스크를 만드는 방법이 있습니다.

아래 글을 참조해 보시죠.

[워드프레스 최적화] 데이타베이스를 램디스크에서 작동시켜 속도 개선 방법

여기에선 새롭게 램디스크를 만드는 방법에 대해서 간략 살펴보겠습니다.

먼저 /dev/shm 아래에 /dev/shm/mysql 디렉토리를 만듭니다.

mkdir -p /dev/shm/mysql

이 디렉토리의 owner와 group을 mysql로 변경

chown mysql:mysql /dev/shm/mysql

my.cnf에서 tmpdir을 지정

tmpdir=/dev/shm/mysql

MySql id 찾기

이 램디스크가 리부팅해도 계속 존재하려면 fstab에 등록을 해야하죠. 그러기 위해서 먼저 MySql id를 찾습니다.

아래 명령를 사용하면 uid 및 gid 값을 알 수 있습니다.

id mysql
uid=114(mysql) gid=116(mysql) groups=116(mysql)

fstab 파일 편집

편집기를 통해서 fstab 파일을 편집 상태로 만들어 램디스크를 등록합니다.
여기에서 여기서는 위에서 검색했던 uid와 gid 정보를 활용합니다.
nano /etc/fstab
tmpfs /dev/shm/mysql tmpfs rw,gid=116,uid=114,size=768M,nr_inodes=50k,mode=0700 0 0

램디스크 마운트

이렇게 만들어진 램디스크를 마운트 합니다.
그 전에 nginx를 재부팅합니다.

service nginx restart
mount -a

4. 시스템 적용하기

위와 같이 데이타베이스 최적화 옵션을 반영했다면 마지막으로 MySQL 등을 다시 시작합니다. 그러면 위 설정들이 반영되게 됩니다.

service mysql restart
service php7.2-fpm restart
service nginx restart

그러면 제대로 반영되고 있는지 확인해 볼까요?

먼저 MariaDB로 접속합니다. 패스워드를 치고 들어갑니다.

@happist:~# mysql -u root -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g. 이하 생략
~

다음으로는  SHOW VARIABLES LIKE 'tmpdir'; 명령으로 tempdir을 출역토록 합니다.

~~~javascript
MariaDB [(none)]> SHOW VARIABLES LIKE 'tmpdir';
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| tmpdir        | /dev/shm/mysql |
+---------------+----------------+
1 row in set (0.02 sec)

음 , 정상적으로 tmpdir은 설정한대로 /dev/shm/mysql에 위치하고 있음을 알 수 있습니다.

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

[워드프레스 최적화] 워드프레스 성능 개선을 위한 데이타베이스(MariaDB) 최적화 방법 7

5. 관련 포스팅

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

Vultr 가상서버호스팅(VPS) 서버 성능은 어느 정도일까? 기대 이상의 성능을 보여주다.