Skip to content

soonvro/webserver-cpp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Contributors Forks Stargazers Issues Unlicense License

Logo

C++98 I/O Multiplexing 웹 서버

GET, POST, DELETE 요청, 다중 클라이언트 병렬 처리, 정적 파일 제공과 같은 기본적인 HTTP/1.1 및 NGINX Configure 문법을 지원합니다.


Table of Contents

주요 기능

  • RFC 규격 준수 HTTP Parser:
    • 자체 구현한 유한 상태 오토마타 Parser
    • HTTP/1.1 규격 지원
  • 이벤트 기반 I/O 멀티플렉싱:
    • 효율적인 이벤트 관리를 위한 kqueue 사용
    • 논블로킹 I/O 작업
    • 비동기 요청/응답 처리
    • 동시 연결 처리 지원
  • HTTP/1.1 프로토콜 지원
  • 동적 설정 파일: Nginx의 Config 문법을 사용한 설정 파일 시스템
  • CGI 지원: Perl, Python CGI 스크립트 처리 및 효율적인 프로세스 관리
  • 다중 서버 블록: 여러 포트에서 다중 가상 호스트 구성 지원
  • 고급 요청 처리:
    • GET, POST, DELETE 메소드 지원
    • 청크 전송 인코딩 (Chunked Transfer Encoding)
    • 클라이언트 요청 본문 크기 제한
    • 사용자 정의 오류 페이지
  • 디렉토리 목록 자동 생성: Autoindex 기능 (활성화/비활성화 설정 가능)
  • URL 라우팅: 경로 기반 Location 블록 시스템

▲ back to top

빠른 시작

요구 사항

  • mac OS
  • C++ compiler with C++98 support
  • Make
  • Python3 (for CGI support)
  • Perl (for CGI support)

설치 및 실행

# 1. Clone the repository
git clone https://github.com/soonvro/webserver-cpp.git

# 2. Build the project
cd webserver-cpp && make

# 3. Run the server
./Webserv [config_file]

설정 파일을 명시하지 않으면, 기본 설정 파일인 webserv.config이 적용됩니다.

▲ back to top

사용 예시

서버 시작

# 기본 설정 파일로 서버 시작
./webserv

# 사용자 정의 설정 파일로 서버 시작
./webserv your_config.conf

서버 기능 테스트

  1. 기본 HTTP 요청 테스트
# GET request
curl http://localhost:8080/

# POST request
curl -X POST -d "data=test" http://localhost:8080/

# DELETE request
curl -X DELETE http://localhost:8080/file.txt
  1. 파일 업로드 테스트
# POST 요청으로 파일 업로드
curl -X POST -F "file=@./test.txt" http://localhost:8080/upload.pl

# 업로드한 파일 확인
curl http://localhost:8080/uploaded_list.pl
  1. CGI 스크립트 테스트
# Perl CGI script 실행
curl http://localhost:8080/hello.pl

# Python CGI script 실행
curl http://localhost:8080/cur_time.py
  1. Autoindex 테스트 (설정에서 활성화된 경우)
curl http://localhost:8080/YoupiBanane/

설정 파일 예시

  1. 단일 호스트
http {
    server {
        listen 8080;
        server_name localhost;
        root html/;
        location / {
            index index.html;
            autoindex on;
        }
    }
}
  1. 다중 가상 호스트
http {
    server {
        listen 8080;
        server_name site1.local;
        root html/site1/;
    }
    server {
        listen 8081;
        server_name site2.local;
        root html/site2/;
    }
}
  1. CGI 설정
http {
    server {
        listen 8080;
        location ~ \.pl$ {
            root html/;
            cgi_root /usr/bin/perl;
        }
        location ~ \.py$ {
            root html/;
            cgi_root /usr/bin/python3;
        }
    }
}

모니터링

# 포트 확인
lsof -i :8080

# 서버 로그 확인
tail -f /var/log/webserv.log

# 서버 프로세스 확인
ps aux | grep webserv

▲ back to top

왜 Webserver Cpp를 만들었나요?

단순히 웹 서버를 사용하는 것을 넘어, C++로 웹 서버를 직접 구현하여 동작 방식을 이해하기 위해 시작한 프로젝트입니다. 덕분에 평소에 블랙박스처럼 추상적이었던 웹 서버의 내부 구조를 명확히 이해하고, 필요하다면 분석 및 수정까지 가능한 대상이라고 인식을 바꿀 수 있었습니다.

  • HTTP/1.1 프로토콜부터 소켓 연결과 동적 콘텐츠 생성에 이르기까지, 웹 요청이 처리되는 모든 과정을 구현하여 웹 개발의 기본 원리를 탄탄하게 다질 수 있었습니다.
  • I/O 멀티플렉싱 기법을 적용하여 현대 서버 환경에서의 효율적인 동시 접속 처리 방안을 구현하고 성능을 검증했습니다. 멀티프로세싱 및 멀티쓰레딩 방식과 비교하여 I/O 멀티플렉싱의 장점과 활발하게 사용되는 이유를 확인하였습니다.
  • CGI(Common Gateway Interface) 핸들러를 구현하는 과정을 통해 웹 서버가 어떻게 프로세스 격리를 사용하여 동적 콘텐츠를 안전하게 실행하는 지 깨달았습니다.

▲ back to top

기술 스택

Language:

  • cpp

▲ back to top

라이선스

Unlicense를 준수합니다. 자세한 내용은 LICENSE에서 확인할 수 있습니다.

▲ back to top

About

NGINX의 일부 기능을 C++로 구현한 프로젝트입니다.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •