42seoul에서 진행하는 프로젝트로, C++을 활용하여 I/O Multiplexing 기반 Http Web Server를 구현합니다.
- nginx.conf파일과 같은 형식으로 된 설정파일을 파싱합니다.
- 파싱된 데이터를 기반으로 Socket을 생성하고 tcp 소켓, non-blocking으로 설정한 후 설정 포트에 bind하고 listen합니다.
- Client Socket에서 connect할 때 accept함수가 return 하면서 클라이언트에게 대응 되는 Socket이 생성됩니다.
- 2, 3의 과정에서 생성되는 소켓들을 실제로는 I/O Multiplexing System call인 kqueue를 활용하여 이벤트를 확인합니다. kqueue를 사용한 이유는 여러 Socket의 File Descriptor Event에 대해서 변경을 감지하기 위해서 이며 Select 방식보다 효율적이기 때문입니다. Select는 매번 Event 구조를 재생성 하지만 kqueue는 자체적인 큐를 보유하고 재사용합니다. https://stackoverflow.com/questions/17355593/why-is-epoll-faster-than-select
- Socket에서 Read event가 발생했다면 요청이 온 경우이고 Write event가 발생한다면 Response를 보내야하는 상황입니다.
- Http 명세에 맞게 요청을 파싱하고 처리하여 적절한 응답코드와 함께 응답합니다.
make re && ./webserv config_files/default.conf
localhost:8081/
siege -b 127.0.0.1:8081
sorikikikim / Hyeon2Nam / xogml123
- Blocking, Non-Blocking, Synchronous, Asynchronous의 개념
- 여러 웹서버 I/O의 구성 방식
- select vs kqueue
- Nginx System
- Blocking-Multi-thread vs Non-Blocking-Single-Thread
How to build a simple HTTP server
HTTP/1.1 : Message Syntax and Routing (RFC 7230)
HTTP/1.1 : Semantics and Content (RFC 7231)
HTTP/1.1 : Conditional Requests (RFC 7232)
HTTP/1.1 : Range Requests (RFC 7233)
HTTP/1.1 : Authentication (RFC 7235)