freezner

저사양 서버 성능 최적화 하기 (#1 Apache)

이 블로그는 워드프레스로 제작되었습니다. 워드프레스는 많은 기능을 가지고 있지만 속도가 느리다는 단점을 가지고 있지요. 게다가 기반이 되고 있는 언어도 PHP이기 때문에.. PHP 역시 빠른 언어는 아닙니다. 설상가상으로 아주 저렴한 VPS 서버위에서 돌고 있습니다.

여기서 아주 저렴한 VPS (가상화서버)라 함은.. cpu는 1개의 단일 코어, 512메가의 메모리, 30기가의 HDD 입니다. 웹서버는 메모리 상에 많은 데이터가 올라와있는 상태로 유지가 되어야하기 때문에 메모리는 무엇보다 중요한 요소입니다. 그런데 512메가 입니다.

요즘 저렴한 개인 PC도 메모리는 최소 4기가 이상이죠. 흐흐.. 아무튼 돈이 없으니 저사양 스펙으로 돌리고 있습니다. 그 동안 운영을 해오면서 워드프레스의 캐싱 플로그인인 WP-Super Cache도 설치해보고 간단하게 아파치 설정도 변경해보곤 했습니다. 하지만 어느 정도 페이지뷰가 올라가니 이 마저도 무리가 가더군요.

서버를 전체적으로 스펙에 맞게 튜닝할때가 온것같았습니다. 그렇다면 어디를 손봐야 할까요. 우선 순위를 따지자면 아래와 같습니다

– 아파치 (httpd.conf)

– PHP (php.ini)

– MySQL (my.cnf)

– 서버 캐싱 모듈 (apc.ini)

내용이 좀 깁니다. 때문에 이 포스팅에서는 아파치(httpd.conf) 설정 방법을 소개해드리겠습니다.

 

1. MPM (Prefork or Worker)

앞서 말씀드렸다시피 1 cpu, 512 메모리 스펙에서의 설정입니다. 상황에 맞게 조절하시면 좀더 좋은 퍼포먼스를 얻으실 수 있습니다.

<IfModule prefork.c>
StartServers 		1
MinSpareServers 	1
MaxSpareServers 	3
MaxClients       	10
MaxRequestsPerChild  	3000
</IfModule>

<IfModule worker.c>
StartServers         1
ThreadLimit	     25
MaxClients           25
MinSpareThreads      5
MaxSpareThreads      15
ThreadsPerChild      5
MaxRequestsPerChild  200
</IfModule>

우선 아파치 구동방식을 설정합니다. 기본값은 위 설정보다 높으며 prefork 설정 부분만 존재할겁니다. prefork 방식과 worker 방식은 간단히 말해 하나의 프로세스에 단일 쓰레드를 생성하느냐 여러개의 쓰레드를 생성하느냐의 차이입니다. 물론 하나의 프로세스에 하나의 쓰레드를 생성하는 prefork가 동접자 수 대비 서버의 부담이 더 갑니다. 대신 안정적이죠. 때문에 리소스 부담이 덜한 worker 방식을 선택할 수 밖에 없습니다. 위처럼 둘다 정의를 하더라도 나중에 정의된 방식으로 실행되게 됩니다.

 

2. LoadModule

아파치를 패키지로 설치하셨다면 불필요한 모듈을 불러오게 되어있습니다. 사용하지 않는 모듈을 불러와 메모리에 불필요한 부담을 주게 됩니다. 귀찮더라도 사용하지 않는 모듈을 지워주거나 주석처리를 해주는 것이 바람직합니다.

# 기본 모듈
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule alias_module modules/mod_alias.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule include_module modules/mod_include.so
LoadModule headers_module modules/mod_headers.so
LoadModule speling_module modules/mod_speling.so

# 워드프레스 필수 모듈
LoadModule dir_module modules/mod_dir.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule rewrite_module modules/mod_rewrite.so

# 코드이그나이터 필수 모듈
LoadModule authn_default_module modules/mod_authn_default.so
#(중복) LoadModule authz_host_module modules/mod_authz_host.so
#(중복) LoadModule dir_module modules/mod_dir.so
#(중복) LoadModule mime_module modules/mod_mime.so
#(중복) LoadModule rewrite_module modules/mod_rewrite.so
#(중복) LoadModule setenvif_module modules/mod_setenvif.so

# nForge 필수 모듈
LoadModule env_module modules/mod_env.so
LoadModule authn_file_module modules/mod_authn_file.so

저는 워드프레스 + PHP 프레임워크인 CodeIgniter + nForge 가 함께 실행되고 있습니다. 이 들에게 종속적인 모듈을 정리해서 정의했습니다. 참고하시면 도움이 되실 겁니다.

 

3. 아파치 로그

아파치 로그는 패키지 설치 기준으로 /etc/httpd/logs 에 저장됩니다. 기본값은 warm(경고) 레벨부터 모두 저장됩니다. 시간이 지나면 이 로그 파일의 용량이 만만치 않게 됩니다. 주기적으로 관리해줘야하죠. 로그를 필요한 정보만 저장하도록 설정합니다.

# LogLevel warn 값을 error로 수정하여 에러 정보만 수집
LogLevel error

 

일단 아파치는 여기서 어느정도 마무리 되었습니다.

변경한 설정내용은 service httpd restart로 하실 수 있습니다. 재시작 실패시 /etc/httpd/logs/error_log를 확인해보시기 바랍니다.

 

저사양 VPS 서버 성능 최적화 하기

(#2 MySQL/PHP)

Exit mobile version