Skip to content

[DISCURSSION] 프로젝트 시작을 위한 요구사항 정리 논의 및 정보 공유 #1

@fing9

Description

@fing9

주제

프로젝트를 시작하기 위해 필요한 요구사항을 함께 이야기하고, 정리하는 논의 입니다.

설명

요구 사항

• 프로그램은 구성 파일을 인수로 받거나 기본 경로를 사용해야 합니다.
• 다른 웹 서버를 execve 할 수 없습니다.
• 서버는 절대 블록되지 않아야 하며 클라이언트가 필요한 경우 적절하게 다시 시작될 수 있어야 합니다.
• 블록되지 않아야 하며 클라이언트와 서버 간의 모든 I/O 작업에 대해 poll() (또는 동등한 함수)를 1 회만 사용해야 합니다 (listen 포함).
• poll() (또는 동등한 함수)는 동시에 읽기와 쓰기를 확인해야 합니다.
• 읽기 또는 쓰기 작업을 poll() (또는 동등한 함수)를 통하지 않고 수행해서는 안됩니다.
• 읽기 또는 쓰기 작업 후 errno 값을 확인하는 것은 엄격히 금지됩니다.
• 구성 파일을 읽기 전에 poll() (또는 동등한 함수)를 사용할 필요가 없습니다.

비차단 파일 디스크립터를 사용해야 하므로, poll() (또는 동등한 함수)를 사용하지 않고도 read/recv 또는 write/send 함수를 사용하는 것이 가능하지만, 이는 시스템 리소스를 더 많이 소비할 수 있습니다.
따라서, 만약 poll() (또는 동등한 함수)를 사용하지 않고 어떤 파일 디스크립터에서도 read/recv 또는 write/send를 시도한다면, 학점이 0점이 될 것입니다.

• FD_SET, FD_CLR, FD_ISSET, FD_ZERO와 같은 모든 매크로와 정의를 사용할 수 있습니다. 이러한 것들이 무엇이며 어떻게 작동하는지를 이해하는 것이 매우 유용합니다.
• 서버에 대한 요청은 영원히 멈춰서는 안 됩니다.
• 서버는 선택한 웹 브라우저와 호환되어야 합니다.
• NGINX가 HTTP 1.1을 준수한다고 가정하고, 헤더 및 응답 동작을 비교할 수 있습니다.
• HTTP 응답 상태 코드는 정확해야 합니다.
• 제공된 오류 페이지가 없는 경우 기본 오류 페이지를 갖고 있어야 합니다.
• CGI를 제외한 다른 용도로 fork를 사용할 수 없습니다 (예: PHP, Python 등).
• 완전히 정적인 웹사이트를 제공할 수 있어야 합니다.
• 클라이언트가 파일을 업로드할 수 있어야 합니다.
• 적어도 GET, POST 및 DELETE 메서드를 지원해야 합니다.
• 서버를 스트레스 테스트해야 합니다. 모든 비용에도 불구하고 서버가 가용해야 합니다.
• 서버는 여러 포트를 수신 대기할 수 있어야 합니다 (구성 파일 참조).

MacOS에서는 다른 Unix 운영 체제와 마찬가지로 write()를 구현하지 않기 때문에 fcntl()을 사용할 수 있습니다.
다른 Unix 운영 체제와 유사한 동작을 얻기 위해 파일 디스크립터를 비차단 모드로 사용해야 합니다.

하지만 다음과 같은 플래그만을 사용하여 fcntl()을 사용할 수 있습니다: F_SETFL, O_NONBLOCK 및 FD_CLOEXEC. 다른 어떤 플래그도 사용할 수 없습니다.

III.3 설정 파일
NGINX 구성 파일의 '서버' 부분에서 영감을 받을 수 있습니다.
구성 파일에서 다음을 수행할 수 있어야 합니다:
• 각 '서버'의 포트와 호스트를 선택합니다.
• 서버 이름을 설정하거나 설정하지 않을 수 있습니다.
• 호스트:포트의 첫 번째 서버가 이 호스트:포트의 기본 서버가 됩니다 (다른 서버에 속하지 않는 모든 요청에 응답).
• 기본 오류 페이지를 설정합니다.
• 클라이언트 본문 크기를 제한합니다.
• 다음 규칙/구성 중 하나 이상을 사용하여 라우트를 설정합니다(라우트는 정규식을 사용하지 않을 것입니다):
◦ 라우트에 허용된 HTTP 메서드 목록을 정의합니다.
◦ HTTP 리다이렉션을 정의합니다.
◦ 파일이나 디렉토리를 정의하여 파일이 검색될 위치를 지정합니다(예를 들어, url /kapouet이 /tmp/www로 루트화되면 url /kapouet/pouic/toto/pouet이 /tmp/www/pouic/toto/pouet이 됩니다).
◦ 디렉토리 목록 표시를 켜거나 끌 수 있습니다.
◦ 디렉토리인 경우 응답할 기본 파일을 설정합니다.
◦ 특정 파일 확장자에 따라 CGI를 실행합니다(예: .php).
◦ POST 및 GET 메서드와 함께 작동하도록 합니다.
◦ 업로드된 파일을 허용하고 어디에 저장할지 구성할 수 있도록 합니다.
• CGI가 무엇인지 궁금하십니까?
• CGI를 직접 호출하지 않기 때문에 PATH_INFO로 전체 경로를 사용하십시오.
• 청크 요청의 경우 서버는 청크를 해제해야 하며, CGI는 본문의 끝으로 EOF를 기대할 것입니다.
• CGI의 출력에 대해서도 동일합니다. CGI에서 content_length가 반환되지 않으면 EOF가 반환된 데이터의 끝을 표시합니다.
• 프로그램은 요청된 파일을 첫 번째 인수로 CGI를 호출해야 합니다.
• 상대 경로 파일 액세스를 위해 CGI는 올바른 디렉토리에서 실행되어야 합니다.
• 서버는 하나의 CGI(php-CGI, Python 등)와 함께 작동해야 합니다.
평가 중에 모든 기능이 작동하는지 테스트하고 보여줄 수 있는 몇 가지 구성 파일과 기본 기능 파일을 제공해야 합니다.

만약 특정 동작에 대한 질문이 있다면, 프로그램의 동작을 NGINX와 비교해야 합니다.
예를 들어, server_name이 어떻게 작동하는지 확인해보세요.
작동하는 것이 모두 웹 브라우저와 테스트에서 잘 동작한다면 이를 통과시키는 것은 필수가 아니지만, 일부 버그를 찾는 데 도움이 되므로 작은 테스터를 공유해 드렸습니다.

중요한 것은 내구성입니다. 여러분의 서버는 절대로 다운되지 않아야 합니다.

하나의 프로그램으로만 테스트하지 마십시오. Python, Golang 또는 C나 C++과 같은 더 편리한 언어로 테스트를 작성하십시오.

추가 요구사항

추가 기능으로 다음을 추가할 수 있습니다:
• 쿠키 및 세션 관리 지원 (간단한 예제 준비).
• 여러 CGI 처리.
보너스 부분은 필수 부분이 완벽하게 완료되고 정상적으로 작동할 때만 평가됩니다.
완벽하다는 것은 필수 부분이 완벽하게 수행되고 잘못이 없이 작동한다는 것을 의미합니다.
필수 요구 사항을 모두 통과하지 않은 경우 보너스 부분은 전혀 평가되지 않습니다.

사용 가능 함수

Everything in C++ 98.
execve, dup, dup2, pipe, strerror, gai_strerror,
errno, dup, dup2, fork, socketpair, htons, htonl,
ntohs, ntohl, select, poll, epoll (epoll_create,
epoll_ctl, epoll_wait), kqueue (kqueue, kevent),
socket, accept, listen, send, recv, chdir bind,
connect, getaddrinfo, freeaddrinfo, setsockopt,
getsockname, getprotobyname, fcntl, close, read,
write, waitpid, kill, signal, access, stat, open,
opendir, readdir and closedir.

의견 (선택 사항)

자유롭게 서로에게 도움이 될 문서나 의견을 나눌 것에 대해 말씀해주세요.

Metadata

Metadata

Labels

discurssion논의가 필요합니다.documentationImprovements or additions to documentation

Type

No type

Projects

Status

Discurssion

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions