2014년 12월 6일 토요일

iOS 9가 ‘빌려서라도’ 도입해야 할 안드로이드 롤리팝 기능 10가지

애플과 구글은 끝도 없는 따라잡기 게임을 벌이는 중이다. 새 버전의 iOS나 안드로이드가 발표될 때마다 각각 스스로의 경험을 향상시키는 방법을 찾아내기 위해 상대방의 아이디어를 배우고 훔쳐오면서 서로의 기능을 계속 빌려서 적용시켰다. 안드로이드 L의 매터리얼 디자인(Material Design)은 iOS의 평면화된 디자인 언어와 끔찍할 정도로 흡사하고, iOS 8에 새로 도입된 개방성은 분명 롤리팝의 전작에서 따온 게 분명하다.

하지만 iOS의 광팬이나 안드로이드 팬들 모두 불평하지 말아야 한다. 사실 남의 떡이 더 커 보이기 마련이기 때문이다. 롤리팝에 우리가 어느 정도 익숙해진 현재 시점에서 애플이 iOS9에 추가시키면 좋을 몇몇 기능들을 벌써 찾을 수 있었다.

더 똑똑한 알림 기능




롤리팝은 알림을 사용자에게 전달하는 방식에 있어서 애플로부터 상당히 많은 부분을 따왔지만, 구글은 여전히 나름대로의 변화를 더했다. 가장 마음에 드는 기능은 전화기 앱의 새로운 헤드업 배너로 리플레이(Replay) 게임을 중단하지 않고도 걸려오는 전화를 무시할 수 있게 해준다. 또한 잠금 화면에서의 알림도 마음에 든다. 신규 알림들은 중요도에 따라 분류되어 연락처의 누군가가 보낸 이메일 메시지는 자연적으로 캔디 크러시 게임 알림보다 더 중요한 순위로 올라간다.

우선 알림 모드

겉으로 볼 때 롤리팝의 우선 알림 모드(Priority Mode)는 iOS의 방해 금지(Do Not Disturb) 기능과 너무나도 비슷했지만, 개인적으로 구글의 버전이 약간 부러운 것이 사실이다. iOS 상에서 방해 금지 기능은 완전히 켜지거나 꺼지거나 둘 중 하나인데, 안드로이드에서는 개별적인 조정이 가능하다.




통화뿐 아니라 구글은 우선 알림 모드에서도 일정이나 리마인더가 표시될 수 있도록 허용했지만, 사실 시간 설정이 가장 마음에 든다. 만약 당신이 낮잠을 자거나 집중해서 일을 처리해야 할 때 별다른 계산 없이 단숨에 우선 알림 모드를 빠르게 켜두면 된다.

향상된 배터리



애플이 계속해서 물리법칙과 엔지니어링 기술이 허용하는 한 기기를 얇게 만들 경우, 배터리가 항상 아쉬울 것이다. iOS 8처럼 롤리팝에서도 어느 앱이 가장 많은 전력을 소모하고 있는지 확인할 수 있지만, 구글은 불필요한 배터리 잔량이 적을 때 프로세스를 없애고, CPU를 늦추고, 배후 작업을 제한하는 배터리 절약 기능을 내장했다. 그리고 기기에 전원을 연결할 경우 충전에 걸리는 소요 예상 시간을 알려주는데, 이런 기능을 아이폰에서도 보고 싶다.

게스트 모드



애플 팬들은 iOS 상에서 여러 계정을 사용하는 부분에 대해 거의 기대하지 않고 있지만, 사실 전화기를 다른 사람과 같이 써야 되는 경우도 생긴다. 그리고 구글은 그런 상황을 위한 현명한 방법을 개발해 냈다. 롤리팝을 구동하는 스마트폰이나 태블릿을 게스트 사용자로 전환하면 사용자의 개인 정보가 보호될 뿐 아니라 게스트가 그 기기에서 한 모든 작업이 로그아웃을 통해 모두 삭제된다. 마치 전체 전화기를 위한 프라이빗 브라우징 같이 작동하는데, iOS 9에도 이런 것이 필요하다.

멀티-멀티태스킹

iOS와 안드로이드에는 빠르게 앱을 전환할 수 있는 밀어낼 수 있는 카드 시스템을 가진 아주 유사한 멀티태스킹 모드가 있다. 하지만 롤리팝의 멀티태스킹이 조금 더 낫다.




사용자가 전체보기로 들어가면 최근 사용한 앱의 메뉴 그 이상을 볼 수 있다. 실행중인 모든 작업과 탭이 표시되기 때문에, 예를 들어 이메일 초안을 작성중인 경우에도 작성 창과 수신함을 전환해 이동할 수 있다. 그리고 전화기 상에서 열려있는 모든 탭 역시 볼 수 있다.

인쇄 미리보기

iOS의 인쇄 화면은 특별히 언급할만한 내용도 없을 만큼 아주 기본적인 옵션만 갖췄다. 그와 대비해 롤리팝에서는 마치 PC 앞에 앉아있는 것처럼 데스크톱에 가까운 미리보기 화면을 제공해 사진이나 문서가 인쇄했을 때 어떤 모습으로 나올지를 정확히 볼 수 있다.




그리고 무선 프린터가 없을 경우 롤리팝 사용자들은 PDF로 저장하기 옵션을 사용할 수 있는데, 이 기능은 iOS 4 시절부터 아이폰에 도입되길 희망했던 기능이다.

두드려서 화면 켜기

홈 버튼을 눌러서 아이폰 화면을 켜는 것도 간편하지만 롤리팝에서는 지원 모델에 한해 안드로이드 전화기의 화면을 두 번 두드리기만 하면 화면이 켜지는 기능을 도입했다. 이런 기능은 분명 아침에 일어나자마자 아이폰 6 플러스에서 이메일을 확인할 때 홈 버튼을 찾아 누르지 않아도 돼서 조금 더 편리할 수 있을 것이다.

설정 내 검색



매번 새로운 iOS가 나올 때마다 애플이 설정 내 검색 방법을 추가하길 기대해왔지만, 아직까지 현실화되지 않았다. 이제 구글이 우측 상단 모서리에 아주 편리한 돋보기 기능을 추가함으로써 애플을 앞질렀다. 개인적으로 키보드를 변환할 때마다 설정 어디로 가야 하는지 기억을 더듬는 게 힘든데, iOS 사용자도 빠른 시일 내에 이 설정 내 검색을 활용할 수 있게 되길 바란다.

앰비언트 디스플레이

물론 iOS에는 예전부터 앰비언트 모드가 있었다. 매번 알림이 있을 때마다 디스플레이가 켜지는 이 안드로이드의 신기능은 아이폰과 아이패드 사용자들에게는 이미 한물간 것이다.




하지만 롤리팝에서는 이 기능이 옵션으로 들어있는데, 솔직히 아이폰에서도 한 번의 조작만으로 알림이 왔을 때도 잠금 화면을 켜지 않도록 할 수 있었으면 좋겠다.

스마트 잠금해제



터치ID는 아이폰과 아이패드의 잠금 해제를 훨씬 간편하게 만들었지만 여전히 지문 없이도 잠금 해제를 할 수 있었으면 하는 생각이 들 때도 있다. 구글은 편리함과 보안의 중간 타협점을 찾았는데 애플에서도 이를 도입하길 희망한다. 롤리팝 스마트폰과 태블릿은 페어링된 새로운 블루투스나 NFC 기기가 근처에 감지되면 자동적으로 잠금이 해제된다. 그리고 이런 기능을 충분히 활용한 제품들이 내년 초에 우후죽순 나올 것으로 기대된다.

출처: www.itworld.co.kr

2014년 11월 30일 일요일

[펌]OOM(Out Of memory) 대처 방법



OOM


Problem

Linux 시스템의 (swap을 포함한) 메모리가 모두 소진된 상태에서 중요한 프로세스(e.g. server app)가 OOM killer에게 죽는 현상이 발생할 수 있습니다. OOM killer가 무엇이고, 중요한 프로세스를 살아남게 하려면, 어떻게 해야할까요?

OOM killer is...

http://www.win.tue.nl/~aeb/linux/lk/lk-9.html#ss9.6

OOM(Out-Of-Memory) killer는

- a) 특정 (메모리가 부족한) 상황에서 동작해서,

- b) 특정 알고리즘에 의해 프로세스를 선택,

- 해당 프로세스를 kill 해서 메모리를 확보합니다.

OOM killer & Overcommit

위의 page에서는 OOM의 존재 자체가 일종의 버그라고 말합니다.

linux는 overcommit, 즉, 실제로 필요로 하는 메모리보다 더 많은 메모리를 (가상적으로) 할당하는 정책을 사용하기 때문에,

OOM killer가 필요한 상황이 발생하는 것입니다. 이러한 정책을 optimistic memory allocation이라고 부르구요. (반대로 pessimistic이 있겠죠)

Linux는 "프로세스는 자신이 요청한 메모리 양을 모두 쓰지 않는다"라는 낙관적인 가정을 하기 때문에 이렇게 부릅니다.

Linux는 최대한 할당은 늦게 하고, 한번 할당되면 계속 사용한다는 가정을 하고 VM 시스템을 만들었습니다.

brk() system call을 통해서 heap 크기를 늘리려고 시도할 때 (즉, virtual address space를 할당할 때)는 일단 허용하고,

실제로 memory frame이 할당되는 시점을 사용자 프로세스가 실제로 해당 메모리에 접근해서 fault가 일어날 때로 미루어서 이러한 정책을 구현합니다.

물론 OS는 사용자 프로세스들에 할당된 address space의 총합과 자신이 할당할 수 있는 memory frame의 전체 크기를 알기 때문에 overcommit을 방지할 수 있습니다.

Linux 2.6에서도 가능한 것 같습니다. /proc/sys/vm/overcommit_ratio를 조정해서, 둘 사이의 비율을 조정할 수 있습니다.

root@www src # uname -a

Linux www.lastmind.net 2.6.8-rc1 #1 Thu Jul 15 21:11:46 KST 2004 x86_64 4 GNU/Linux

root@www src # cat /proc/sys/vm/overcommit_ratio

50

이러한 정책은 어떻게 보면 매우 비합리적으로 보일 수도 있지만, 성능을 올리는데 효과가 있다고 합니다.

(예를 들어, 프로세스 fork시의 COW 정책도 일종의 overcommitting이라고 하는군요.)

OOM killer is ...bad guy?

http://www.kerneltraffic.org/kernel-traffic/topics/OOM_Killer.html

kerneltraffic쪽의 page들을 보면, OOM killer가 a)와 b) 단계에서 사용하는 algorithm들에 문제(버그?)가 많았던 모양입니다.

특히 b)의 경우에는 heuristic일 뿐이라서, 중요한 프로세스와 아닌 프로세스를 구분하지 못하기 때문에,

데스크탑 환경이 아닌 서버 환경에서는 매우 치명적일 수 있습니다. 그 외에도 deadlock 같은 버그 문제도 보이는군요.

그래서 그런지 2.4.23에서 OOM Killer는 빠졌습니다만,

http://www.kerneltraffic.org/kernel-traffic/kt20031214_245.html#6

http://kerneltrap.org/node/view/1010

http://kerneltrap.org/node/view/1017

http://kerneltrap.org/comment/reply/1754

다시 그 필요성 때문에, 2.4.24-pre1에서 OOM killer를 kernel compile option(CONFIG_OOM_KILLER)의 형태로 추가했다고 합니다.

문제들은 계속 수정되는 것 같습니다만, b) algorithm이 heuristic라서 발생하는 문제는 여전한 것 같습니다. ^^;

debian의 kernel-image-2.4.26-1-686-smp의 image는

CONFIG_BINFMT_MISC=m

# CONFIG_OOM_KILLER is not set

CONFIG_PM=y

와 같이 OOM killer가 기본적으로 꺼져있군요.

OOM killer algorithm

mm/oom_kill.c를 보면 OOM killer의 코드가 나옵니다.

* The routines in this file are used to kill a process when

* we"re seriously out of memory. This gets called from kswapd()

* in linux/mm/vmscan.c when we really run out of memory.

kswapd는 kernel thread로 동작하면서, page cache를 유지하고 slab cache를 shrink하고 swapping out을 수행합니다.

http://www.csn.ul.ie/~mel/projects/vm/guide/html/understand/node68.html

a) zone마다 일정 수(pages_high)만큼의 page를 확보하기 위해 try_to_free_pages_zone()을 호출하는데,

shrink_caches()를 호출해서 128K 정도의 메모리를 확보하려고 합니다.

http://www.csn.ul.ie/~mel/projects/vm/guide/html/code/node38.html#SECTION001030200000000000000

이를 수행하지 못할 경우, oom_kill.c의 out_of_memory()를 통해, oom_kill()이 수행됩니다.

이는 physical memory를 swap할 공간도, cache를 shrink할 공간도 없다는 의미입니다.

b)

oom_kill()은 모든 task에 대해 badness()를 계산해서 가장 나쁜(badness()의 결과가 가장 큰) task를 kill합니다.

badness()의 주석을 보면,

/**

* oom_badness - calculate a numeric value for how bad this task has been

* @p: task struct of which task we should calculate

*

* The formula used is relatively simple and documented inline in the

* function. The main rationale is that we want to select a good task

* to kill when we run out of memory.

*

* Good in this context means that:

* 1) we lose the minimum amount of work done

* 2) we recover a large amount of memory

* 3) we don"t kill anything innocent of eating tons of memory

* 4) we want to kill the minimum amount of processes (one)

* 5) we try to kill the process the user expects us to kill, this

* algorithm has been meticulously tuned to meet the priniciple

* of least surprise ... (be careful when you change it)

*/

주석을 좀 이상하게 적어놓은 것 같은데, 죽이기에 좋은(Good) task가 kill할 task가 됩니다.

이러한 알고리즘에 따르면,

기본적으로 적은 수의 프로세스를 죽여서 많은 양의 메모리를 확보할 수 있는 heuristic을 쓰는 것을 알 수 있습니다.

3번에서 메모리를 많이 사용하는 innocent는 죽이지 않는다고 했으나,

실제 코드를 보면, 여기서 innocent란, 단순하게 cpu를 많이 사용하는 프로세스를 의미하는 것 같습니다.

또한, super user process이거나 hardware를 access하는 경우 badness point를 1/4로 삭감해줍니다.

Solution

OOM killer가 heuristic에 기반하고 있기 때문에, 중요한 server process가 죽지않는 다는 보장을 하기가 힘듭니다.

(위의 badness() 값을 낮추는 방법들을 전부 쓰더라도)

하지만, OOM killer를 쓰지 않는다고 하더라도, 특정 프로세스가 종료할 때까지 기다리는 수 밖에 없고,

(malloc으로 할당 받은 메모리는 대체로 다시 반납하지 않습니다.)

page fault handler에서 page frame을 할당받지 못하면, init를 제외한 해당 task는 kill 되기 때문에,

OOM 상황에서는 어차피 치명적인 상황이 발생합니다.

따라서, OOM 상황이 발생하지 않도록 노력하는 것이 중요할 것 같네요.

server 어플리케이션의 경우에는 대체로 자신이 사용하고 있는 메모리 양을 알고 있으므로 이에 대한 제약을

어플리케이션 수준 또는 시스템 수준(ulimit)에서 가하는 것도 괜찮은 방법이라고 생각합니다.

그리고 메모리 바운드 어플리케이션이라면 대부분 swapping out 되는 것을 원하지 않을 것이므로,

page에 lock을 거는 방법을 생각해볼 수도 있겠네요. (physical page frame이 부족할 경우, 자동적으로 실패하겠죠)

2014년 11월 29일 토요일

yum을 이용하다가 "Error: database disk image is malformed'라는 에러 메시지를 만났을 경우

"Error: database disk image is malformed" 해결하기

centos에서 yum을 이용하다 아~주 가끔 이런 메시지를 만나는데 자주 보던 메시지가 아닌 탓에 굉장히 당황을 많이 하게 됩니다.
해당 메시지는 대충 해석하자면 yum의 데이터베이스가 꼬였다는 뜻입니다.
그렇기 때문에 데이터 베이스를 초기화 시켜줘야 합니다.


1. 에러 발생 시기

    - yum update 진행 중 Ctrl+z와 Ctrl+c로 yum update 종료 후 yum 실행 안됨
    - 이후 yum 실행하면 Error: database disk image is malformed 메시지 출력

 
[그림 1] yum update 과정 중 db 갱신에서 종료


 [그림 2] 이후 yum 안됨

2. yum clean all로 장애 해결

    - 장애 해결은 의외로 간단하게 됩니다.
    - yum clean all을 이용해주세요.
    - 밑의 화면처럼 cleaning up everything이 나오면 성공!


[그림 3] yum clean all 입력 후

3. 다시 하려면 작업 계속


 [그림 4] 다시 yum을 실행한 모습


2014년 11월 27일 목요일

nginx에서 동영상 스트리밍 서비스하기

nginx에서 동영상 스트리밍이 되게 하는 방법

nginx에서는 모듈을 추가하면 웹 상에서 동영상을 바로 볼 수가 있습니다.


  1. nginx 동영상 스트리밍 모듈 설치하기
    #/usr/local/nginx/sbin/nginx -V  // nginx의 설치 경로의 sbin 디렉토리에 가면 nginx 파일이 있습니다. -V는 설치 시 옵션 보기

    1.1 확인 후 마지막 부분의 --with-http_mp4_module이 없는 분들을 위해
    #cd /usr/local/src/(nginx 압축 해제 경로)

    #./configure (기존의 설치 옵션 붙여넣기 후 맨 뒤에 mp4 모듈 옵션 추가) --with-http_mp4_module

    #make && make install
  2. nginx 설정 파일에 해당 스크립트 추가
    location /video/ {
    mp4;
    mp4_buffer_size 1m;
    mp4_max_buffer_size 5m;
    mp4_limit_rate on;
    mp4_limit_rate_after 30s;
    }
  3. nginx 재시작
  4. 웹사이트로 들어가서 스트리밍 확인


리눅스 find 명령어

find 명령에 대해서 알아보기

  1. find를 쓰는 이유
    - 다양한 옵션을 이용해서 원하는 파일을 자세하게 찾을 수 있습니다.
  2. 사용 방법
    #find [찾고자 하는 디렉토리] [옵션]
  3. 옵션
    -name [파일이름]   :  파일이름과 일치 파일명 또는 확장자를 기준으로 검색
    -perm [권한]  :  권한과 일치하는 파일
    -user [유저]  :  유저 검색(해당 파일을 사용하는 유저)
    -group [그룹] :  그룹과 일치하는 파일
    -empty : 비어있는 파일이나 디렉토리를 검색
    -size [+파일크기/-파일크기/파일크기][bckw중 택1] : 파일크기와 일치하는 파일
      b : 블록단위 512kb
      c : byte
      k : kbyte
      w : 2byte 워드
    아무런 단위를 붙이지 않은 경우 : 디폴트 값 b
    -type [파일타입] : 파일의 타입을 지정하여 검색한다.
      b : 블록 특수 파일(block device)
      c : 캐릭터 특수 파일 (character deice)
      d : 디렉토리(directory)
      f : 일반파일(file)
      l : 심볼릭 링크(link)
      p : 파이프 (pipe)
      s : 소켓 (socket)
    -print : 찾은 파일들을 표준출력(stdout)으로 출력(기본값)
    -nouser : 소유자가 없는 파일을 검색(/etc/passwd 파일에 없는 사용자의 소유자로 되어 있는 파일을 검색)
    -nogroup : /etc/groups파일에 없는 그룹의 소유인 파일을 검색
    -fprint [임의파일명] : 검색된 파일을 `임의파일명'으로 출력(`임의파일명'이 존재 하지 않을 경우에는 새로 생성되고, 존재할 경우에는 기존의 파일은 없어짐)
    -exec command {} \; : 파일이 검색되었을 경우, 검색된 파일들에 대해 특정 명령을 수행 할 때 사용
     {} : 검색된 파일들을 의미, 여러개의 파일이 검색되면 하나씩 치환되면서 해당명령이 실행
      ; : 검색된 결과가 여러개인 경우 하나의 행에 여러 명령을 사용하기 위함이다.
      \ : ;이 특수 문자이기 때문에 문자로 ;라는 것을 알려 주기 위함이다.
    -newer file1 file2: `file1' 보다 이후에 `file2' 보다는 이전에 생성되거나 변형된 파일들을 찾을 경우에 사용
    -cnewer 파일명 : '파일명' 부분에 적어준 파일보다 더 최근에 수정된 파일들을 검색
    -atime +n/-n/n : 최근 n일 이전에 액세스된 파일을 검색(accessed time)
       +n : n일 또는 n일 이전에 액세스된 파일
       -n : 오늘 부터 n일 전 사이에 액세스 된 파일
        n : 정확히 n일 전에 액세스된 파일
    -ctime +n/-n/n : ctime은 파일의 퍼미션을 마지막으로 변경시킨 날짜를 의미한다. (changed time)
       +n : n일 또는 n일 이전에 퍼미션이 변경된 파일
       -n : 오늘 부터 n일 전 사이에 퍼미션이 변경된 파일
        n :  정확히 n일 전에 퍼미션이 변경된 파일
    -mtime +n/-n/n : mtime은 파일내의 data를 마지막으로 변경한 날짜를 의미한다.(modified time)
        +n : n일 또는 n일 이전에 수정된 파일
        -n : 오늘 부터 n일 전 사이에 수정된 파일
          n : 정확히 n일 전에 수정된 파일
    -maxdepth n : 0이 아닌 정수값으로 경로 깊이를 지정하여 검색을 할 경우에 사용
    예) '-maxdepth 1'은 시작위치로 지정한 디렉토리만 검색하고 하위 디렉토리는 찾지 않음
    -mindepth n : 0이 아닌 정수값으로 지정된 숫자만큼의 깊이에서부터 그 하위 디렉토리를 검색 (GNU find 버전)
    -follow : 심볼릭 링크된 디렉토리도 검색을 할 경우에 사용
    -regex : 정규표현식(regular expression)을 이용하여 파일들을 찾을 경우에 사용

2014년 11월 22일 토요일

mysql을 이용하다가 error 1045를 만났을 때

에러메시지( ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) ) 해결하기


1. 먼저 mysql daemon을 종료시켜줍니다.


#/etc/init.d/mysql stop


2. 다음 재시작 할 때 --skip-grant-tables option 옵션을 뒤에 붙여서 시작합니다.


#/usr/sbin/mysqld --skip-grant-tables --skip-networking & (mysqld의 경로가 다르다면 맞춰주세요.)

3. mysql에 접속합니다.


mysql -u root

4. 비밀번호를 교체 준비를 합니다.


mysql>FLUSH PRIVILEGES;

5. 새로운 비밀번호를 입력합니다.


SET PASSWORD FOR root@'localhost' = PASSWORD('새로운비밀번호');

6. root 계정 정보 업데이트하기


mysql>UPDATE mysql.user SET Password=PASSWORD('newpwd') WHERE User='root';

7. 성공 메시지가 나오면 다시 FLUSH PRIVILEGES;


mysql> FLUSH PRIVILEGES;

8. mysql 재시작


#/etc/init.d/mysql restart

9. 바뀐 비밀번호로 다시 로그인


#mysql -u root -p
이제 다시 잘 사용하시면 됩니다.

2014년 11월 11일 화요일

[CDN 구축하기 시리즈 2편] DS에 nginx+awstats 설치하기

자! 앞에서 lsync 동기화까지 성공을 했다면 이제는 nginx와 awstats, snmp를 설치하겠습니다.

nginx는 아파치와 같은 웹서버로 아파치에 비교해서 조금 더 가볍다는 장점이 있어 점점 많이 쓰고 있는 추세라고 합니다.
awstats는 웹페이지 로그 관리 프로그램이라고 할 수 있는데 해당 웹 페이지를 GUI 환경에서 확인할 수 있는 장점이 있습니다.

1. Nginx 설치하기

nginx는 최신 버전인 1.7.7로 설치할게요.

nginx를 설치하기에 앞서 라이브러리 2개를 설치해줘야합니다.
간단하게 #yum install pcre* zlib* 이렇게 해결해줍시다.

바로 시작하겠습니다.

#cd /usr/local/src
#wget http://nginx.org/download/nginx-1.7.7.tar.gz
#tar zxvf nginx-1.7.7.tar.gz
#mkdir /usr/local/nginx
#cd nginx-1.7.7
#./configure --prefix=/usr/local/nginx  //prefix를 이용하면 해당 위치에 컴파일 되므로 관리가 조금 더 용이해집니다.
#make && make install


나중에 awstats 적용을 위해서 nginx.conf를 조금 수정하겠습니다.

#vi /usr/local/nginx/conf/nginx.conf
굵은 부분은 추가되거나 수정된 부분이므로 굵은 표시만 신경써서 바꿔주시면 됩니다.

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;
        access_log  /home/cdn/logs/cdn.access.log;
        #access_log  logs/host.access.log  main;

        location / {
            root   /home/awstats;
            index  awstats.192.168.137.111.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;

        }

#mkdir /home/cdn/logs // 위에 적어둔 로그가 생성될 디렉토리

다 해줬으면 /etc/init.d/nginx 파일을 만들어 주세요.

#vi /etc/init.d/nginx

밑의 내용을 입력합니다.

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# pidfile:     /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
lockfile=/var/lock/subsys/nginx
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
restart() {
    configtest || return $?
    stop
    start
}
reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
force_reload() {
    restart
}
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
    status $prog
}
rh_status_q() {
    rh_status >/dev/null 2>&1
}
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

다음은 권한을 변경해주세요.
#chmod +x /etc/init.d/nginx

다음은 방화벽에 80 포트를 추가합니다.

마지막으로 nginx 시작

#/etc/init.d/nginx start

웹 브라우저로 접속 테스트를 해보고 접속이 되면 nginx는 설치 끝.

이런 방식으로 DS서버 8대에 설치합니다.