NGINX 2.0은 효율성, 확장 성 및 HTTP 프로토콜 준수로 설계된 최첨단 이벤트 중심 웹 서버입니다. 원래 Nginx 아키텍처에서 영감을 얻은 우리의 목표는 전임자와 성능, 유연성 및 사용 편의성에 일치하는 웹 서버를 만드는 것이 었습니다. 나 자신과 Tukka의 공동 노력을 통해 개발 된 Nginx 2.0은 혁신에 대한 우리의 약속을 구현하여 현대 웹 애플리케이션 및 서비스에 최적화 된 정적 및 동적 웹 컨텐츠에 대한 강력한 플랫폼을 제공합니다.
NGINX 2.0을 개발하기위한 우리의 여정은 웹 서비스 기술의 혁신, 성능 및 우수성 추구에 대한 헌신에 의해 주도되었습니다. 여기서, 우리는 야망과 기술적 능력을 구현하는 핵심 기능을 탐구하여 현대 웹 서버의 기능을 재정의하는 데있어 우리가 만든 진전을 보여줍니다.
Nginx 2.0을 제작할 때 HTTP/1.1 표준에 대한 엄격한 준수 우선 순위를 우선시하여 서버가 Get, Head, Post 및 Delete와 같은 필수 HTTP 방법을 강력하게 지원할 수 있도록합니다. 이 약속은 광범위한 호환성에 대한 우리의 목표와 일치 할뿐만 아니라 웹 서빙을위한 견고하고 신뢰할 수있는 토대를 제공하기위한 우리의 헌신을 반영합니다.
웹 서버 구성의 복잡성과 다양성으로 인해 우리는 재귀 하강 파서를 구현하여 Nginx에서 볼 수있는 계층 적 모델을 반영하게 만들었습니다. 이 전략은 구성 관리를 향상시켜 복잡한 설정에 필요한 유연성을 유지하면서 직관적이고 관리 가능합니다.
서버가 작동하는 다양한 환경을 이해하면 Kqueue (MACOS) 및 Epoll (Linux)과 완벽하게 통합되는 I/O 멀티플렉싱 용 사용자 정의 추상화 레이어를 개발했습니다. 이 크로스 플랫폼 접근 방식은 다양한 시스템에서 성능을 최적화하려는 우리의 약속에 대한 증거입니다.
효율성과 성능에 중점을 둔 Nginx 2.0이 큰 응답과 비디오 스트리밍을 처리하는 방법에서 특히 분명합니다. 전송 인코딩을 지원함으로써 Chunked 및 Range 요청을 지원함으로써 대규모 콘텐츠의 전달을 최적화하여 원활하고 중단되지 않은 비디오 재생을 유지하면서 최소한의 리소스 사용량을 보장했습니다. 이 기능은 사용자 경험을 향상시키기위한 헌신의 직접적인 결과입니다. 혁신적인 솔루션으로 콘텐츠 제공의 일반적인 과제를 해결합니다.
정적 컨텐츠를 제공하는 것 외에 서버의 기능을 확장하기 위해 포괄적 인 CGI 지원을 NGINX 2.0에 통합했습니다. 이를 통해 동적 컨텐츠 생성 및 양식 처리를위한 외부 프로그램을 실행할 수 있습니다. 이 통합은 광범위한 웹 애플리케이션 요구 사항을 충족시킬 수있는 다재다능한 웹 서버에 대한 비전을 반영하여 대화식 개인 웹 응용 프로그램 요구 사항을 개발하는 데 필요한 유연성을 제공합니다.
NGINX 2.0 내에서 구성 가능한 로깅 프레임 워크의 개발은 서버 작업을 이해하고 최적화하는 데있어 로깅이 수행하는 중요한 역할에 대한 인식에서 비롯됩니다. 여러 로그 레벨을 지원하고 로그 출력의 동적 구성을 허용하는 시스템을 구현함으로써 우리는 모니터링, 디버깅 및 서버 성능 향상을위한 강력한 도구를 제공했습니다. 이 프레임 워크는 투명성과 제어에 대한 우리의 약속을 구현하여 서버의 건강과 효율성에 항상 펄스를 유지할 수 있도록합니다.
효율성, 확장 성 및 HTTP/1.1 표준 준수를 위해 설계된 이벤트 중심 웹 서버 인 Nginx 2.0에 오신 것을 환영합니다. 이 안내서는 시스템에 Nginx 2.0을 설치하고 구축하는 단계를 안내합니다.
시작하기 전에 시스템이 다음 요구 사항을 충족하는지 확인하십시오.
Nginx 2.0은 소스에서 건축하기 위해 makefile을 사용합니다. 다음 단계를 따라 저장소를 복제하고 서버를 구축하십시오.
저장소를 복제하십시오
Nginx 2.0 저장소를 로컬 컴퓨터로 복제하여 시작하십시오.
git clone https://github.com/anassajaanan/Nginx-2.0
cd nginx-2.0프로젝트를 구축하십시오
개발을위한 디버그 및 생산 릴리스 디버그로 프로젝트를 구축 할 수 있습니다.
디버그 빌드 :
디버그 빌드에는 추가 디버그 기호가 포함되며 개발 및 테스트 목적으로 주소 및 정의되지 않은 동작 소독제 (MACOS) 또는 강력한 보호 및 오버 플로우 체크 (Linux)로 컴파일됩니다.
make debug릴리스 빌드 :
릴리스 빌드는 -O3 최적화, 기본 아키텍처 타겟팅 및 링크 시간 최적화로 성능에 최적화되었습니다. 배포 권장 구성입니다.
make prodNginx 2.0 실행
서버를 시작하려면 원하는 경우 구성 파일 경로를 지정하십시오. 경로가 제공되지 않으면 서버는 [conf/nginx.conf] 에있는 기본 구성을 사용합니다.
./webserver [configfile_path] # For release build [configfile_path] 구성 파일의 경로로 바꾸십시오. 생략하면 Nginx 2.0은 기본 구성을 사용합니다.
디버그 빌드의 경우 :
./webserver_debug [configfile_path] # For debug build 구축 아티팩트를 정리하고 신선하게 시작하려면 clean 또는 fclean 명령을 사용하십시오.
깨끗한 물체 및 종속성 :
make clean완전히 깨끗한 (바이너리 포함) :
make fcleanValgrind 메모리 검사 :
Linux 사용자의 경우 Valgrind로 디버그 빌드를 실행하여 메모리 누출을 확인하십시오.
make valgrind이 작업을 위해 Valgrind가 시스템에 설치되어 있는지 확인하십시오.
이 섹션에서는 NGINX 2.0에서 사용 가능한 지침, 해당 컨텍스트, 검증 정책 및 사용 예제를 간략하게 설명합니다. 이 구조화 된 접근 방식은 웹 서버를 효과적으로 구성하는 방법에 대한 명확한 이해를 보장합니다.
root 컨텍스트 허용 : server , location
유효성 검사 정책 : 맥락에서 고유해야합니다.
예:
server {
root /var/www/html; # Document root
}listen 컨텍스트 허용 : server
유효성 검사 정책 : 맥락에서 고유해야합니다.
예:
server {
listen 8080 ; # Server listens on port 8080
}autoindex 컨텍스트 허용 : server , location
유효성 검사 정책 : 맥락에서 고유해야합니다.
예:
location /images {
autoindex on ; # Enables directory listing
}server_name 컨텍스트 허용 : server
유효성 검사 정책 : 맥락에서 고유해야합니다.
예:
server {
server_name example.com;
}client_max_body_size 허용되는 컨텍스트 : http , server
유효성 검사 정책 : 맥락에서 고유해야합니다.
예:
http {
client_max_body_size 20M ; # Limits request body size
}error_page 허용되는 컨텍스트 : http , server , location
검증 정책 : 두 개 이상의 인수를 지원합니다.
예:
server {
error_page 404 /404.html;
}try_files 컨텍스트 허용 : server , location
유효성 검사 정책 : 상황 내에서 고유해야하며 둘 이상의 인수를 지원해야합니다. 마지막 주장은 폴백으로 취급됩니다.
예:
location / {
try_files $uri $uri / /index.html;
}index 허용되는 컨텍스트 : http , server , location
검증 정책 : 하나 이상의 인수를 지원합니다. 서버는 첫 번째 발견 된 파일을 인덱스로 사용합니다. 마지막 주장은 슬래시로 시작하면 폴백으로 취급됩니다. 색인이 없으면 디렉토리 목록이 표시됩니다.
예:
location / {
index index.html index.htm /fallback;
}return 컨텍스트 허용 : server , location
유효성 검사 정책 : 미리 정의 된 상태 메시지를 반환하기위한 상태 코드로 하나의 인수를 지원하거나 첫 번째는 상태 코드이고 두 번째는 지체로 리디렉션 또는 텍스트를 반환 할 URL입니다. 리디렉션에 사용될 때 공통 상태 코드는 301 (영구 리디렉션) 또는 302 (임시 리디렉션)입니다.
예 1 : 텍스트로 상태 코드 반환 :
location /gone {
return 410 "The resource is no longer available" ;
}이 구성은 리소스를 더 이상 사용할 수 없음을 나타내는 사용자 정의 메시지와 함께 410 상태 코드를 반환합니다.
예제 2 : 리디렉션 :
location /oldpage {
return 301 http://example.com/newpage;
} 이 지침은 301 상태 코드가있는 새 URL에 /oldpage 요청을 리디렉션하여 영구 리디렉션을 나타냅니다.
limit_except 컨텍스트 허용 : location
유효성 검사 정책 : 문맥 내에서 고유해야하며 허용 된 HTTP 방법을 지정하기 위해 하나 이상의 인수를 지원합니다.
예 : 이 지시문은 /api 종점을 얻고 게시 할 수있는 허용 된 방법을 제한하여 다른 모든 방법을 거부합니다.
location /api {
limit_except GET POST;
}keepalive_timeout 허용되는 컨텍스트 : http , server
유효성 검사 정책 : 맥락에서 고유해야합니다.
예:
server {
keepalive_timeout 15 ; # Keep connections alive for 15 seconds
}cgi_extension 컨텍스트 허용 : server
검증 정책 : 맥락에서 고유해야하며 하나 이상의 인수를 지원해야합니다. CGI 스크립트로 취급 할 파일 확장자를 지정합니다.
예:
server {
cgi_extension .cgi .pl .py .sh .extension; # Handle .cgi .pl .py files as CGI scripts
}이 포괄적 인 예제는 중첩 된 컨텍스트 및 다중 지침이있는 서버 설정을 보여 주며 Nginx 2.0에 대한 사실적인 구성을 보여줍니다.
http {
client_max_body_size 20M ; # Apply to all servers
keepalive_timeout 15 ; # Connection keep-alive timeout
server {
listen 8080 ;
server_name localhost;
root /var/www/example;
index index.html index.htm index.php;
# Serve static files directly
location / {
try_files $uri $uri / /fallback;
}
# Enable directory listing for /images
location /images {
autoindex on ;
root /var/www/example;
}
# Custom error pages
error_page 404 /404.html;
error_page 500 502 /50x.html;
# API endpoint with method restrictions
location /api {
limit_except GET POST DELETE;
}
# CGI script execution for specific extensions
cgi_extension .cgi .pl;
}
}
이 안내서와 예제는 Nginx 2.0을 효과적으로 구성 할 수있는 지식을 갖추어 웹 서버가 특정 요구 사항 및 운영 상황에 맞게 조정되도록해야합니다.
아래는 NGINX 2.0 프로젝트 구조에 대한 개요로 코드베이스 구성에 대한 통찰력과 각 디렉토리 및 키 파일의 목적을 제공합니다.
/web-server-project
├── src # Source files
│ ├── config # Configuration-related classes and files
│ │ ├── BaseConfig.cpp
│ │ ├── BaseConfig.hpp
│ │ ├── LocationConfig.cpp
│ │ ├── LocationConfig.cpp
│ │ ├── MimeTypeConfig.cpp
│ │ ├── MimeTypeConfig.hpp
│ │ ├── ReturnDirective.cpp
│ │ ├── ReturnDirective.hpp
│ │ ├── ServerConfig.cpp
│ │ ├── ServerConfig.hpp
│ │ ├── TryFilesDirective.cpp
│ │ └── TryFilesDirective.hpp
│ │
│ ├── cgi # CGI handling classes
│ │ ├── CgiDirective.hpp
│ │ ├── CgiDirective.cpp
│ │ ├── CgiHandler.hpp
│ │ └── CgiHandler.cpp
│ │
│ ├── http # HTTP protocol handling classes
│ │ ├── HttpRequest.hpp
│ │ ├── HttpRequest.cpp
│ │ ├── HttpResponse.hpp
│ │ ├── HttpResponse.cpp
│ │ ├── HttpRequest.cpp
│ │ ├── RequestHandler.hpp
│ │ └── RequestHandler.cpp
│ │
│ ├── logging # Logging functionality
│ │ ├── Logger.hpp
│ │ └── Logger.cpp
│ │
│ ├── parsing # Dedicated parsing logic
│ │ ├── ConfigLoader.cpp
│ │ ├── ConfigLoader.hpp
│ │ ├── ConfigNode.cpp
│ │ ├── ConfigNode.hpp
│ │ ├── ConfigParser.cpp
│ │ ├── ConfigParser.hpp
│ │ ├── ConfigTokenizer.cpp
│ │ ├── ConfigTokenizer.hpp
│ │ ├── ContextNode.cpp
│ │ ├── ContextNode.hpp
│ │ ├── DirectiveNode.cpp
│ │ ├── DirectiveNode.hpp
│ │ ├── LogicValidator.cpp
│ │ ├── LogicValidator.hpp
│ │ ├── MimeTypeParser.cpp
│ │ ├── MimeTypeParser.hpp
│ │ ├── SyntaxValidator.cpp
│ │ ├── SyntaxValidator.hpp
│ │ ├── TreeBuilder.cpp
│ │ └── TreeBuilder.hpp
│ │
│ ├── event_polling # Abstraction over kqueue and Epoll
│ │ ├── EpollManager.cpp
│ │ ├── EpollManager.hpp
│ │ ├── EventPoller.cpp
│ │ ├── EventPoller.hpp
│ │ ├── KqueueManager.cpp
│ │ └── KqueueManager.hpp
│ │
│ ├── server # Core server functionality
│ │ ├── ClientState.cpp
│ │ ├── ClientState.hpp
│ │ ├── ResponseState.cpp
│ │ ├── ResponseState.hpp
│ │ ├── Server.cpp
│ │ ├── Server.hpp
│ │ ├── ServerManager.cpp
│ │ └── ServerManager.hpp
│ │
│ └── main.cpp # Entry point of the application
│
├── conf # Configuration files (e.g., nginx.conf, mime.types)
├── content # Static content served by the server
├── logs # Log files generated by the server
├── uploads # Directory for handling uploaded files
└── Makefile # Build instructions for your project
이 구조는 유지 보수 및 확장 성을 향상시켜 누구나 프로젝트에 쉽게 탐색하고 기여할 수 있도록 설계되었습니다.
웹 서버 개발, 네트워킹 및 프로그래밍 개념의 추가 탐색 및 숙달을 돕기 위해 다음과 같은 선별 된 리소스 목록을 권장합니다.
select() 설명 - select() 시스템을 이해하기 위해 멀티플렉싱을 요청합니다.select() - 비 블로킹 I/O 작업 및 select() 사용에 대한 깊은 다이빙.TCP/IP 및 소켓 프로그래밍에 대한 유익한 강의 인 Abdelaziz Eroui에게 특별한 감사를드립니다.
우리는 또한 네트워킹 및 비동기 프로그래밍에 대한 강의에 대해 Mehdi Cheracher에게 감사를 표하고 싶습니다. 그의 가르침은 네트워크 통신을 효율적으로 처리하기위한 우리의 접근 방식을 안내하는 데 도움이되었습니다.
분야에 대한 그들의 기여와 교육에 대한 헌신은 우리 프로젝트와 더 넓은 지역 사회 모두에게 귀중했습니다.
우리는 지역 사회의 기여를 따뜻하게 환영하며 Nginx 2.0을 개선하는 데 우리와 함께하게되어 기쁩니다! 버그를 고치거나 새로운 기능을 추가하거나 문서화 개선에 관계없이 모든 사람에게 Nginx 2.0을 더 좋게 만드는 데 기여하는 것이 매우 중요합니다.
궁금한 점이 있거나 도움이 필요한 경우 문제를 열어 자유롭게 연락하십시오. 우리는 당신의 기여를 도와주고 기대합니다!