본문 바로가기

비동기 웹 서버 C 구현체 httpserver.h

기술적인 이야기/웹 개발 2019. 12. 17.
반응형

어쩌다 접하게 된 httpserver.h라는 이름이 왠지 정겹게 느껴졌습니다. 와 이거 C 헤더 파일 아닌가 하는 느낌으로 말이죠.

https://github.com/jeremycw/httpserver.h

 

jeremycw/httpserver.h

Single header library for writing non-blocking HTTP servers in C - jeremycw/httpserver.h

github.com

네 정말 헤더였습니다. ㅎㄷㄷ

htpserver.h는 비동기 웹서버 구현을 C 헤더 파일 하나에 몰아서 해 놓은 변태 같은 프로젝트입니다. 왜 굳이 헤더냐고 할 수도 있는데 이 말은 "엔트리 포인트는 당신네가 구현해라" 이런 소리와 일맥상통하겠지요.

자 그럼 예제를 돌려볼까요? 일단 저장소를 클론부터 해왔습니다.

git clone git@github.com:jeremycw/httpserver.h.git

그리고 이제 엔트리 포인트를 만들어야겠지요. 공식 저장소의 문서 예제와 똑같이 아래의 내용으로 test.c 파일을 하나 만들어줍니다.

#define HTTPSERVER_IMPL
#include "httpserver.h"

#define RESPONSE "Hello, World!"

void handle_request(struct http_request_s* request) {
    struct http_response_s* response = http_response_init();
    http_response_status(response, 200);
    http_response_header(response, "Content-Type", "text/plain");
    http_response_body(response, RESPONSE, sizeof(RESPONSE) - 1);
    http_respond(request, response);
}

int main() {
    struct http_server_s* server = http_server_init(8080, handle_request);
    http_server_listen(server);
}

제일 상단의 매크로가 꼭 정의되어야 하는지는 확실치는 않네요. 시작점에 해당하는 main 함수에서 어떤 식으로 기동 하는지 적혀 있습니다. 저 8080은 아마도 포트겠지요?

컴파일을 해 봅니다. (참고로 제 컴퓨터는 맥북프로이고 그래서 macOS가 깔려 있습니다. 의존성이 있는지는 모르겠지만 homebrew로 이것저것 많이 깔려 있는 상태라는 점을 참고하세요.)

gcc test.c

귀찮아서 다른 옵션을 안 줬기 때문에 출력물은 a.out이라는 바이너리로 튀어나옵니다. 이걸 실행시켜 봅시다.

./a.out

별 다른 출력은 없습니다. 이제 브라우저에서 localhost:8080으로 접속해 봅시다.

잘 되네요. ^C 키로 종료도 잘 됩니다.

실제 웹서버처럼 파일을 호스팅 하려면 몇몇 구현이 더 필요할 것으로 보이지만 예제에 필요한 내용이 다 있는 것 같아 어렵지는 않아 보이네요. 거기다 개인적으로 친숙한 C 언어로 구현되어서 좋은데, 헤더 파일 달랑 하나라는 점은 너무 변태 같아서 너무 좋네요. 심지어 비동기라니...🤪

nginx를 대체할 수 있을까요? 실제로 nginx보다 가볍고 빠릅니다. 가능해 보이나요? 아뇨. 모듈도 안 되고 설정도 안 되고 멀티 프로세스나 스레딩 모델도 없는 순수 비동기 구현체뿐이라 비교하기는 많이 힘들 거예요.

대신 임베디드 환경에서 작고 단순한 웹서버가 필요할 때는 정말 요긴하게 쓸 수 있을 것 같습니다.

간단한 리뷰는 여기서 마칩니다.

728x90
반응형

댓글