3장. 설정

이 장에서는 전반적인 설정구조에 대해 설명한다. 특히 서버 관리자를 위한 전역설정과 설정파일을 다루는 방법에 대해 상세히 다룬다. 구조를 정확히 이해해야 빠르고 정확하게 서버를 배치할 수 있을뿐만 아니라 장애상황을 유연하게 극복할 수 있다.

구조와 표현

STON 미디어 서버는 XML표현을 사용한다. 설정파일은 전역(server.xml)과 가상호스트(vhosts.xml)로 나뉜다.

../_images/sms_conf_files.png

2개의 .xml파일이 전부입니다.

2개의 XML파일로 대부분의 서비스를 구성한다. 여러 TXT파일에는 가상호스트별 예외조건을 설정하는데, 특정기능의 목록을 작성하는데 사용된다.

다음처럼 완전한 형태의 XML을 예시하는 것은 매우 번거롭다.

<Server>
    <VHostDefault>
        <Options>
            <Http>
                <ClientKeepAliveSec>10</ClientKeepAliveSec>
            </Http>
        </Options>
    </VHostDefault>
</Server>

따라서 다음과 같이 축약된 표현을 사용한다.

# server.xml - <Server><VHostDefault><Options><Http>

<ClientKeepAliveSec>ON</ClientKeepAliveSec>

주석

라이센스(license.xml)는 설정이 아니다.

server.xml 전역설정

실행파일과 같은 경로에 존재하는 server.xml이 전역설정 파일이다. XML형식의 텍스트파일이다.

# server.xml

<Server>
    <Host> ... </Host>
    <Cache> ... </Cache>
    <VHostDefault> ... </VHostDefault>
</Server>

우선 전역설정의 구조와 간단한 기능위주로 설명한다. 접근제어나 SNMP등 전역설정에 위치하지만 덩치가 큰 기능들에 대해서는 각 주제를 다루는 장에서 설명한다.

관리자 설정

관리목적의 기능을 설정한다.

# server.xml - <Server>

<Host>
    <Name>stream_07</Name>
    <Admin>admin@example.com</Admin>
    <Manager Port="20040" HttpMethod="ON" Role="Admin" UploadMultipartName="confile">
        <Allow>192.168.1.1</Allow>
        <Allow Role="Admin">192.168.2.1-255</Allow>
        <Allow Role="User">192.168.3.0/24</Allow>
        <Allow Role="Looker">192.168.4.0/255.255.255.0</Allow>
    </Manager>
</Host>
  • <Name>

    서버 이름을 설정한다. 이름이 입력되지 않으면 시스템 이름을 사용한다.

  • <Admin>

    관리자 정보(메일 또는 이름)를 설정한다. 이 항목은 SNMP 조회목적으로만 사용된다.

  • <Manager>

    관리용도로 사용할 매니저 포트와 ACL(Access Control List)을 설정한다. ACL은 IP, IP범위, BitMask, Subnet 이상 네 가지 형식을 지원한다. 접속한 세션이 Allow로 접근이 허가된 IP가 아니면 접속을 차단한다. API를 호출하는 IP가 <Allow> 목록에 반드시 설정되어야 한다.

    접근조건에 따라 접근권한(Role)을 설정할 수 있다. 접근권한이 없는 요청에 대해서는 401 Unauthorized 로 응답한다. <Allow> 조건에 Role 속성을 명시적으로 선언하지 않을 경우 <Manager>Role 속성이 적용된다.

    기타 다음과 같은 자잘한 관리목적의 속성을 가진다.

    • HttpMethod
      • ON (기본) api-etc-httpmethod 호출시 ACL을 검사한다.
      • OFF api-etc-httpmethod 호출시 ACL을 검사하지 않는다.
    • UploadMultipartName api-conf-upload 의 변수명을 설정한다.

Storage 구성

Caching된 콘텐츠를 저장할 Storage를 구성한다.

# server.xml - <Server>

<Cache>
    <Storage DiskFailSec="60" DiskFailCount="10" OnCrash="hang">
        <Disk>/user/cache1</Disk>
        <Disk>/user/cache2</Disk>
        <Disk Quota="100">/user/cache3</Disk>
    </Storage>
</Cache>
  • <Storage>

    콘텐츠를 저장할 디스크를 설정한다. 하위 <Disk> 개수제한은 없다.

    디스크는 장애가 가장 많이 발생하는 장비이기 때문에 명확한 장애조건을 설정할 것을 권장한다. DiskFailSec (기본: 60초) 동안 DiskFailCount (기본: 10) 만큼 디스크 작업이 실패하면 해당 디스크는 자동으로 배제된다. 배제된 디스크 상태는 "Invalid"로 명시된다.

    모든 디스크가 배제될 수도 있는데 이 때의 동작방식은 OnCrash 속성으로 설정한다.

    • hang (기본) 장애 디스크를 모두 재투입한다. 정상 서비스를 기대한다기 보다는 원본을 보호하려는 목적이 강하다.
    • selfkill STON 미디어 서버를 종료시킨다.

각 디스크마다 최대 캐싱용량을 Quota (단위: GB) 속성으로 설정할 수 있다. 굳이 설정하지 않더라도 항상 디스크가 꽉 차지 않도록 LRU(Least Recently Used) 알고리즘에 의해 오래된 콘텐츠를 자동으로 삭제한다. 특별히 호환성에 문제가 있는 파일시스템은 없다. 그러므로 관리자가 친숙한 파일 시스템을 사용해도 성능에 큰 영향은 없다.

메모리 제한

사용할 최대 메모리와 컨텐츠 적재비율 설정한다.

# server.xml - <Server>

<Cache>
    <SystemMemoryRatio>100</SystemMemoryRatio>
    <ContentMemoryRatio>50</ContentMemoryRatio>
</Cache>
  • <SystemMemoryRatio> (기본: 100%)

    시스템 메모리에서 STON 미디어 서버가 사용할 최대 메모리를 비율로 설정한다. 예를 들어 16GB장비에서 이 수치를 50(%)으로 설정하면 시스템 메모리가 8GB인 것처럼 동작한다.

  • <ContentMemoryRatio> (기본: 50%)

    STON 미디어 서버는 디스크에서 로딩된 Body 데이터를 메모리에 최대한 Caching하여 서비스 품질을 향상시킨다. 서비스 형태에 따라 이 비율을 조절하여 품질을 최적화한다.

    ../_images/bodyratio1.png

    ContentMemoryRatio를 통해 메모리비율을 설정한다.

    예를 들어 4K 고화질 영상처럼 파일 Contents크기가 큰 서비스의 경우 File I/O 부하가 부담스럽다. 이런 경우 <ContentMemoryRatio> 를 높여서 보다 많은 Contents데이터가 메모리에 상주할 수 있도록 설정하면 서비스 품질을 높일 수 있다.

    ../_images/bodyratio2.png

    ContentMemoryRatio를 높이면 I/O가 감소한다.

기타 Caching 설정

기타 Caching서비스의 기반동작을 설정한다.

# server.xml - <Server>

<Cache>
    <Cleanup>
        <Time>02:00</Time>
        <Age>0</Age>
    </Cleanup>
    <Listen>0.0.0.0</Listen>
    <ConfigHistory>30</ConfigHistory>
</Cache>
  • <Cleanup>

    하루에 한 번 시스템 최적화를 수행한다. 최적화의 대부분은 디스크정리 작업으로 I/O 부하가 발생한다. 서비스 품질저하를 방지하기 위해 최적화는 조금씩 점진적으로 수행된다.

    • <Time> (기본: AM 2) Cleanup 수행시간을 설정한다. 오후 11시 10분을 설정하고 싶다면 23:10으로 설정한다.
    • <Age> (기본: 0, 단위: 일) 0보다 큰 경우, 일정 기간동안 한번도 접근되지 않은 콘텐츠를 삭제한다. 디스크를 미리 확보하여 서비스 시간 중 디스크 부족이 발생할 확률을 줄이기 위함이다.
  • <Listen>

    모든 가상호스트가 Listen할 IP목록을 지정한다. 모든 가상호스트의 기본 Listen설정인 *:80, *:1935는 0.0.0.0:80과 0.0.0.0:1935를 의미한다. 지정된 IP만을 열고 싶은 경우 다음과 같이 명확하게 설정한다.

    # server.xml - <Server>
    
    <Cache>
      <Listen>10.10.10.10</Listen>
      <Listen>10.10.10.11</Listen>
      <Listen>127.0.0.2</Listen>
    </Cache>
    
  • <ConfigHistory> (기본: 30일)

    STON 미디어서버는 설정이 변경될 때마다 모든 설정을 백업한다. 압축 후 ./conf/ 에 하나의 파일로 저장된다. 파일명은 "날짜_시간_HASH.tgz"로 생성된다.

    20170224_174843_D62CA26F16FE7C66F81D215D8C52266AB70AA5C8.tgz
    

    모든 설정이 완전히 동일하다면 같은 HASH값을 가진다. api-conf-restore 가 호출되도 새로운 설정으로 저장된다. 백업된 설정은 Cleanup시간을 기준으로 설정된 날만큼만 저장된다. 설정파일 저장의 날짜제한은 없다.

강제 Cleanup

API호출로 Cleanup한다. <Age> 를 파라미터로 입력할 수 있다.

http://127.0.0.1:20040/command/cleanup
http://127.0.0.1:20040/command/cleanup?age=10

<Age> 가 0이라면 디스크 공간이 부족하다고 판단될 때만 Cleanup을 수행한다. <Age> 파라미터가 0보다 크다면 해당 "일"동안 한번도 접근되지 않은 콘텐츠를 삭제한다.

가상호스트 기본설정

관리자는 각각의 가상호스트를 독립적으로 설정할 수 있다. 하지만 가상호스트를 생성할 때마다 동일한 설정을 반복하는 것은 매우 소모적이다. 모든 가상호스트는 <VHostDefault> 을 상속받는다.

../_images/sms_conf_overriding1.png

별도로 명시하지 않은 설정은 <VHostDefault>의 값을 사용한다.

가상호스트 foo.com의 경우 별도로 덮어쓰기(Overriding)한 값이 없으므로 ClientKeepAliveSec 는 10, BufferSize 는 3이 된다. 반면 가상호스트 bar.com은 BufferSize 를 8로 덮어 쓰기(Overriding)했으므로 ClientKeepAliveSec 는 10, BufferSize 는 8이 된다. 관리자들은 보통 같은 서비스특성을 가지는 서비스를 한 서버에 같이 구성한다. 그러므로 상속은 매우 효과적인 방법이다.

<VHostDefault> 는 5개의 하위 태그를 가진다.

# server.xml - <Server>

<VHostDefault>
    <Options> ... </Options>
    <OriginOptions> ... </OriginOptions>
    <ContentTransform> ... </ContentTransform>
    <Stats> ... </Stats>
    <Log> ... </Log>
</VHostDefault>

설정 API

STON 미디어 서버는 설정과 관련된 많은 API를 제공한다.

http://127.0.0.1:20040/conf/{명령어}

적용

설정이 변경되면 관리자는 명확하게 API를 호출해야 한다. 시스템과 성능 관련설정을 제외한 대부분의 설정은 서비스 중단 없이 즉시 적용된다.

http://127.0.0.1:20040/conf/reload

설정이 변경될 때마다 admin-log-info 에 변경사항이 기록된다.

열람

서비스 중인 설정파일을 열람한다. txt파일들은 가상호스트(vhost)를 명확하게 지정해주어야 한다.

http://127.0.0.1:20040/conf/server.xml
http://127.0.0.1:20040/conf/vhosts.xml
http://127.0.0.1:20040/conf/querystring.txt?vhost=www.example.com
http://127.0.0.1:20040/conf/ttl.txt?vhost=www.example.com
http://127.0.0.1:20040/conf/http_headers.txt?vhost=www.example.com
http://127.0.0.1:20040/conf/http_throttling.txt?vhost=www.example.com

히스토리

백업된 설정목록을 열람한다.

http://127.0.0.1:20040/conf/latest
http://127.0.0.1:20040/conf/history

결과는 JSON 형식으로 제공된다. 빠르게 마지막 설정상태만 확인하고 싶은 경우는 /conf/latest를 사용할 것을 권장한다.

{
    "history" :
    [
        {
            "id" : "5",
            "conf-date" : "2017-02-25",
            "conf-time" : "15:26:37",
            "type" : "loaded",
            "size" : "16368",
            "hash" : "D62CA26F16FE7C66F81D215D8C52266AB70AA5C8",
            "ver": "1.0.0"
        },
        {
            "id" : "6",
            "conf-date" : "2017-02-26",
            "conf-time" : "07:02:21",
            "type" : "modified",
            "size" : "27544",
            "hash" : "F81D215D8C52266AB70AA5C8D62CA26F16FE7C66",
            "ver": "1.0.1"
        }
    ]
}
  • id 설정의 고유 아이디 (Reload할때마다 +1)
  • conf-date 설정 변경날짜
  • conf-time 설정 변경시간
  • type 설정이 반영된 형태 - loaded STON 미디어 서버가 시작될 때 - modified 설정이 (관리자 또는 WM에 의해) 변경될 때 - uploaded 설정파일 API를 통해 업로드 되었을 때 - restored 설정파일이 API를 통해 복구되었을 때
  • size 설정파일 크기
  • hash 설정파일을 SHA-1으로 hash한 값

복구

hash값 또는 id를 기준으로 원하는 시점의 설정으로 되돌린다. hash와 id가 모두 명시된 경우 hash값이 우선한다. 정상적으로 Rollback된 경우 200 OK, 실패한 경우 500 Internal Error로 응답한다.

http://127.0.0.1:20040/conf/restore?hash=...
http://127.0.0.1:20040/conf/restore?id=...

다운로드

hash값 또는 id를 기준으로 원하는 시점의 설정을 다운로드 한다. Content-Type은 "application/x-compressed"로 명시된다. hash와 id가 모두 명시된 경우 hash값이 우선하며, 해당 시점의 설정이 존재하지 않는 경우 404 NOT FOUND로 응답한다.

http://127.0.0.1:20040/conf/download?hash=...
http://127.0.0.1:20040/conf/download?id=...

업로드

설정파일을 HTTP Post방식(Multipart 지원)으로 업로드 한다.

http://127.0.0.1:20040/conf/upload

다음과 같이 주소, Content-Length, Content-Type(="multipart/form-data")이 명확하게 선언되어 있어야 한다.

POST /conf/upload
Content-Length: 16455
Content-Type: multipart/form-data; boundary=......

업로드가 완료되면 압축을 해지한 뒤 즉시 반영시킨다.

Multipart방식에서는 "confile"을 기본 이름으로 사용한다. 이 값은 <Manager>UploadMultipartName 속성에서 설정할 수 있다.

<form enctype="multipart/form-data" action="http://127.0.0.1:20040/conf/upload" method="POST">
    <input name="confile" type="file" />
    <input type="submit" value="Upload" />
</form>