NGINX 2.0是一款尖端的,事件驅動的Web服務器,其核心均採用效率,可擴展性和HTTP協議合規性。受原始NGINX體系結構的啟發,我們的目標是創建與其性能,靈活性和易用性相匹配的Web服務器。 NGINX 2.0通過我自己和Tukka的協作努力開發,體現了我們對創新的承諾,為靜態和動態Web內容提供了強大的平台,可針對現代的Web應用程序和服務進行了優化。
我們開發NGINX 2.0的旅程是由對創新,性能和對Web服務技術卓越的追求的承諾所驅動的。在這裡,我們深入研究了體現我們的野心和技術實力的核心功能,展示了我們在重新定義現代Web服務器功能方面所取得的進步。
在製作NGINX 2.0中,我們優先遵守對HTTP/1.1標準的嚴格依從性,以確保我們的服務器強大地支持基本的HTTP方法,例如GET,HEAD,POST,POST和DELETE。這項承諾不僅符合我們的廣泛兼容性目標,而且還反映了我們致力於為網絡服務提供堅實,可靠的基礎。
Web服務器配置的複雜性和多樣性使我們實現了遞歸下降解析器,反映了Nginx中看到的層次模型。該策略增強了配置管理,使其直觀且易於管理,同時保留了複雜設置所需的靈活性。
了解服務器運行的各種環境,我們為I/O多路復用開發了一個自定義抽象層,該層與Kqueue(MacOS)和Epoll(Linux)無縫集成。這種跨平台方法證明了我們致力於在不同系統上優化性能的承諾,從而確保NGINX 2.0在各種操作條件下有效地執行。
在NGINX 2.0如何處理大型響應和視頻流中,我們對效率和性能的關注尤其明顯。通過支持傳輸編碼:塊和範圍請求,我們優化了大型內容的交付,確保了最少的資源使用情況,同時保持平穩,不間斷的視頻播放。此功能是我們致力於增強用戶體驗的直接結果,並通過創新解決方案解決了內容交付方面的共同挑戰。
為了將服務器的功能擴展到服務靜態內容之外,我們將綜合CGI支持集成到NGINX 2.0中。這允許執行用於動態內容生成和形式處理的外部程序以及其他任務。這種集成反映了我們對可以滿足廣泛Web應用程序需求的多功能Web服務器的願景,從而提供了開發交互式,個性化的Web體驗所需的靈活性。
NGINX 2.0中可配置的記錄框架的開發源於我們認識到記錄在理解和優化服務器操作中扮演的關鍵作用。通過實現支持多個日誌級別並允許對日誌輸出的動態配置的系統,我們為自己提供了一種強大的工具來監視,調試和改善服務器性能。該框架體現了我們對透明和控制的承諾,以確保我們始終可以對服務器的健康和效率保持一致。
歡迎使用NGINX 2.0,這是一款旨在效率,可擴展性和符合HTTP/1.1標準的事件驅動的Web服務器。本指南將引導您完成在系統上安裝和構建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 prod運行NGINX 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中可用的指令,其適用上下文,驗證策略和用法示例。這種結構化方法可確保清楚地了解如何有效配置您的Web服務器。
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;
}該指令重定向/oldpage請求 /舊頁面,使用301狀態代碼的新URL,表明永久重定向。
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的知識,以確保您的Web服務器是根據您的特定要求和操作上下文量身定制的。
以下是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
該結構旨在提高可維護性和可擴展性,以確保任何人都可以輕鬆導航並為項目做出貢獻。
為了進一步探索和掌握Web服務器開發,網絡和編程概念,我們建議以下策劃的資源列表:
select() - 了解select()系統調用以進行多路復用。select() - 深入研究非阻滯I/O操作以及select()的使用。特別感謝Abdelaziz Eroui關於TCP/IP和插座編程的信息演講,這是丟失學期系列的一部分,該課程深入洞悉了對我們項目成功至關重要的網絡基礎。
我們還要對Mehdi Cheracher的網絡和異步編程的演講表示感謝。他的教義有助於指導我們有效地處理網絡通信的方法。
他們對該領域的貢獻和對教育的奉獻精神對我們的項目和更廣泛的社區都是無價的。
我們非常歡迎社區的捐款,並很高興能讓您加入我們改進Nginx 2.0!無論您是修復錯誤,添加新功能還是改進文檔,您的貢獻對於使每個人的Nginx 2.0更好。
如果您有任何疑問或需要幫助,請隨時通過打開問題來伸出援手。我們在這里為您提供幫助,並期待您的貢獻!