NGINX 2.0 เป็นเว็บเซิร์ฟเวอร์ที่ใช้งานได้อย่างทันสมัยซึ่งได้รับการออกแบบมาพร้อมกับประสิทธิภาพความสามารถในการปรับขนาดและการปฏิบัติตามโปรโตคอล HTTP ที่แกนกลาง แรงบันดาลใจจากสถาปัตยกรรม Nginx ดั้งเดิมเป้าหมายของเราคือการสร้างเว็บเซิร์ฟเวอร์ที่ตรงกับรุ่นก่อนในด้านประสิทธิภาพความยืดหยุ่นและความสะดวกในการใช้งาน ได้รับการพัฒนาผ่านความพยายามร่วมกันของตัวเองและ Tukka, Nginx 2.0 รวบรวมความมุ่งมั่นของเราในการสร้างสรรค์นวัตกรรมนำเสนอแพลตฟอร์มที่แข็งแกร่งสำหรับเนื้อหาเว็บแบบคงที่และแบบไดนามิกที่ได้รับการปรับให้เหมาะสมสำหรับเว็บแอปพลิเคชันและบริการที่ทันสมัย
การเดินทางของเราในการพัฒนา Nginx 2.0 ได้รับแรงผลักดันจากความมุ่งมั่นในการสร้างนวัตกรรมประสิทธิภาพและการแสวงหาความเป็นเลิศในเทคโนโลยีการให้บริการเว็บ ที่นี่เราเจาะลึกคุณสมบัติหลักที่รวบรวมความทะเยอทะยานและความกล้าหาญทางเทคนิคของเราแสดงให้เห็นถึงความก้าวหน้าที่เราได้ทำในการนิยามความสามารถของเว็บเซิร์ฟเวอร์ที่ทันสมัย
ในการสร้าง Nginx 2.0 เราจัดลำดับความสำคัญการยึดมั่นอย่างเข้มงวดกับมาตรฐาน HTTP/1.1 เพื่อให้แน่ใจว่าเซิร์ฟเวอร์ของเราสนับสนุนวิธีการ HTTP ที่จำเป็นเช่น Get, Head, Post และ Delete ความมุ่งมั่นนี้ไม่เพียง แต่สอดคล้องกับเป้าหมายของเราสำหรับความเข้ากันได้ในวงกว้าง แต่ยังสะท้อนให้เห็นถึงความทุ่มเทของเราในการให้รากฐานที่มั่นคงและเชื่อถือได้สำหรับการให้บริการเว็บ
ความซับซ้อนและความหลากหลายของการกำหนดค่าเว็บเซิร์ฟเวอร์ทำให้เราสามารถใช้ตัวแยกวิเคราะห์การสืบเชื้อสายแบบเรียกซ้ำได้โดยมิเรอร์โมเดลลำดับชั้นที่เห็นใน Nginx กลยุทธ์นี้ช่วยเพิ่มการจัดการการกำหนดค่าทำให้ใช้งานง่ายและจัดการได้ในขณะที่รักษาความยืดหยุ่นที่จำเป็นสำหรับการตั้งค่าที่ซับซ้อน
การทำความเข้าใจกับสภาพแวดล้อมที่หลากหลายที่เซิร์ฟเวอร์ของเราทำงานเราได้พัฒนาเลเยอร์นามธรรมที่กำหนดเองสำหรับมัลติเพล็กซ์ I/O ที่รวมเข้ากับทั้ง Kqueue (MacOS) และ Epoll (Linux) วิธีการข้ามแพลตฟอร์มนี้เป็นเครื่องพิสูจน์ถึงความมุ่งมั่นของเราในการเพิ่มประสิทธิภาพประสิทธิภาพในระบบที่แตกต่างกันเพื่อให้มั่นใจว่า Nginx 2.0 ทำงานได้อย่างมีประสิทธิภาพภายใต้สภาวะการปฏิบัติงานที่หลากหลาย
เรามุ่งเน้นไปที่ประสิทธิภาพและประสิทธิภาพที่เห็นได้ชัดโดยเฉพาะอย่างยิ่งในการที่ Nginx 2.0 จัดการการตอบสนองขนาดใหญ่และการสตรีมวิดีโอ ด้วยการสนับสนุนการเข้ารหัสการถ่ายโอน: คำขอแบบ chunked และช่วงเราได้ปรับการส่งมอบเนื้อหาขนาดใหญ่ให้เหมาะสมเพื่อให้มั่นใจว่าการใช้ทรัพยากรน้อยที่สุดในขณะที่ยังคงเล่นวิดีโอที่ราบรื่นและไม่หยุดชะงัก คุณลักษณะนี้เป็นผลลัพธ์โดยตรงของการอุทิศตนของเราเพื่อเพิ่มประสบการณ์ผู้ใช้โดยจัดการกับความท้าทายทั่วไปในการส่งเนื้อหาด้วยโซลูชั่นที่เป็นนวัตกรรม
เพื่อขยายขีดความสามารถของเซิร์ฟเวอร์นอกเหนือจากการให้บริการเนื้อหาคงที่เราได้รวมการสนับสนุน CGI ที่ครอบคลุมเข้ากับ Nginx 2.0 สิ่งนี้ช่วยให้การดำเนินการโปรแกรมภายนอกสำหรับการสร้างเนื้อหาแบบไดนามิกและการประมวลผลแบบฟอร์มท่ามกลางงานอื่น ๆ การรวมนี้สะท้อนให้เห็นถึงวิสัยทัศน์ของเราสำหรับเว็บเซิร์ฟเวอร์อเนกประสงค์ที่สามารถตอบสนองความต้องการเว็บแอปพลิเคชันที่หลากหลายซึ่งนำเสนอความยืดหยุ่นที่จำเป็นสำหรับการพัฒนาประสบการณ์เว็บแบบโต้ตอบและเป็นส่วนตัว
การพัฒนาเฟรมเวิร์กการบันทึกที่กำหนดค่าได้ภายใน NGINX 2.0 เกิดจากการรับรู้ของเราเกี่ยวกับบทบาทที่สำคัญที่การเข้าสู่ระบบเล่นในการทำความเข้าใจและเพิ่มประสิทธิภาพการทำงานของเซิร์ฟเวอร์ ด้วยการใช้ระบบที่รองรับหลายระดับบันทึกและอนุญาตให้กำหนดค่าแบบไดนามิกของเอาต์พุตบันทึกเราได้จัดเตรียมเครื่องมือที่ทรงพลังสำหรับการตรวจสอบการดีบักและปรับปรุงประสิทธิภาพของเซิร์ฟเวอร์ เฟรมเวิร์กนี้รวบรวมความมุ่งมั่นของเราต่อความโปร่งใสและการควบคุมเพื่อให้แน่ใจว่าเราสามารถรักษาพัลส์ต่อสุขภาพและประสิทธิภาพของเซิร์ฟเวอร์ได้เสมอ
ยินดีต้อนรับสู่ Nginx 2.0 เว็บเซิร์ฟเวอร์ที่ขับเคลื่อนด้วยเหตุการณ์ที่ออกแบบมาเพื่อประสิทธิภาพความสามารถในการปรับขนาดและการปฏิบัติตามมาตรฐาน HTTP/1.1 คู่มือนี้จะนำคุณผ่านขั้นตอนในการติดตั้งและสร้าง Nginx 2.0 บนระบบของคุณ
ก่อนที่คุณจะเริ่มตรวจสอบให้แน่ใจว่าระบบของคุณตรงตามข้อกำหนดดังต่อไปนี้:
Nginx 2.0 ใช้ makefile สำหรับการสร้างจากแหล่งที่มา ทำตามขั้นตอนเหล่านี้เพื่อโคลนที่เก็บและสร้างเซิร์ฟเวอร์:
โคลนที่เก็บ
เริ่มต้นด้วยการโคลนที่เก็บ Nginx 2.0 ไปยังเครื่องในพื้นที่ของคุณ:
git clone https://github.com/anassajaanan/Nginx-2.0
cd nginx-2.0สร้างโครงการ
คุณสามารถสร้างโครงการในสองการกำหนดค่า: การดีบัก สำหรับการพัฒนาและ การเปิดตัว สำหรับการผลิต
ดีบั๊กบิลด์:
การดีบักบิลด์รวมถึงสัญลักษณ์ดีบั๊กเพิ่มเติมและรวบรวมด้วยที่อยู่และ sanitizers พฤติกรรมที่ไม่ได้กำหนด (บน 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 fcleanตรวจสอบหน่วยความจำ Valgrind:
สำหรับผู้ใช้ Linux ให้เรียกใช้ Build Debug ของคุณด้วย 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;
} คำสั่งนี้เปลี่ยนเส้นทางการร้องขอ /oldpage ไปยัง URL ใหม่ที่มีรหัสสถานะ 301 ซึ่งบ่งบอกถึงการเปลี่ยนเส้นทางถาวร
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 ซึ่งให้ข้อมูลเชิงลึกเกี่ยวกับองค์กรของ Codebase และวัตถุประสงค์ของแต่ละไดเรกทอรีและไฟล์คีย์:
/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()ขอขอบคุณเป็นพิเศษไปยัง Abdelaziz Eroui สำหรับการบรรยายข้อมูลของเขาเกี่ยวกับการเขียนโปรแกรม TCP/IP และซ็อกเก็ตซึ่งเป็นส่วนหนึ่งของซีรี่ส์ภาคการศึกษาที่หายไปซึ่งให้ข้อมูลเชิงลึกเกี่ยวกับพื้นฐานของเครือข่ายที่สำคัญต่อความสำเร็จของโครงการของเรา
นอกจากนี้เรายังขอแสดงความขอบคุณต่อ Mehdi Cheracher สำหรับการบรรยายของเขาในการสร้างเครือข่ายและการเขียนโปรแกรมแบบอะซิงโครนัส คำสอนของเขามีประโยชน์ในการชี้นำวิธีการของเราในการจัดการการสื่อสารเครือข่ายอย่างมีประสิทธิภาพ
การมีส่วนร่วมของพวกเขาในสาขาและการอุทิศตนเพื่อการศึกษาเป็นสิ่งที่มีค่าสำหรับทั้งโครงการของเราและชุมชนที่กว้างขึ้น
เรายินดีต้อนรับการมีส่วนร่วมอย่างอบอุ่นจากชุมชนและตื่นเต้นที่ได้เข้าร่วมกับเราในการปรับปรุง Nginx 2.0! ไม่ว่าคุณจะแก้ไขข้อบกพร่องการเพิ่มคุณสมบัติใหม่หรือการปรับปรุงเอกสารการมีส่วนร่วมของคุณมีค่ามากในการทำให้ Nginx 2.0 ดีขึ้นสำหรับทุกคน
หากคุณมีคำถามใด ๆ หรือต้องการความช่วยเหลืออย่าลังเลที่จะติดต่อด้วยการเปิดปัญหา เราอยู่ที่นี่เพื่อช่วยเหลือและหวังว่าจะได้รับการช่วยเหลือจากคุณ!