욱'S 노트

Nginx - Beginner’s Guide 본문

Programming/Nginx

Nginx - Beginner’s Guide

devsun 2016. 3. 24. 09:40

이번 가이드는 nginx에 대한 기본적인 소개와 단순한 작업들을 어떻게 수행하는지에 대해 담고 있다. 먼저 nginx는 독자의 머신에 이미 설치되어 있다고 가정한다.  만약 그렇지 않다면 설치 페이지를 참조하라. 이번 가이드는 nginx을 어떻게 시작하고 중지하는지 그리고 설정을 어떻게 리로드 하는지에 대해 설명한다. 그리고 설정 파일의 구조와 static 컨텐츠를 서비스하기 위해 설정하는 방법, nginx를 프록시 서버로 설정하는 방법등을 다룬다.


nginx는 하나의 마스터 프로세스와 몇몇의 워커 프로세스를 가진다. 마스터 프로세스의 주요 목적인 설정을 읽고 해석하는 것이다. 그리고 워커 프로세스를 유지한다. 워커 프로세스는 요청의 실제적인 처리를 수행한다. 워커 프로세스의 수는 설정 파일에 정의되며 고정값으로 지정할 수도 있고 CPU 코어수에 따라 자동적으로 지정할 수 있게 설정 할 수도 있다.


nginx와 모듈의 동작은 설정 파일에 의해 결정된다. 기본적으로 nginx.conf라는 이름의 파일이며  /usr/local/nginx/conf, /etc/nginx, 또는 /usr/local/etc/nginx 에 위치한다.


Starting, Stopping, and Reloading Configuration


nginx를 시작하기 위해 nginx라는 커맨드를 사용한다. nginx가 시작되면 -s 파라미터와 함께 전달된 시그널에 의해 컨트롤할 수 있다. 사용법은 다음과 같다.

nginx -s signal


시그널의 다음 중에 하나일 수 있다.

stop — fast shutdown

quit — graceful shutdown

reload — reloading the configuration file

reopen — reopening the log files


예를 들어 실행중인 워커 프로세스가 현재 요청을 처리하기를 기다리고  nginx 프로세스를 중지하고 싶다면 다음과 같은 커맨드를 실행하면 된다.

nginx -s quit


이 커맨드를 nginx를 시작한 유저와 동일한 유저로 실행해야된다.

설정 파일이 변경되었고 새로운 설정을 리로딩하여 적용하고 싶다면 다음과 같은 커맨드를 수행하면 된다.

nginx -s reload


일단 마스터 프로세스가 리로드 시그널을 받으면 새로운 설정 파일의 문법이 맞는지 확인하고 설정을 적용한다. 만약 성공했다면 마스터 프로세스는 새로운 워커프로세스를 시작하고 기존 워커 프로세스는 종료시킨다. 실패했다면 마스터 프로세스는 변경을 롤백하고 기존 설정으로 작업을 계속한다. 기존 워커 프로세스는 중지하라는 명령을 받고 새로운 연결을 중지하고 현재 요청을 계속한다. 그런 다음 기존 워커 프로세스는 종료된다.


kill가 같은 유닉스 툴의 시그널도 nginx 프로세스에 전달된다. 이번 경우는 주어진 프로세스 ID로 직접 시그널이 전달된 경우이다. nginx 마스터 프로세스는 프로세스 ID를 nginx.pid라는 파일에 작성한다. 이 파일은 /usr/local/nginx/logs  또는 /var/run 아래 디렉토리에 저장된다. 예를 들어 마스터 프로세스 ID가 1628 이라면 QUIT 시그널이 전송된 결과로 nginx는 그레이스풀 셧다운된다.

kill -s QUIT 1628


수행중인 모든 nginx 프로세스 리스트를 획득하기 위해서는 ps 유틸리티를 다음과 같은 방법으로 이용하면 된다.

ps -ax | grep nginx



Configuration File’s Structure


nginx는 모듈로 구성된다. 각 모듈은 설정 파일에 명시된 지시에 의해 컨트롤 된다. 지시들은 단순 지시와 블록 지시로 분할된다. 단순 지시는 이름과 파라미터가 빈칸으로 구분되고 것을 의미하며 ;으로 종료된다. 블럭 지시는 단순 지시와 같은 구조를 가지지만 ;으로 종료되는 대신에 {} 블레이스로 감싸진다. 블럭 지시자는 다른 지시자를 {} 내부에 가질 수 있는데 이것은 컨텍스트라고 불린다.


설정 파일에 위치한 지시자들은 메인 컨텍스트로 고려된다. 이벤트와 http 지시자는 메인 컨텍스트에 속하며, 서버는 http 컨텍스트에 location은 서버 컨텍스트에 속한다.


#은 라인 코멘트이다.


Serving Static Content


웹서버의 중요한 작업은 파일들을 서비스하는 것이다. 예제를 실행하기 위해 요청에 따라 다르게 서비스되는 두개의 로컬 디렉토리가 필요하다. /data/www 그리고 /data/images. 


먼저 /data/www/ 디렉토리를 만들고 내부에 index.html을 생성하자. 그리고 /data/imgaes 디렉토리를 만들고 이미지 파일을 내부에 위치시키자.


그런 다음 설정 파일을 오픈하자. 기본 설정 파일은 이미 server 블럭에 대한 몇몇의 예제가 포함되어 있을 것이다. 그러나 대부분이 코멘트 처리 되어 있을 것이다. 이제 새로운 서버 블럭을 작성해보자.

http {

    server {

    }

}


일반적으로 설정 파일은 포트로 구분된 여러개의 서버 블록을 포함할 수 있다. 일단 요청을 처리할 서버 프로세스를 결정하면 요청의 헤더에 명시된 URI를 테스트하고 서버 블록 내부에 명시된 location 지시자를 따른다.


서버 블록에 다음 로케이션 블럭을 추가자.

location / {

    root /data/www;

}


로케이션 블럭에 명시된 "/" 접두어는 요청의 URI를 비교한다. 요청을 매칭하기 위해 URI는 루트 지시자에 명시된 패스에 추가될 수 있다. 즉 /data/www는 로컬 파일 시스템에 요청된 파일의 패스 형식이다. 만약 nginx의 여러개의 매칭 로케이션 블럭이 존재한다면 가장 긴 것을 선택한다. 그것에 매칭이 실패하면 한단계 더 짧은 것을 선택해서 매칭을 반복적으로 수행한다.


다음 두번째 로케이션 블럭을 추가하자.

location /images/ {

    root /data;

}


이것은 /images로 시작되는 요청에 매치된다.


서버 블록 설정 결과로 서버 블록의 형태는 다음과 같다.

server {

    location / {

        root /data/www;

    }


    location /images/ {

        root /data;

    }

}



새로운 설정을 적용하기 위해서 nginx가 시작되지 않았다면 nginx 커맨드로 시작하고 설정을 리로드하기 위해 아래와 같은 커맨드를 수행하자.

nginx -s reload


이 경우 정상적으로 동작을 하지 않는다면 그 이유를 알아내기 위해 access.log나 error.log를 살펴볼 필요가 있다. 이 파일들은 디렉토리 /usr/local/nginx/logs 또는 /var/log/nginx 아래에 존재한다.


Setting Up a Simple Proxy Server


nginx에서 가장 많이 사용하는 기능중에 하나는 프록시 서버로 세팅하는 것이다. 프록시 서버는 요청을 받으면 프록시된 서버로 요청을 전달하고 그들로부터 응답을 받아서 다시 클라이언트로 전송한다.


우리는 가장 기본적인 프록시 서버를 설정할 것이다. 로컬 디렉토리로부터 이미지를 서비스하고 다른 요청은 프록시된 서버로 전송하게 만들 것이다. 이 예제는 하나의 nginx 인스턴스에 모든 서버를 정의할 것이다.


먼저 프록시된 서버를 정의해보자.  

server {

    listen 8080;

    root /data/up1;


    location / {

    }

}


이것은 8080 포트를 리슨하는 단순한 서버를 정의한 것이다. 모든 리퀘스트는 /data/up1 디렉토리에 매핑한다는 것을 의미한다. 이 디렉토리를 만들고 index.html 파일을 위치시키자. root 지시자는 server 컨텍스트에 위치한다는 것을 주의하자. 


다음 이전 섹션의 서버 설정에 프록시 서버 설정을 만들자. 첫번째 로케이션 블럭에는 proxy_pass 지시자와 함께 프로토콜, 호스트명 그리고 포트를 파라마터로 명시하자.

server {

    location / {

        proxy_pass http://localhost:8080;

    }


    location /images/ {

        root /data;

    }

}


우리는 다음 로케이션 블럭을 변경할 것이다. 현재는 /images/라는 접두어 요청이 들어왔을때 /data/images/ 디렉토리로 매핑하는데 이것을 일반적은 파일 확장자에 대한 요청으로 변경해 보겠다. 다음과 같이 로케이션 블럭을 수정해보자.

location ~ \.(gif|jpg|png)$ {

    root /data/images;

}


정규표현식 파라미터는 .gif, .jpg 또는 .png로 끝나는 모든 URI와 매칭한다. 정규표현식은 반드시 ~로 시작해야 된다. 일치하는 요청은 /data/images 디렉토릴로 매핑된다.


nginx가 요청을 서비스할 로케이션 블럭을 선택하면 먼저 명시된 접두어로 로케이션 지시어를 체크한다. 가장 먼저 가장 긴 접두어를 체크하고 정규 표현식을 체크한다. 만약 정규표현식 매칭이 존재하면 로케이션을 선택한다.


프록시 서버 설정 결과는 다음과 같다.

server {

    location / {

        proxy_pass http://localhost:8080/;

    }


    location ~ \.(gif|jpg|png)$ {

        root /data/images;

    }

}


이 서버는 요청의 마지막 부분이 .gif, .jpg 또는 .png로 끝나는 것들을 /data/images 디렉토리에 매핑한다. 그리고 다른 모든 요청들은 위에 설정된 프록시된 서버로 전송한다.


새로운 설정을 적용하기 위해서 nginx에 리로드 시그널을 보낸다.



'Programming > Nginx' 카테고리의 다른 글

Nginx - Using nginx as HTTP load balancer  (1) 2016.03.24
Nginx - 설치 for centos  (0) 2016.03.23
Nginx - 502 Bad Gateway 해결법  (6) 2015.08.11
Comments