Японский программист 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%;
  • Модульный дизайн: разделены и могут подменяться компоненты для управления памятью, работы со строками, разбора протоколов, обработки соединений, фильтрации вывода, ведения логов и т.п. Поддерживается подключение модулей-расширений для обработки контента, фильтрации/модификации содержимого и ведения логов.


Источник: http://www.opennet.ru/opennews/art.shtml?num=41345