Nginx 2.0-это передовый веб-сервер, управляемый событиями, разработанный с эффективностью, масштабируемостью и соответствием протокола HTTP в своем ядре. Вдохновленная оригинальной архитектурой Nginx, наша цель состояла в том, чтобы создать веб -сервер, который соответствует своему предшественнику в производительности, гибкости и простоте использования. Nginx 2.0, разработанный благодаря совместным усилиям для меня и Тукки, воплощает нашу приверженность инновациям, предлагая надежную платформу как для статического, так и для динамического веб -контента, оптимизированного для современных веб -приложений и услуг.
Наше путешествие по разработке Nginx 2.0 было обусловлено приверженностью инновациям, производительности и стремлению к совершенству в технологии веб -обслуживания. Здесь мы углубимся в основные функции, которые воплощают наши амбиции и техническое мастерство, демонстрируя шаги, которые мы добились при переопределении возможностей современного веб -сервера.
При разработке Nginx 2.0 мы приоритетными приоритетными к стандарту http/1.1, обеспечивающие устойчивость нашего сервера, надежно поддерживает основные методы HTTP, такие как Get, Head, Post и Delete. Это обязательство не только согласуется с нашей целью для широкой совместимости, но и отражает нашу преданность делу обеспечить прочную, надежную основу для веб -сервировки.
Сложность и разнообразие конфигураций веб -сервера привели нас к реализации рекурсивного анализатора спуска, отражая иерархическую модель, наблюдаемую в Nginx. Эта стратегия улучшает управление конфигурацией, делая ее интуитивно понятным и управляемым при сохранении гибкости, необходимой для сложных настройков.
Понимая разнообразные среды, в которых работает наш сервер, мы разработали пользовательский уровень абстракции для мультиплексирования ввода -вывода, который плавно интегрирует как с Kqueue (macOS), так и с Epoll (Linux). Этот кроссплатформенный подход является свидетельством нашей приверженности оптимизации производительности в разных системах, обеспечивающих эффективное выполнение NGINX 2.0 в различных условиях эксплуатации.
Наше внимание к эффективности и производительности особенно очевидно в том, как Nginx 2.0 обрабатывает большие ответы и потоковую передачу видео. Поддерживая передачу передачи: запрашиваемые и диапазоны, мы оптимизировали доставку большого контента, обеспечивая минимальное использование ресурсов при сохранении плавного непрерывного воспроизведения видео. Эта функция является прямым результатом нашей приверженности улучшению опыта пользователей, решая общие проблемы в доставке контента с помощью инновационных решений.
Чтобы расширить возможности сервера помимо обслуживания статического контента, мы интегрировали комплексную поддержку 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Построить проект
Вы можете создать проект в двух конфигурациях: отладка для разработки и выпуска для производства.
Строительство отладки:
Сборка отладки включает в себя дополнительные символы отладки и скомпилируется с адресами и неопределенными дезинфицирующими средствами поведения (на 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 Commands:
Чистые объекты и зависимости:
make cleanПолный чист (включая двоичные файлы):
make fcleanПроверка памяти Valgrind:
Для пользователей 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;
} Эта директива перенаправляет запросы на /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, предоставляя представление об организации кодовой базы и цели каждого каталога и ключевых файлов:
/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() - глубокое погружение в неблокирующие операции ввода -вывода и использование select() .Особая благодарность распространяется на Абделазиз Эруй за его информативную лекцию по программированию TCP/IP и сокетам, в том числе пропущенной семестровой серии, которая дала глубокое представление о основе сетевого взаимодействия, критических для успеха нашего проекта.
Мы также хотели бы выразить свою благодарность Мехди Шерахеру за его лекцию о сетевом общении и асинхронном программировании. Его учения сыграли важную роль в руководстве нашего подхода к эффективному обработке сетевых коммуникаций.
Их вклад в область и преданность образованию были неоценимы как для нашего проекта, так и для более широкого сообщества.
Мы тепло приветствуем вклад сообщества и рады, что вы присоединитесь к нам в улучшении Nginx 2.0! Независимо от того, исправляете ли вы ошибки, добавляете новые функции или улучшаете документацию, ваши вклад неоценимы для улучшения Nginx 2.0 для всех.
Если у вас есть какие -либо вопросы или вам нужна помощь, не стесняйтесь обратиться, открывая проблему. Мы здесь, чтобы помочь и с нетерпением ждем вашего вклада!