Представлен новый высокопроизводительный HTTP-сервер H2O
26 декабря 2014 года
Японский программист Kazuho Oku, в своё время создавший Palmscape, первый web-браузер для платформы PalmPilot, а также язык программирования JSX и движок хранения для MySQL Q4M, анонсировал первый выпуск нового высокопроизводительного HTTP-сервера H2O, в некоторых тестах до двух раз обгоняющего Nginx по скорости обработки запросов. H2O поддерживает протоколы HTTP/1.x и HTTP/2, и может использоваться как обособленный сервер, так и в форме библиотеки для встраивания функциональности HTTP-сервера в другие продукты. Код проекта написан на языке Си и поставляется под свободной лицензией MIT.
В качестве причины создания нового HTTP-сервера называется желание обеспечить максимальную производительность в условиях меняющихся при переходе от HTTP/1 к HTTP/2 реалий, в частности, значительного увеличения числа обрабатываемых файлов. Развиваемые для HTTP/1 методы оптимизации не всегда применимы к протоколу HTTP/2, для которого решены проблемы с утилизацией имеющейся пропускной способности в условиях передачи большого числа файлов. Если для HTTP/1 с целью снижения накладных расходов разработчики старались минимизировать число передаваемых файлов и по возможности комбинировать их в более крупные порции данных, например, применяя слияние CSS-файлов, то для HTTP/2 более оптимальной является раздельная поставка ресурсов в отдельных файлах, так как их доставка может быть эффективно распараллелена в рамках одного канала связи.
При тестировании в условиях обработки большого числа мелких запросов H20 заметно обогнал nginx по скорости отдачи как статических файлов так и при использовании в роли reverse-proxy. При этом в тестах фигурируют только мелкие запросы размером от нескольких байт до 10Кб, для более крупных запросов сравнение не проводилось, но судя по динамике изменения результатов имеющихся тестов, чем больше размер данных, тем меньше отличия в производительности. Например, при отдаче 6 байт разница в показателях теста "wrk -c 500 -d 30 -t 1" для h2o и nginx составляет 75483 и 37289, а для 4Кб - 59673 и 43988;
Основные возможности:
- Поддержка протоколов HTTP/1.0 и HTTP/1.1, в том числе с возможностью использования keep-alive для повторного использования уже установленного соединения и chunked-кодирования. Поддержка HTTP реализована с использованием высокопроизводительного парсера PicoHTTPParser, развиваемого автором H2O, использующего для ускорения SIMD-инструкции и уже давно используемого в Perl-модуле HTTP::Parser::XS;
- Поддержка чернового варианта спецификации HTTP/2 ( draft-14), в том числе с возможностью определения приоритетов на основании заданных весов и поддержкой методов согласования соединения NPN, ALPN, Upgrade и direct;
- Поддержка технологии WebSocket, реализованной с привлечением библиотеки wslay;
- Поддержка шифрования канала связи (TLS) с использованием OpenSSL. Доступны шифры AEAD, обеспечена защита сессионных ключей при помощи forward secrecy и реализована возможность возобновления сеансов (Session Resumption);
- Простой и понятный формат файла конфигурации. Возможность управления работой сервера через специальный API или через YAML;
- Оптимизации для статической отдачи контента. Возможность условной обработки GET-запросов на основании содержимого заголовков last-modified / etag. Поддержка генерации списка, отражающего содержимое директории. Возможность настройки mime-типов;
- Режим http-акселератора (reverse-proxy) доступен только для HTTP/1 (без HTTPS) и может работать с установкой постоянного соединения с первичным (upstream) сервером;
- Средства ведения логов, совместимых по формату с логами apache httpd;
- Поддержка горячего перезапуска и обновления серверного процесса без остановки обработки имеющихся соединений (graceful restart и self-upgrade);
- Для цикла обработки соединений может применяться как собственная реализация event loop, так и библиотека libuv;
- Использование qrintf вместо s(n)printf, что позволило ускорить выполнение операций примерно на 20%;
- Модульный дизайн: разделены и могут подменяться компоненты для управления памятью, работы со строками, разбора протоколов, обработки соединений, фильтрации вывода, ведения логов и т.п. Поддерживается подключение модулей-расширений для обработки контента, фильтрации/модификации содержимого и ведения логов.
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.