저사양 서버 성능 최적화 하기 (#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 메모리 스펙에서의 설정입니다. 상황에 맞게 조절하시면 좀더 좋은 퍼포먼스를 얻으실 수 있습니다.

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

 

2. LoadModule

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

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

 

3. 아파치 로그

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

 

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

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

 

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

(#2 MySQL/PHP)

[Linux] 서버 유지관리 팁 정리

업무를 보면서 중간 중간 습득한 리눅스 시스템 점검 팁입니다.
이미 알고 있는 명령어도 있기도 하지만 좀 더 효율적으로 모니터링 할 수 있는 옵션이 많으니 참고할만 합니다.
별도의 자세한 설명은 생략하겠습니다. -0-

 

iptables

– backup : # iptables-save > 20130626_iptables_backup

– restore : # iptables-restore > 20130626_iptables_backup

– # iptables -nL : 현재 설정된 방화벽 정보 표시

– # iptables -I INPUT -s 111.111.111.111 -p tcp –dport 22 -j ACCEPT

 > 설명 111.111.111.111 IP에서 22번 tcp 포트를 ACEEPT 설정

 

부하체크

– top : 프로세스 사용량 순위, 일반적으로 많이 쓰지만 사용 자체에 부하가 생김

– ps : 프로세스 리스트 출력

 > 실행 : # ps auxww

– pstree : 프로세스 트리 형식 출력

 > 실행 : # pstree -a

 

보안도구

– lsof : 실행되고 있는 프로세스 추적, 프로세스에 물려있는 파일을 보여줌

 > 실행 : # lsof -c httpd

 > 설치 : # yum install lsof

 

– dstat : 시스템 사용량 출력, 중지할 때까지 보여줌

 > 실행 : # dstat -c -d -n -p -s -m

 > 옵션 : -c(cpu), -d(disk), -n(network), -p(process), -s(swap), -m(memory)

 > 설명 : dstat 명령만 치면 메모리 정보가 나오지 않기 때문에 위 옵션으로 실행

 > 설치 : # yum install dstat

 

– vmstat : 시스템 사용량 출력, 출력 시간 간격과 최대 출력 수를 설정 가능

 > 실행 : # vmstat 1 10

 > 설명 : vmstat 정보를 1초 간격으로 10개 출력

 

– w : 부하량 및 접속자, 시스템 구동시간 출력

 

– fuser : 파일, 폴더를 사용하고 있는 프로세스 출력

 > 실행 : # fuser -u /var/log/messages

 

– /proc/cpuinfo : CPU 정보 출력

 > 실행 : # cat /proc/cpuinfo

 

– free : 메모리 사용량 표시

 

– 캐시메모리 회수

# echo 1 > /proc/sys/vm/drop_caches

# echo 2 > /proc/sys/vm/drop_caches

# echo 3 > /proc/sys/vm/drop_caches

MySQL

– # mysqladmin processlist : 실행중인 쿼리 출력

– # mysqladmin kill $PID : PID 강제 종료

– # mysql -e “optimize table $TABLE” : table 최적화

– # mysql -e “SHOW FULL PROCESSLIST” : 실행중인 쿼리문의 전체줄 표시

– # mysqlcheck -p –all-databases –auto-repair : 테이블 체크, 복구

– # mysql_safe –skip-grant-tables : root 암호 분실시 권한 없이 mysql 접속

 

Apache

– # httpd -S : 아파치 설정 확인

– # ab -n 1000 -c 200 ‘http://sample.com’ : 웹사이트 성능 테스트, -n 접속시도 횟수, -c 동접자

– # wget : web response 다운로더

– # lynx –dump ‘http://sample.com’ : text web browser

 

Network

– # ngrep -tW byline pot 3306 and dst 127.0.0.1 -i eth0 : 네트워크 패킷 grep

 > 설명 : eth0 번 랜카드의 127.0.0.1:3306 포트로 들어오는 패킷

– # tcpdump : 네트워크 패킷 캡쳐