독립형 OWIN 기반 웹 서버 – NOWIN

보통 닷넷에서 독립형 웹 서비스를 구현할 때 HttpListener 를 쓸 것이다. node.js 처럼 쉽게 구축이 가능하기 때문이다.

물론 그럴 일은 없겠지. 아무래도 안정화된 IIS로 다들 쓸텐데.

그러고 보니 MS도 OWIN 웹 서버인 Katana 를 만들어서 아직까지는 실험적으로 배포하고 있긴 하다. (모노 지원은 개나 줘버리고)

OWIN 표준은 1.0 으로 안정화가 되어 있지만, 이는 기본적인 웹 서비스를 위한 스펙이며, 아직 부가적인 요소 (웹소켓 등)은 표준을 만들고 있는 중이다.

그러는 와중에 드디어 내가 바랬던 프로젝트가 있었으니.. 바로, NOWIN 으로 OWIN 표준 기반 웹 서버다.

https://github.com/Bobris/Nowin

이녀석은 닷넷 4.5로 만든 웹 서버인데, 가장 큰 특징은 HttpListener 를 안썼다는 것이다.

무슨 소리냐고? 지랄같이 제한적인 기본적인 웹 서버 클래스를 안썼다는 것이다.

이말인 즉슨, 직접 웹서버를 닷넷으로 구현했다는 것이다.

이렇게 되면 모노 지원은 이미 따놓은 당상이며, 웹소켓도 아무렇지도 않게 지원된다.

윈도우 7이나 2008 R2 라도, 닷넷 4.5 깔면은 순수 닷넷으로 웹소켓과 웹서버를 한번에 휘어잡을 수 있게 된다.

아파치의 NIO같은 Non-Blocking I/O 를 직접 구현함으로써 극대화한 웹 서버가 이 프로젝트의 특징이다.

아시다시피 네이티브 웹소켓은 윈도우 2012 에 들은 IIS8에 채용되었다.

지금 윈도우 2012 로 닷넷 돌리는 곳이 얼마나 있을까. 가뜩이나 윈도우 라이센스 하면 치가 떨리는데.

프로젝트가 제시한 특징을 알아보자.

  • Http 1.0 와 1.1 클라이언트를 SocketAsyncEventArgs 클래스를 이용하여 가장 빠르게 인터넷을 구현
  • KeepAlive, 비테스트 파이프라인, 요청/응답에 자동 chunked en/decoding 기능 구현
  • 모든 개체에 비동기를 실현하였으며, 자동으로 병렬 코어로 작동하도록 구현
  • SSL 은 .Net SSL 스트림으로 동일한 보안 시스템 구현
  • WebSockets 을 독립적으로 작동할 수 있다! 따라서 SignalR 을 HttpListener 내장된 Win8 보다 더 빠르게 작동시킬 수 있다.
  • 현재 연결 수, 최대 할당 연결, 할당이 필요한 지 추적하는 기능을 제공한다.
  • 연결당 20kb RAM 정도가 소요되며 대부분 재사용된다. 하지만 절대 할당이 해제되지 않는다.
  • 기본적으로 최대 요청/응답 크기는 8KB 이다.
  • Nuget 으로 쉽게 사용이 가능하며, 종속성이 없다.

보아라. 종속성이 없다고 한다. 닷넷의 코어 기능만을 사용하여 웹 서버를 구현한 것이다. 이제 닷넷판 Netty 가 나온 것인가?

그렇다면 사용법을 알아보자.

Microsoft.Owin.Hosting nuget 사용시 샘플

static class Program
{
    static void Main(string[] args)
    {
        var options = new StartOptions
        {
            ServerFactory = "Nowin",
            Port = 8080
        };

        using (WebApp.Start<Startup>(options))
        {
            Console.WriteLine("Running a http server on port 8080");
            Console.ReadKey();
        }
    }
}

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Use(context =>
        {
            if (context.Request.Path == "/")
            {
                context.Response.ContentType = "text/plain";
                return context.Response.WriteAsync("Hello World!");
            }

            context.Response.StatusCode = 404;
            return Task.Delay(0);
        });
    }
}

빌더를 사용한 Https 샘플

var builder = ServerBuilder.New().SetPort(8888).SetOwinApp(SomeOwinApp);
builder.SetCertificate(new X509Certificate2("certificate.pfx", "password"));
using (builder.Start())
{
    Console.WriteLine("Listening on port 8888. Enter to exit.");
    Console.ReadLine();
}

마치 node.js 의 http API 와 흡사하다. 거기에다가 대리자를 통한 비동기 처리를 구현하였다.

이정도면 원하는 웹 서버를 쓰기 좋지 아니한가? 모노라도?

안타깝게도 아직까지는 안정성과 보안성을 검증하지 못하였다. 계속 테스트 중이며, 아직 실제로 쓰기에 보장이 전혀 없다.

Fork 는 12 지만 실제 참여자는 2명이다. 아는사람인지 알 턱은 없지만.

하지만 그래도 같이 테스트하고 참여해 볼 만 하다. 순수 닷넷으로 이정도를 구현했으면, 자바 부럽지 않은 웹 어플리케이션이 탄생해도 무방하지 아니한가? 이 NOWIN 을 통하여 Nancy 와 SignalR 조합이면 웹 어플리케이션에 두려움은 없을 것이란 생각이 자꾸 든다. 오호.

물론 ASP.NET 기반은 이걸로 동작이 어려울 것이다. ASP.NET MVC 등이 100% OWIN에도 동작하지 않는 이상은.

왜냐면 이들은 HttpListener 기반으로 돌아간다. 호환성은 망했어요.

닷넷에 이 프로젝트는 심히 기대대뇐 프로젝트다. 계속 눈여겨보고 테스트해야겠다.

근데 나 지금 회사에서 자바개발중이라서 아마 안될거야..

집에서 해야겠네.. 흑.

composite / 2014년 1월 8일 / 미분류
태그:, , , , , , , , , , , , , , ,

답글 남기기

Your email address will not be published / Required fields are marked *