- 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 블록 시스템
- 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이 적용됩니다.
# 기본 설정 파일로 서버 시작
./webserv
# 사용자 정의 설정 파일로 서버 시작
./webserv your_config.conf- 기본 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- 파일 업로드 테스트
# POST 요청으로 파일 업로드
curl -X POST -F "file=@./test.txt" http://localhost:8080/upload.pl
# 업로드한 파일 확인
curl http://localhost:8080/uploaded_list.pl- CGI 스크립트 테스트
# Perl CGI script 실행
curl http://localhost:8080/hello.pl
# Python CGI script 실행
curl http://localhost:8080/cur_time.py- Autoindex 테스트 (설정에서 활성화된 경우)
curl http://localhost:8080/YoupiBanane/- 단일 호스트
http {
server {
listen 8080;
server_name localhost;
root html/;
location / {
index index.html;
autoindex on;
}
}
}- 다중 가상 호스트
http {
server {
listen 8080;
server_name site1.local;
root html/site1/;
}
server {
listen 8081;
server_name site2.local;
root html/site2/;
}
}- 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단순히 웹 서버를 사용하는 것을 넘어, C++로 웹 서버를 직접 구현하여 동작 방식을 이해하기 위해 시작한 프로젝트입니다. 덕분에 평소에 블랙박스처럼 추상적이었던 웹 서버의 내부 구조를 명확히 이해하고, 필요하다면 분석 및 수정까지 가능한 대상이라고 인식을 바꿀 수 있었습니다.
- HTTP/1.1 프로토콜부터 소켓 연결과 동적 콘텐츠 생성에 이르기까지, 웹 요청이 처리되는 모든 과정을 구현하여 웹 개발의 기본 원리를 탄탄하게 다질 수 있었습니다.
- I/O 멀티플렉싱 기법을 적용하여 현대 서버 환경에서의 효율적인 동시 접속 처리 방안을 구현하고 성능을 검증했습니다. 멀티프로세싱 및 멀티쓰레딩 방식과 비교하여 I/O 멀티플렉싱의 장점과 활발하게 사용되는 이유를 확인하였습니다.
- CGI(Common Gateway Interface) 핸들러를 구현하는 과정을 통해 웹 서버가 어떻게 프로세스 격리를 사용하여 동적 콘텐츠를 안전하게 실행하는 지 깨달았습니다.
Language:
Unlicense를 준수합니다. 자세한 내용은 LICENSE에서 확인할 수 있습니다.