작성자 : 김민석 (
lemonfish at
g
m
a
i
l
dot com
)
Apache Software Foundation 에서 참 좋은 일을 많이 합니다. 이런식으로 가진 지식을 지역(?)사회에 환원할 줄 아는 존경스러운 개발자분들이 이렇게나 많다니... ㅠ_ㅠ 저도 언젠가는!!!
이번 릴리즈를 알리는 공지에도 역시나 다른 릴리즈와 마찬가지로 뻔한 말들이 쓰여 있습니다. 역시 이건 템플릿이 아닌가 싶네요. 그런데 외국사람들은 참 수식을 좋아하는 것 같습니다. bug fix release 라고 적고 말면 아쉬워서 인지. ironing out some minor crashers 라는 표현을 쓰네요.
이하 원문의 일부.
This is primarily a bug fix release, ironing out some minorcrashers. More importantly however it includes two new SSLfeatures. We encourage Traffic Server users to upgrade - andeverybody else to try it out!
참 써보고 싶게 만들지 않습니까?
어쨌든. 이번 릴리즈의 새로운 점이나 수정된 사항을 얘기하기에 앞서. 잠시 Apache Traffic Server 에 대해서 간단히 알아보고 넘어가겠습니다.
혹시
squid(오징어) 라고 들어 보셨나요? squid 는 아주 유명한 프락시 서버입니다. 몇 년 전 부터 많이 쓰이는 웹 가속기는 어떤가요? 웹가속기는 하드웨어적으로 구현된 프락시 서버라고 보시면 되겠네요. 혹시 모르니 곁다리로 프락시 서버에 대해서 설명을 해보지요. 프락시 서버는 실제 서버와 사용자 사이에서 동작합니다. 예를 들면 사용자가 어떤 웹페이지를 보고자 했을 때 그것을 그 웹페이지가 있는 실제 서버가 아닌 프락시 서버로 요청을 하게 됩니다. 그러면 프락시 서버는 그 웹페이지를 자기가 가지고 있으면 그걸 바로 사용자에게 보내주고, 없으면 실제 웹페이지를 가지고 있는 서버에 요청하여 가져온 다음 다시 사용자에게 보내 주는 것이죠. 사실 네트워크 인프라가 전세계 어느 나라보다 막강한 우리나라 사람들이야 그다지 필요성을 느끼지 못하겠지만. 망이 상상도 못할 정도로 저속인 국외에서는 저~~어기 있는 서버에서 여어~기 있는 사용자까지 한바이트씩 한바이트씩 왔다갔다하려면 한나절이었던 거죠. 그래서 실제 서버와 사용자 사이의 곳곳에 프락시 서버가 존재해서 열악한 네트워크 인프라를 극복했달까... 뭐 그렇습니다. 현대에 들어오면서 프락시 서버는 단순히 멀리 있는 컨텐츠를 근처에 미리 가져다 놓고 빨리 갔다가 쓰기 위한 용도뿐만이 아닌 로드밸런싱, 필터링, 로깅 등등의 다양한 용도로 사용되고 있지요. (해킹에도 사용됩니다 :P)
주저리주저리 서두가 길었습니다만 결론은 Apache Traffic Server 가 바로 그 프락시 서버라는 겁니다. squid 라는 유우우명한 프락시 서버가 있다더니 Apache Traffic Server 는 뭐 별거냐? 싶으실지도 모르겠네요.
근데 요녀석이 좀 사연이 있는 녀석입니다.
2009년 11월 2일. 야후에서 사용하던 놈이었던 Traffic Server 를 Apache Software Foundation 에 기증을 하게 됩니다. (내부적으로 세션관리나 인증, 설정관리, 로드밸런싱, 클라우드 컴퓨팅 스택간의 라우팅을 위해 사용되었다고 함) 오픈 소스 클라우드 컴퓨팅을 위한 투자로서 기증을 한거죠. 당시에 야후 클라우드 컴퓨팅 팀에서 소개한 바로는
"졸라 졸라 빠르고, 졸라 졸라 성능 뛰어나고, 견고하고 확장성있는 API 에다가 프락시 + 알파로 요청 라우팅에 필터링에 로드 밸런싱에 블라블라블라... 1.86GHz 쿼드코어에서 일정한 트래픽 패턴일때 다른 애들은 초당 8천건의 요청을 처리하는데 우리는 초당 3만요청을 처리할 수 있고,.... 우리는 하루에 300억개의 컨텐츠, 400테라바이트의 데이터를 요놈으로 서비스 해왔고... 요거 만드는데 투입된 공수가 몇백년이고 squid 만들던 사람도 참여 했었고,...킹왕짱이야. 근데 사실 몇몇 부분에서는 squid 도 썼었어... 모든게 완별할 순 없잖아? 그러니까. 이렇게 다들 볼 수 있게 내놓을 테니 같이 ipv6 도 집어넣고, 64비트 지원도 넣고, 이것저것 넣어서 좀 잘 만들어보자. "
이만큼 각별한 소프트웨어를 오픈소스에 기증한 야후는 대인배~ 외쳐!!! ~야후! (관련기사는
여기에서)
전체 내용보다 서두가 길겠군요. 그럼 이제 요번 릴리즈를 살펴보지요.
16개의 오류수정과 1개의 개선사항 1개의 새로운 기능이 이번 릴리즈에 포함되었습니다. 새로운 기능, 개선사항, 오류수정 순으로 보겠습니다.
새로운 기능. 두구궁.
- SSL 설정과 관련한 기능입니다. ssl_multicert.config 는 Traffic Server 에 여러 아이피가 부여된 경우 요청이 들어온 서버 아이피에 따라서 인증서를 따로 주기위한 것인데. CA 체인도 별도로 지정할 수 있게 됐답니다. (원래는 CA 는 다 동일하게 쓰게 되어있었음)
다음으로 개선사항입니다.
- 이것도 SSL 과 관련된 것이군요. SSL 이 사용될 때 클라이언트와 서버간에 협상이라는게 이뤄지는데요. 간단하게 말하면 클라이언트는 128비트 암호화밖에 못다루는데 서버에서 1024비트로 암호화된 내용을 날리면 전혀 대화가 안되겠지요. 때문에 인증정보를 날리기 전에 클라이언트가 어디까지 처리가능한지 확인하는 겁니다. 이전 버전의 Traffic 서버에서는 이 부분을 전혀 제어할 수 없었습니다. 따라서 클라이언트가 128비트 암호화만 지원하면 서버에서는 당연히 128비트로 암화화된 내용을 전달해 왔던 거지요. 근데 보안이 중요한 곳에서는 "무조건 128비트 보다 높은 암호화 수준으로 통신을 하고 그에 미달되는 놈은 차라리 튕겨내겠다" 라고 할 수 도 있을 겁니다. 그래서 이번 릴리즈에서 그러한 암호화 수준을 지정할 수 있는 기능이 추가되었습니다.
이제 어떤 오류들이 수정되었는지 보겠습니다.
- 아주 치명적인 버그가 수정되었습니다. 헤더를 처리할 때 자주쓰이는 문자열들을 맵에 저장해서 사용하고 있는데 해쉬값과 길이만 비교하고 있었네요. 그렇게 될 경우 실제 동일한 해쉬값과 길이를 가진 다른 문자열이 헤더에 섞여 들어올 경우 보안에 문제가 심하게는 서버가 뻗을 수 있다는 이유로 후다닥.. 수정.
- 솔라리스 10 에서 SSL 커넥션에 행이 걸리는 문제가 수정 되었습니다. 소스를 보니 읽기,쓰기가 별도로 처리되어야 하는데 분기처리를 하나 잘못 해서 읽으려는놈을 쓰라고 하고 쓰려는 놈을 읽으라고 하고 있었네요. 커허. 어쨌든 수정되었으니 OK!
- 디버그 빌드를 구동중이거나 스레드별 커넥션풀을 사용중일 때 활성화 되지 않아야할 assert 가 제거되었습니다.
- 분석을 위해 사용되는 바이너리 로그 생성시 추가적인 개행이 들어가서 traffic_logstats 명령을 이용해 요약을 만들 수 없었답니다. 보니까. writeln 을 write 로 변경했군요.
- ssl.server.cert.path 설정과 ssl.server.private_key.path 설정이 경우에 따라서 제대로 먹질 않는다는 보고가 있었습니다. 각각을 처리하는 함수들이 따로 따로 만들어져 있다보니 동일한 방식으로 처리가 되지 않았나 봅니다. 소스상에서 모두다 동일한 함수를 사용하게 해서 처리했군요.
- proxy.config.http.forward.proxy_auth_to_parent 라는 길기도 긴 옵션이 동작하지 않는다는 버그입니다. 일단 수정은 된것 같은데. 이 옵션 사용은 그다지 권장하지 않는다는군요.
- 빌드 시 최적화 옵션이 먹지 않던게 수정되었습니다.
- 데비안과 솔라리스에서 make check 수행시 fail 이 뜬다는데. 이게 원래 수정된 사항이었다네요. 그래서 백포트 되었습니다.
- TSFetchURL 이 호출될 때 PluginVC 에서 처리될 이벤트가 없는데 이벤트를 타면서 죽어버리는 현상이 수정되었습니다.
- HTTP 컴포넌트에서 메모리 누수가 보고되었는데 보니까 뭐랄까. 요새는 메모리가 기가단위인데... 몇십바이트 정도야... 새도 상관없지 않을까 하는 생각도 드네요. 어쨌든 수정이 되었습니다. (초기화 과정에서 파일명을 담는 변수에서 좀 샛나 보네요)
- TSHttpIsInternalRequest() 함수에서 클라이언트가 중간에 연결을 끊어버리면 뻗는 버그가 있었네요. 수정되었습니다.
- Mac OSX 10.6.8 에서 보고된 traffic_logstat 명령 수행시 죽어버리는 버그가 고쳐졌습니다.
- traffic_logstats 명령이 잘못된 도움말을 표시하던게 수정되었습니다. -l 옵션이 로그파일 지정에도 쓰이고, 출력 라인 길이 지정용으로도 나오더랍니다. ( -f 는 로그파일 지정이고 -l 은 라인길이지정이 맞습니다. )
- Free BSD 에서 컴파일시 malloc.h 말고 stdlib.h 를 써야된다고 피드백이 들어왔네요. malloc.h 를 쓰게되면 컴파일이 안된 답니다. 빌드설정이 수정되었네요.
- SSL 이 firefox 에서는 안되는데 google chome 에서는 되는 버그가 있었다네요. 예전에 수정되었던 사항이라 백포트 되었습니다. 소스를 보니 앞에서도 한번 나왔던 듯 한데. 읽기 쓰기를 반대로 고쳤네요. 애네들 그걸 자주 헷갈리나 봅니다.
- forward proxy 모드에서 계층적인 캐싱을 위해서 부모 서버를 지정했는데 부모 서버로 요청이 안가고 지가 다 처리하는 버그가 있었네요. 다른 버전에서 수정되었던 사항이라 백포트 되었습니다.
소프트웨어란 뚝딱하고 만들어서 완성되자마자 완벽해지는 것이 아닌. 오랜기간 쓰이고 고쳐지면서 점점 성장하는 그런 것이 아닌가 싶습니다. 마치 나무처럼 말이죠. 어이구 내 새끼! ㅋ