3장. 설정¶
이 장에서는 전반적인 설정구조에 대해 설명한다. 특히 서버 관리자를 위한 전역설정과 설정파일을 다루는 방법에 대해 상세히 다룬다. 구조를 정확히 이해해야 빠르고 정확하게 서버를 배치할 수 있을뿐만 아니라 장애상황을 유연하게 극복할 수 있다.
구조와 표현¶
STON 미디어 서버는 XML표현을 사용한다. 설정파일은 전역(server.xml)과 가상호스트(vhosts.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
속성이 적용된다.Admin
모든 API호출이 가능하다.User
api_monitoring , Appendix A: Graph API만 호출할 수 있다.Looker
Appendix A: Graph API만 호출할 수 있다.
기타 다음과 같은 자잘한 관리목적의 속성을 가진다.
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하여 서비스 품질을 향상시킨다. 서비스 형태에 따라 이 비율을 조절하여 품질을 최적화한다.
예를 들어 4K 고화질 영상처럼 파일 Contents크기가 큰 서비스의 경우 File I/O 부하가 부담스럽다. 이런 경우
<ContentMemoryRatio>
를 높여서 보다 많은 Contents데이터가 메모리에 상주할 수 있도록 설정하면 서비스 품질을 높일 수 있다.
기타 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보다 큰 경우, 일정 기간동안 한번도 접근되지 않은 콘텐츠를 삭제한다. 디스크를 미리 확보하여 서비스 시간 중 디스크 부족이 발생할 확률을 줄이기 위함이다.
<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>
을 상속받는다.
가상호스트 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>