Nginx 2.0 adalah server web cutting-edge, berbasis peristiwa yang dirancang dengan efisiensi, skalabilitas, dan kepatuhan protokol HTTP pada intinya. Terinspirasi oleh arsitektur NGINX asli, tujuan kami adalah membuat server web yang cocok dengan pendahulunya dalam kinerja, fleksibilitas, dan kemudahan penggunaan. Dikembangkan melalui upaya kolaboratif dari diri saya dan Tukka, Nginx 2.0 mewujudkan komitmen kami terhadap inovasi, menawarkan platform yang kuat untuk konten web statis dan dinamis, dioptimalkan untuk aplikasi dan layanan web modern.
Perjalanan kami dalam mengembangkan NGINX 2.0 telah didorong oleh komitmen terhadap inovasi, kinerja, dan pengejaran keunggulan dalam teknologi pelayanan web. Di sini, kami mempelajari fitur -fitur inti yang mewujudkan ambisi dan kecakapan teknis kami, menampilkan langkah yang kami buat dalam mendefinisikan kembali kemampuan server web modern.
Dalam Crafting Nginx 2.0, kami memprioritaskan kepatuhan yang ketat terhadap standar HTTP/1.1, memastikan server kami secara kuat mendukung metode HTTP penting seperti GET, HEAD, POST, dan DELETE. Komitmen ini tidak hanya selaras dengan tujuan kami untuk kompatibilitas luas tetapi juga mencerminkan dedikasi kami untuk memberikan fondasi yang solid dan andal untuk melayani web.
Kompleksitas dan keragaman konfigurasi server web membuat kami menerapkan parser keturunan rekursif, mencerminkan model hierarkis yang terlihat di Nginx. Strategi ini meningkatkan manajemen konfigurasi, menjadikannya intuitif dan dapat dikelola sambil menjaga fleksibilitas yang dibutuhkan untuk pengaturan yang kompleks.
Memahami lingkungan yang beragam di mana server kami beroperasi, kami mengembangkan lapisan abstraksi khusus untuk multiplexing I/O yang terintegrasi dengan mulus dengan kqueue (macOS) dan Epoll (Linux). Pendekatan lintas platform ini adalah bukti komitmen kami untuk mengoptimalkan kinerja di berbagai sistem, memastikan NGINX 2.0 melakukan secara efisien di bawah berbagai kondisi operasional.
Fokus kami pada efisiensi dan kinerja sangat jelas dalam bagaimana Nginx 2.0 menangani respons besar dan streaming video. Dengan mendukung pengkodean transfer: permintaan yang dipotong dan jangkauan, kami telah mengoptimalkan pengiriman konten besar, memastikan penggunaan sumber daya minimal sambil mempertahankan pemutaran video yang halus dan tidak terputus. Fitur ini adalah hasil langsung dari dedikasi kami untuk meningkatkan pengalaman pengguna, mengatasi tantangan umum dalam pengiriman konten dengan solusi inovatif.
Untuk memperluas kemampuan server di luar melayani konten statis, kami mengintegrasikan dukungan CGI komprehensif ke Nginx 2.0. Ini memungkinkan untuk pelaksanaan program eksternal untuk pembuatan konten dinamis dan pemrosesan bentuk, di antara tugas -tugas lainnya. Integrasi ini mencerminkan visi kami untuk server web serba guna yang dapat memenuhi berbagai persyaratan aplikasi web, menawarkan fleksibilitas yang diperlukan untuk mengembangkan pengalaman web interaktif dan personalisasi.
Pengembangan kerangka logging yang dapat dikonfigurasi dalam Nginx 2.0 berasal dari pengakuan kami tentang peran penting yang dimainkan logging dalam memahami dan mengoptimalkan operasi server. Dengan mengimplementasikan sistem yang mendukung beberapa level log dan memungkinkan konfigurasi dinamis output log, kami telah memberikan alat yang kuat untuk memantau, men -debug, dan meningkatkan kinerja server. Kerangka kerja ini mewujudkan komitmen kami terhadap transparansi dan kontrol, memastikan bahwa kami selalu dapat menjaga denyut nadi pada kesehatan dan efisiensi server.
Selamat datang di NGINX 2.0, server web yang digerakkan oleh acara yang dirancang untuk efisiensi, skalabilitas, dan kepatuhan dengan standar HTTP/1.1. Panduan ini akan memandu Anda melalui langkah -langkah untuk menginstal dan membangun Nginx 2.0 di sistem Anda.
Sebelum Anda mulai, pastikan sistem Anda memenuhi persyaratan berikut:
Nginx 2.0 menggunakan makefile untuk membangun dari sumber. Ikuti langkah -langkah ini untuk mengkloning repositori dan membangun server:
Klon Repositori
Mulailah dengan mengkloning repositori Nginx 2.0 ke mesin lokal Anda:
git clone https://github.com/anassajaanan/Nginx-2.0
cd nginx-2.0Membangun proyek
Anda dapat membangun proyek dalam dua konfigurasi: Debug untuk pengembangan dan rilis untuk produksi.
Debug Build:
Debug build mencakup simbol debug tambahan dan disusun dengan alamat dan pembersih perilaku yang tidak ditentukan (pada macOS) atau dengan perlindungan yang kuat dan pemeriksaan overflow (di Linux) untuk tujuan pengembangan dan pengujian.
make debugBangun rilis:
Bangunan rilis dioptimalkan untuk kinerja dengan optimasi -O3 , penargetan arsitektur asli, dan optimasi waktu tautan. Ini adalah konfigurasi yang disarankan untuk penyebaran.
make prodMenjalankan Nginx 2.0
Untuk memulai server, tentukan jalur file konfigurasi jika diinginkan. Jika tidak ada jalur yang disediakan, server akan menggunakan konfigurasi default yang terletak di [conf/nginx.conf]
./webserver [configfile_path] # For release build Ganti [configfile_path] dengan jalur ke file konfigurasi Anda. Jika dihilangkan, Nginx 2.0 akan menggunakan konfigurasi default.
Untuk pembangunan debug:
./webserver_debug [configfile_path] # For debug build Untuk membersihkan artefak dan mulai segar, gunakan perintah clean atau fclean :
Objek dan dependensi bersih:
make cleanClean penuh (termasuk binari):
make fcleanPemeriksaan Memori Valgrind:
Untuk pengguna Linux, jalankan Debug Build Anda dengan Valgrind untuk memeriksa kebocoran memori:
make valgrindPastikan Valgrind diinstal pada sistem Anda agar ini berfungsi.
Bagian ini menguraikan arahan yang tersedia di Nginx 2.0, konteksnya yang berlaku, kebijakan validasi, dan contoh penggunaan. Pendekatan terstruktur ini memastikan pemahaman yang jelas tentang cara mengkonfigurasi server web Anda secara efektif.
root Konteks diizinkan: server , location
Kebijakan Validasi: Harus unik dalam konteksnya.
Contoh:
server {
root /var/www/html; # Document root
}listen Konteks diizinkan: server
Kebijakan Validasi: Harus unik dalam konteksnya.
Contoh:
server {
listen 8080 ; # Server listens on port 8080
}autoindex Konteks diizinkan: server , location
Kebijakan Validasi: Harus unik dalam konteksnya.
Contoh:
location /images {
autoindex on ; # Enables directory listing
}server_name Konteks diizinkan: server
Kebijakan Validasi: Harus unik dalam konteksnya.
Contoh:
server {
server_name example.com;
}client_max_body_size Konteks diizinkan: http , server
Kebijakan Validasi: Harus unik dalam konteksnya.
Contoh:
http {
client_max_body_size 20M ; # Limits request body size
}error_page Konteks diizinkan: http , server , location
Kebijakan Validasi: Mendukung dua atau lebih argumen.
Contoh:
server {
error_page 404 /404.html;
}try_files Konteks diizinkan: server , location
Kebijakan Validasi: Harus unik dalam konteksnya, mendukung dua atau lebih argumen. Argumen terakhir diperlakukan sebagai mundur.
Contoh:
location / {
try_files $uri $uri / /index.html;
}index Konteks diizinkan: http , server , location
Kebijakan Validasi: Mendukung satu atau lebih argumen. Server akan menggunakan file pertama yang ditemukan sebagai indeks. Argumen terakhir diperlakukan sebagai mundur jika dimulai dengan tebasan. Jika tidak ada indeks yang ditemukan, daftar direktori ditampilkan.
Contoh:
location / {
index index.html index.htm /fallback;
}return Konteks diizinkan: server , location
Kebijakan Validasi: Mendukung salah satu argumen sebagai kode status untuk mengembalikan pesan status yang telah ditentukan, atau dua argumen di mana yang pertama adalah kode status dan yang kedua adalah URL untuk pengalihan atau teks untuk kembali sebagai badan. Saat digunakan untuk pengalihan, kode status umum adalah 301 (redirect permanen) atau 302 (pengalihan sementara).
Contoh 1: Mengembalikan kode status dengan teks:
location /gone {
return 410 "The resource is no longer available" ;
}Konfigurasi ini mengembalikan kode status 410 dengan pesan khusus yang menunjukkan bahwa sumber daya tidak lagi tersedia.
Contoh 2: Pengalihan:
location /oldpage {
return 301 http://example.com/newpage;
} Petunjuk ini mengarahkan kembali permintaan /oldpage ke URL baru dengan kode status 301, menunjukkan pengalihan permanen.
limit_except Konteks diizinkan: location
Kebijakan Validasi: Harus unik dalam konteksnya, mendukung satu atau lebih argumen untuk menentukan metode HTTP yang diizinkan.
Contoh: Petunjuk ini membatasi metode yang diizinkan untuk titik akhir /api untuk mendapatkan dan memposting, menolak semua metode lainnya.
location /api {
limit_except GET POST;
}keepalive_timeout Konteks diizinkan: http , server
Kebijakan Validasi: Harus unik dalam konteksnya.
Contoh:
server {
keepalive_timeout 15 ; # Keep connections alive for 15 seconds
}cgi_extension Konteks diizinkan: server
Kebijakan Validasi: Harus unik dalam konteksnya, mendukung satu atau lebih argumen. Menentukan ekstensi file yang akan diperlakukan sebagai skrip CGI.
Contoh:
server {
cgi_extension .cgi .pl .py .sh .extension; # Handle .cgi .pl .py files as CGI scripts
}Contoh komprehensif ini menunjukkan pengaturan server dengan konteks bersarang dan beberapa arahan, menampilkan konfigurasi yang realistis untuk 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;
}
}
Panduan dan contoh ini harus melengkapi Anda dengan pengetahuan untuk mengonfigurasi Nginx 2.0 secara efektif, memastikan server web Anda disesuaikan dengan persyaratan spesifik dan konteks operasional Anda.
Di bawah ini adalah tinjauan umum dari struktur proyek Nginx 2.0, memberikan wawasan tentang organisasi basis kode dan tujuan setiap direktori dan file kunci:
/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
Struktur ini dirancang untuk meningkatkan pemeliharaan dan skalabilitas, memastikan bahwa siapa pun dapat dengan mudah menavigasi dan berkontribusi pada proyek.
Untuk membantu dalam eksplorasi dan penguasaan lebih lanjut dari pengembangan server web, jaringan, dan konsep pemrograman, kami merekomendasikan daftar sumber daya yang dikuratori berikut:
select() - Memahami panggilan sistem select() untuk multiplexing.select() - Menyelam dalam ke operasi I/O yang tidak memblokir dan penggunaan select() .Terima kasih khusus disampaikan kepada Abdelaziz Eroui untuk kuliah informatifnya tentang pemrograman TCP/IP dan soket, bagian dari seri semester yang hilang, yang memberikan wawasan mendalam tentang dasar -dasar jaringan yang penting bagi keberhasilan proyek kami.
Kami juga ingin mengucapkan terima kasih kepada Mehdi Cheracher atas kuliahnya tentang jejaring dan pemrograman asinkron. Ajarannya telah berperan dalam memandu pendekatan kami untuk menangani komunikasi jaringan secara efisien.
Kontribusi mereka pada lapangan dan dedikasi untuk pendidikan sangat berharga bagi proyek kami dan komunitas yang lebih luas.
Kami sangat menyambut kontribusi dari komunitas dan sangat senang Anda bergabung dengan kami dalam meningkatkan Nginx 2.0! Apakah Anda memperbaiki bug, menambahkan fitur baru, atau meningkatkan dokumentasi, kontribusi Anda sangat berharga untuk membuat Nginx 2.0 lebih baik untuk semua orang.
Jika Anda memiliki pertanyaan atau membutuhkan bantuan, jangan ragu untuk menjangkau dengan membuka masalah. Kami di sini untuk membantu dan menantikan kontribusi Anda!