Как мне лучше всего развернуть веб-приложение, написанное на C?

Скажем, у меня есть необычный новый алгоритм, написанный на C,

int addone(int a) {
    return a + 1;
}

И я хочу развернуть как веб-приложение, например, на

http://example.com/addone?a=5

который отвечает,

Content-Type: text/plain

6

Как лучше всего организовать что-то подобное? У меня есть существующая установка с использованием Python mod_wsgi на Apache2, и для тестирования я только что построил двоичный файл из C и вызвал его как подпроцесс с использованием Python os.popen2.

Я хочу, чтобы это было очень быстро и без лишних затрат (т.е. мне вообще не нужны другие вещи Python). Я могу выделить ему весь сервер, перекомпилировать все, что нужно, и т. Д.

Я подумываю изучить модули Apache C. Это полезно? Или я могу создать оболочки SWIG для прямого вызова из Python, но опять же, это кажется расточительным, если я вообще не использую Python. Какие-нибудь советы?


person kts    schedule 18.07.2010    source источник


Ответы (6)


Самый простой способ - написать эту программу как приложение CGI (http://en.wikipedia.org/wiki/.cgi). Он будет работать с любым веб-сервером, поддерживающим общий интерфейс шлюза. Формат вывода должен соответствовать правилам CGI.

Если вы хотите в полной мере использовать возможности веб-сервера, вы можете написать модуль Apache на C. Это требует немного большей подготовки, но дает вам полный контроль.

person Steffen Roller    schedule 18.07.2010

Может быть, этот крошечный динамический веб-сервер на C, который можно использовать с языком C, может помочь вам ... это должно быть легко использовать и автономно.

Вероятно, самое быстрое решение, которое вы можете принять, согласно тестам, указанным на их домашней странице!

person Jack    schedule 18.07.2010

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

from ctypes import *
libcompute = CDLL("libcompute.so")
libcompute.addone(int(a))
person SiggyF    schedule 18.07.2010

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

Если ваш сервер алгоритма на основе C отделен от HTTP-сервера, это может дать вам доступ к таким вещам, как масштабируемость HTTP и средства кэширования, которые в противном случае, возможно, пришлось бы спроектировать (или заново изобрести) в вашем компоненте алгоритма, если вещи слишком тесно связаны.

Я не думаю, что проблемы производительности сами по себе всегда являются лучшими или единственными причинами при проектировании архитектуры. Например, YAWS с драйвером на основе C может быть очень эффективным вариантом.

person bjg    schedule 18.07.2010

Я только что установил веб-службу с помощью http://www.gnu.org/software/libmicrohttpd/ и получил потрясающие результаты. На четырехъядерном процессоре я обрабатывал 20400 запросов в секунду, а процессор работает только на 58%. Вероятно, это будет развернуто на сервере с 8 ядрами, поэтому я ожидаю гораздо лучших результатов. Очень простой сервис C будет еще быстрее!

Я пробовал GWAN, он очень хороший, но закрытый и плохо работает с виртуальными средами. Хотя я награжу @Gil за то, что он хорошо поддерживает его здесь. У нас было несколько проблем, и мы обнаружили, что LibMicroHttpd лучше подходит для наших нужд.

Если вы пойдете сюда, вам может потребоваться обновить свой openssl, если вы используете CentOs из axivo

rpm -ivh --nosignature http://rpm.axivo.com/redhat/axivo-release-6-1.noarch.rpm
yum --disablerepo=* --enablerepo=axivo update openssl-devel
person Derrick Bradbury    schedule 29.07.2013

Вы можете попробовать Duda I / O, для этого требуется только хост Linux: http://duda.io

person edsiper    schedule 06.08.2013