Возможна ли работа web-приложения без CGI?
============================================

 Насколько понял WEB-приложение работая где-либо на WEB-сервере должно как-то общаться с ним и эту роль «коммуникационного протокола» играет CGI. Почитав про CGI, FastCGI и немного про Django мой вопрос, который в сабже не был исчерпан.  

  

Мне хочется знать, а возможна ли работа WEB-приложения без использования CGI?  

Вероятно существуют другие способы общения с WEB-сервером, которые пока не знаю.  

  

P.S.:  

Сильно не пинайте за такой вопрос. Для кого-то этот вопрос из разряда «капитанских», а для меня вэб-разработка новое направление, в котором я пока даже на уровень «новичка» не тяну ) Я только только приступил к постижению основ разработки WEB-приложений. 

 Существует достаточно большое количество технологий решающих задачу коммуникации веб-приложения и клиента (связка веб-сервер+CGI только одна из них). Я могу выделить три класса таких технологий (кто-то может по другому их разделить, это не для спора):  

 — CGI-like, когда сервер перенаправляет запросы в экземпляр приложения, которое запускается как отдельный процесс в системе, и использует результат выполнения для отдачи клиенту;  

 — Fast-CGI-like, когда приложение работает как демон и обслуживает запросы веб-сервера;  

 — Сервера приложений, которые в собственном контексте выполняют код и обслуживают запросы.  

Отдельно можно поставить комплексные сервера-приложения, которые сами выполняют все функции, как приложения, так и сервера.  

Выбор технологии зависит от языка и уровня навыков.  

CGI прост, но почти по всем параметрам уступает FCGI. Обе технологии используются, в основном, при работе с скриптовыми языками (Perl, PHP).  

Сервера приложений — это преимущественно Java мир. Много специфики. 

Для общения с web-сервером приложению также cgi не является обязательным. Обмен данными может осуществляться через XML, REST etc. Некоторым приложениям вообще свой сервер не нужен, если данные получаются со сторонних API-сервисов. 

 Такие вопросы на хабре задавать бесполезно. =)  

  

Большинство ответивших написали местами полную чушь. Основная масса веб-программистов дальше своих фреймворков не вылезают, и у них в итоге полная каша в голове. Например, кто-то путает интерфейс (WSGI, Pump, WEB3, PSGI, Rack, CGI и т.д.), сервер приложений (uWSGI, php-fpm, Rack, Gunicorn, unicorn, flup, Apache в данной роли, и ещё тысячи их) и протокол (HTTP, uwsgi, FastCGI, SCGI, CGI, AJP, WebSocket, да много их). Кто-то путает протокол, способ его реализации и способ запуска интерпретатора.  

  

Основное, что вам нужно знать, содержится в документации Django:  

[docs.djangoproject.com/en/dev/howto/deployment/](https://docs.djangoproject.com/en/dev/howto/deployment/)  

  

Ответом на ваш вопрос будет: да существует множество и каждый HTTP-сервер поддерживает целый набор протоколов для общения с сервером приложений. И сервера приложений могут поддерживать один или несколько протоколов, один или несколько интерфейсов. Некоторые HTTP-сервера умеют выполнять двойную роль, выступая и в роли сервера-приложения, предоставляя определенный интерфейс. А некоторые приложения сами содержат встроенный HTTP-сервер. Термин же «веб-сервер» слишком общий, и трактоваться может разными способами. 

 Браузер, отправляя запрос на сервер, отправляет запрос HTTP (протокол прикладного уровня основанный на TCP). На сервере его может принять любое приложение, которое работает с протоколом HTTP. В большинстве случаев это действительно веб-сервер в стандартном его понимании (apache, nginx, lIS...), который в зависимости от своих настроек и входящего запроса может либо передать запрос по CGI/FCGI на PHP/Python/любой другой язык, либо отработать запрос самостоятельно (выдать картинку, заблокировать...). Но это применимо в основном только для скриптовых языков и stateless приложений. Statefull веб-приложения (обычно С/С++/Java/Delphi/C#) часто используют встроенный веб-сервер, который обеспечивает коммуникацию по протоколу HTTP без стороннего внешнего веб-сервера (apache, nginx)… Более того, даже при использовании apache, nginx не обязательно использовать CGI/FCGI, насколько я знаю, можно использовать обычное прокси. 

 Для того чтобы выполнять скрипты, web-серверу нужен некий протокол, чтобы взаимодействовать с этими скриптами. Таковых есть несколько:  

 — CGI  

 — FastCGI  

 — обычный HTTP  

 — встроенные в сервер API (для подключения модулей — как mod\_perl и mod\_php в апаче, или встроенная поддержка perl в nginx) 

 Запросто (вебсокеты). В этом случае и без веб-сервера можно обойтись.