Открыть сервисСервис

CGI — протокол обработки веб-запросов

CGI (Common Gateway Interface, «общий интерфейс шлюза») — это стандарт программного интерфейса, определяющий способ взаимодействия веб-сервера с внешними программами. CGI позволяет веб-серверу запускать сторонние программы для динамической генерации содержимого веб-страниц в ответ на запросы пользователей, передавая им данные запроса через переменные окружения и стандартный поток ввода, а полученный результат — HTML-документ или иные данные — возвращая клиенту.

История

Стандарт CGI был разработан в 1993 году Марком Андрисеном (Marc Andreessen) и Эриком Бином (Eric Bina) в Национальном центре суперкомпьютерных приложений (NCSA) при создании веб-браузера Mosaic. Первоначально спецификация описывала интерфейс для веб-сервера NCSA HTTPd. В 1995 году CGI 1.1 был принят как рекомендованный стандарт IETF (RFC 1630, позднее уточнён в RFC 2068 и RFC 3875).

CGI стал первым массово применяемым способом создания динамического веб-контента. До его появления веб-серверы отдавали клиенту только статические файлы. Появление CGI позволило создавать поисковые системы, гостевые книги, формы обратной связи и интерактивные каталоги.

Принцип работы

При получении запроса к ресурсу, обрабатываемому CGI, веб-сервер выполняет следующие действия:

  1. Создаёт новый процесс операционной системы (или использует предварительно запущенный).
  2. Передаёт программе данные HTTP-запроса через переменные окружения (например, REQUEST_METHOD, QUERY_STRING, CONTENT_TYPE, HTTP_USER_AGENT) и, при наличии, тело запроса через стандартный поток ввода (stdin).
  3. Программа формирует ответ, записывая его в стандартный поток вывода (stdout) с заголовком Content-Type, отделяющим заголовок от тела документа.
  4. Веб-сервер перехватывает вывод программы, добавляет собственные заголовки (например, Status) и отправляет результат клиенту.
  5. Процесс программы завершается.

Программы на CGI могут быть написаны на любом языке программирования — Perl, C, Python, Bash, PHP (ранние версии), Fortran и других. Наиболее распространённым языком в первые годы применения CGI был Perl, что породило термин «CGI-программирование».

Пример CGI-программы

Минимальная CGI-программа на Perl, возвращающая HTML-страницу:

```perl

!/usr/bin/perl

print "Content-type: text/html\n\n"; print "<html><body><h1>Hello, CGI!</h1></body></html>"; ```

Первая строка (shebang) указывает интерпретатор, вторая — выводит обязательный заголовок Content-Type, после пустой строки начинается тело ответа.

Недостатки

Основной недостаток CGI — низкая производительность при высокой нагрузке. Поскольку для каждого запроса создаётся новый процесс операционной системы, расходуются ресурсы на запуск интерпретатора и инициализацию окружения. При одновременном большом количестве запросов это приводило к значительной нагрузке на сервер.

Другие ограничения:

  • отсутствие встроенного механизма сохранения состояния между запросами (для этого использовались cookies или скрытые поля форм);
  • сложность обработки одновременных запросов (в отличие от многопоточных моделей);
  • необходимость запуска внешнего процесса для каждого запроса.

Развитие и замена

Для преодоления ограничений CGI были разработаны альтернативные механизмы:

  • FastCGI — протокол, в котором процессы-обработчики запускаются один раз и переиспользуются для множества запросов, что резко повышает производительность.
  • SCGI — упрощённый протокол, аналогичный FastCGI.
  • Server API (SAPI) — встраивание интерпретатора (например, PHP) непосредственно в веб-сервер через модули Apache (mod_php) или аналогичные расширения.
  • Многопоточные и асинхронные модели — например, веб-серверы Nginx с FastCGI, Node.js с event-driven моделью.

Несмотря на вытеснение в массовом применении, CGI остаётся актуальным протоколом, поддерживаемым большинством веб-серверов (Apache, Nginx, lighttpd). Он используется там, где важна простота реализации и совместимость, например, в хостинг-панелях, учебных материалах и встраиваемых системах.

Применение

CGI применяется в следующих областях:

  • обработка HTML-форм (отправка данных на сервер);
  • генерация динамических страниц на основе данных из баз данных;
  • интеграция веб-сервера с внешними программами и системами;
  • обработка файлов, загружаемых пользователями (механизм multipart/form-data).

В современной веб-разработке CGI чаще встречается в учебных материалах и как базовая модель для понимания принципов динамической генерации веб-страниц.

См. также

  • FastCGI
  • Apache HTTP Server
  • PHP
  • Perl

Источники

  • RFC 3875. The Common Gateway Interface (CGI) Version 1.1
  • NCSA HTTPd Documentation
  • «CGI Programming with Perl 5», C. Curley, D. Curley, M. Curley, O'Reilly Media, 2002
  • «Web Client Programming with Perl», Clinton Wong, O'Reilly Media, 1997
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru