Подтвердить что ты не робот

Высокопроизводительный веб-сервер приложений в C/С++

Есть ли какой-либо веб-сервер с высокой производительностью (в идеальном случае и с открытым исходным кодом) на C или С++?

Я хотел бы иметь возможность использовать его в том, что он вызывает метод/функцию в моем приложении с заполненным классом HTTP-запроса/структурой, а затем я могу вернуть заполненный ему класс/структуру HTTP-ответа.

Если он не является открытым исходным кодом, мне понадобится встроенная поддержка длинных опросов, keep-alive и т.д., в противном случае я думаю, что сам могу добавить эти вещи.

Если вы не знаете о каких-либо таких серверах, вы бы рекомендовали написать собственный веб-сервер для соответствия этой задаче? Он не может быть основан на файлах и должен быть написан на высокопроизводительном C/С++.


Изменить: я думаю что-то вроде Ruby Mongrel для C, если это помогает.

4b9b3361

Ответ 1

У меня были те же требования к моей работе, поэтому я оценил ряд решений: mongoose, libmicrohttpd, libevent. И я также думал о написании модулей nginx. Вот краткое изложение моих выводов:

Nginx

страница проекта nginx

Мне нравится этот сервер и его много использовать. Его производительность и использование ресурсов намного лучше, чем у Apache, которые я также все еще использую, но планирую переход на nginx.

  • Очень хорошая настраиваемая производительность. Богатая функциональность. Переносимость.
  • Модуль API не документирован и представляется очень многословным. См. Этот nginx hello world module в качестве примера.
  • Nginx не использует потоки, но использует несколько процессов. Это затрудняет работу с письмами, необходимо изучить nginx API для общей памяти и т.д.

мангуст

страница проекта mongoose

  • Весь код сервера находится в одном файле mongoose.c(около 130K), без зависимостей. Это хорошо.
  • Один поток на соединение, поэтому, если вам нужно concurrency, вам нужно настроить множество потоков, т.е. высокая оперативная память. Не слишком хорошо.
  • Производительность хорошая, хотя и не исключительная.
  • API прост, но вы должны сами составлять все HTTP-заголовки ответа, т.е. подробно изучите HTTP-протокол.

libmicrohttpd

страница проекта libmicrohttpd

  • Официальный проект GNU.
  • API-интерфейс Verbose кажется мне неудобным, хотя гораздо проще, чем писать модули nginx.
  • Хорошая производительность в режиме keep-alive (ссылка на мои тесты ниже), не так хорошо, если вы не живете.

Libevent

страница проекта libevent

Библиотека Libevent имеет встроенный веб-сервер, называемый evhttp.

  • Это событие основано на использовании libevent для этого.
  • Легкий API. Создает заголовки HTTP автоматически.
  • Официально однопоточный. Это главный недостаток. Я нашел взломать, что заставляет несколько экземпляров evhttp запускать одновременно прием соединений из одного и того же сокета. Не уверен, что все это безопасно и надежно.
  • Производительность однопоточного evhttp удивительно бедна. Многопоточный взлом работает лучше, но все же не очень хорошо.

G-WAN

Проект G-WAN не является открытым исходным кодом, но я хотел бы сказать несколько слов об этом.

  • Очень хорошая производительность, низкое использование памяти, 150 KB исполняемый файл.
  • Очень удобное развертывание "сервлета": просто скопируйте файл .c в каталог csp, и запущенный сервер автоматически скомпилирует его. Изменения кода также скомпилированы "на лету".
  • Простой API. Хотя в некоторых отношениях они ограничены. Богатая функциональность (json, хранилище ключей и т.д.).
  • нестабильная. У меня были segfaults на статические файлы. Висит несколько примеров скриптов. (Опытный в чистой установке. Никогда не смешанные файлы разных версий).
  • Только 32-битный двоичный (не больше).

Итак, как вы можете видеть, ни одна из существующих альтернатив полностью не удовлетворила меня. Поэтому я разработал свой собственный сервер, который...

NXWEB

Страница проекта NXWEB

Основные моменты:

  • Очень хорошая производительность; см. контрольные показатели на странице проекта.
  • Может обслуживать десятки тысяч одновременных запросов
  • Малая занимаемая площадь памяти
  • Многопоточная модель, предназначенная для масштабирования.
  • Исключительно легкая база кода
  • Простой API
  • Достойная обработка протоколов HTTP
  • Поддерживать соединения
  • Поддержка SSL (через GNUTLS)
  • HTTP-прокси (с пулом соединений keep-alive)
  • Поддержка неблокирующей отправки файлов (с настраиваемым небольшим кэшем файловой памяти, предварительным кодированием файла gzip)
  • Модульный дизайн для разработчиков
  • Может быть запущен как демон; перезапускает себя при ошибке
  • Открытый исходный код

Ограничения:

  • Зависит от библиотеки libev (не больше)
  • Проверено только на Linux

Ответ 2

Я бы предложил написать исполняемый файл FastCGI, который можно использовать со многими высокопроизводительными веб-серверами (даже с закрытыми исходными).

Ответ 3

Я собираюсь предложить то же самое, что и Axel Gneiting, но дал ответ с моими причинами для такого подхода:

1) HTTP не является тривиальным как протокол - написание собственного сервера или внесение изменений в готовое решение - очень сложная задача - намного сложнее, чем использование доступных API для реализации отдельного механизма обработки

2) Использование (немодифицированного) основного веб-сервера должно предоставить вам больше функциональности, чем вам нужно (поэтому у вас есть растущая комната).

3) Использование (немодифицированного) основного веб-сервера обычно означает, что он был гораздо более широко протестирован и документирован, чем система доморощенного.

4).. и его вероятность быть надежной и стабильной.

5) Используя fastCGI, вы можете использовать всевозможные языки для разработки вашей внутренней обработки в - включая С++ и C. Существуют стандартные инструментальные средства для облегчения этого.

6), в качестве альтернативы, многие веб-серверы обеспечивают поддержку для запуска запущенных двигателей интерпретатора (например, mod_php, mod_perl). Я бы посоветовал не использовать собственный собственный код в качестве модуля.

Он не может быть основан на файлах.

А? Что это значит?

Ответ 4

mongoose: один файл. Легко и просто использовать. а не asycn io, но идеально подходит для встроенных и конкретных целей.

Гван. отлично. никаких сбоев. ультра хорошо спланированная конфигурация. очень умный и легкий для разработки c/С++, другими словами, очень чистый разумный api по сравнению с nginx. обеспечивает поток на ядро. или что бы вы ни указали. отличный выбор. самый большой недостаток (возможно, им недостает в этой области): не может пройти через код.

libevent: единственный поток не является недостатком на одноядерной машине. после этого его точкой является async i/o. имеет многопоточность для других ядер.

nginx: никакого личного опыта. набрав серьезную почву на нечетком сервере. (ужасно запутанный api)

boost asio: библиотека С++ для asynchio (asio). здорово. нужен дружественный api более высокого уровня для таких простаков, как я. и другие, которые поступают из php, java, javascript, node.js и других веб-языков.

python bottle: awesome 1 файл lib (framework/system), который упрощает создание веб-приложений python. имеет /- встроенный сервер httpd, например libevent и node.js

node.js: сервер asyncio javascript. отличный выбор. к сожалению, приходится программировать в javascript, который становится утомительным. в то время как есть что сказать, чтобы выполнить работу; есть также кое-что, что можно сказать о том, чтобы наслаждаться во время процесса. надеюсь, что ни у кого не появляется node.php

Ответ 5

Я - жадный nginx пользователь; nginx записывается в C; nginx кажется, что он может сработать для вас. Если вам нужна самая лучшая скорость из nginx, я бы сделал модуль nginx. Ниже представлены сторонние модули, которые вы можете изучить, чтобы получить представление о том, что он требует.

Что касается требования длительных опросов, вы можете захотеть взглянуть на модули push push.