본문 바로가기

TechLog

개발일기.20120204: 가벼운 C# 기반 웹 서버 찾기

#.
Mug 서비스의 호스트 프로그램을 C# 버전으로 새로 만들어둬야겠다는 생각이 들어서 웹 서버를 좀 찾아보았다. HTTP를 통해 Mug 클라이언트에 실제 미디어 파일을 제공해야 하는데, 동영상 재생 등의 조건 때문에 웹 서버가 HTTP 1.1을 지원하면서 헤더도 일부 처리할 수 있어야만 했다.

처음 프로토타입을 만들 때는 멋도 모르고 .NET에 내장되어 있는 HTTP 리스너 클래스를 사용해서 구현했다가 이 리스너가 Content-Length 등의 헤더를 처리하지 못하는 것 때문에 한참 삽질을 했었다. 원래 아이폰에서 영상이나 음악 파일을 재생할 때에는 해당 파일을 한 번만 요청해서 처음부터 끝까지 쭉 받는 대신, 중간중간에 요청을 끊으면서 여러 번 파일을 요청하는 방식으로 동작한다. (이거 알아내는데 얼마나 오래 걸렸던지 … 잘 알려진 내용도 아니고) 그렇기 떄문에 웹 서버가 Content-Length 헤더를 처리하지 못하면 아예 영상이나 음악 파일은 재생조차 안 된다.

Content-Length 헤더를 처리하는 로직을 구현하기도 했는데, 귀찮은 작업이 점점 많아지다보니 결국에는 Apache와 nginx를 사용했었다. (물론 별도로 웹 서버 프로세스를 실행하고, 그렇게 실행된 프로세스를 죽이고 살리고 하는 방식이었다) 가벼운 웹 서버가 아니다보니 프로세스가 실행되는데도 시간이 걸리고, 뭐 그렇더라. 어쨌든 동작은 하니까 그럭저럭 테스트는 가능했다.

 

시간이 좀 지나서, 여유가 생긴 다음 이런저런 웹 서버를 찾아보니 벼라별 녀석이 다 있더라. 경량 웹 서버에 관심이 있는 사람은 다음 아티클도 한 번 읽어보자:

- Lightweight Web servers
http://www.ibm.com/developerworks/web/library/wa-ltwebserv/#icomments

- Comparison of lightweight web servers
http://en.wikipedia.org/wiki/Comparison_of_lightweight_web_servers

 

 

#.
전에는 그렇게 자세히 찾아보진 못 했었다만, 오늘 찾아보니 소스 코드 수준에서 웹 서버를 임베딩할 수 있는, 다시 말해 아파치처럼 외부 웹 서버를 실행하는 대신에 웹 서버 모듈 자체를 내 프로그램에 포함시킬 수 있도록 구성되어 있는 웹 서버 중에 C#으로 된 것도 있었다. 예전에 검색해 봤을 때는 C/C++ 혹은 스크립트로 구현된 것들만 있어서 쓸 엄두를 못 냈었는데 … 어쨌든 검색한 결과 나온 것은 KayakCassini, UltiDev Web Server Pro. (이 프로그램은 Cassini에서 갈라져 나온 것 같다) 최종적으로는 가장 기능 없어 보이는 Cassini를 쓰기로 했는데, 소스 코드까지 뜯어서 이것저것 만져보려니 Cassini가 가장 만만해 보이더라 (…)

써 본 결과로는 대체로 만족. 기본적인 헤더 처리 정도는 별 문제가 없고, 예외적인 URL을 몇 가지를 처리하지 못하는 문제가 있긴 한데 조금만 고쳐서 쓰면 될 것 같다. 무엇보다도 사용법 자체가 워낙 심플해서 맘에 든다. 예를 들어 웹 서버를 시작하는 코드가 이런 식이다:

_server = new Cassini.Server(Settings.WebServerPort, "/", Settings.MediaFolderPath);
_server.Start();

이건 뭐 쉽고 어렵고를 떠나서, 별로 할 게 없다. 나는 이런 게 좋아!

 

어쨌든 코드가 좀 정리되면 어디 나가서 세미나를 하든지 좀 주위 사람들에게 전파할 방법을 좀 고민해 봐야지.