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, веб-сервер выполняет следующие действия:
- Создаёт новый процесс операционной системы (или использует предварительно запущенный).
- Передаёт программе данные HTTP-запроса через переменные окружения (например,
REQUEST_METHOD,QUERY_STRING,CONTENT_TYPE,HTTP_USER_AGENT) и, при наличии, тело запроса через стандартный поток ввода (stdin). - Программа формирует ответ, записывая его в стандартный поток вывода (stdout) с заголовком
Content-Type, отделяющим заголовок от тела документа. - Веб-сервер перехватывает вывод программы, добавляет собственные заголовки (например,
Status) и отправляет результат клиенту. - Процесс программы завершается.
Программы на 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
