Common Gateway Interface (CGI) — это интерфейс для связи внешней программы с веб-сервером, на котором размещён сайт: по запросу посетителя сервер запускает программу (CGI-скрипт) и отдаёт её результат как ответ, поэтому страницы получаются динамическими.
С запросом «CGI» приходят люди с разными задачами. Найдите свою ситуацию.
Сервер отвечает за соединение и передачу данных, а скрипт за логику приложения: работу с данными и обработку документов. Так распределены роли в RFC 3875. Путь запроса состоит из четырёх шагов.
| Шаг | Что происходит | Деталь |
|---|---|---|
| 1. Запрос | Посетитель открывает страницу или отправляет форму, браузер шлёт запрос серверу | Сервер по адресу решает, что обрабатывать должен скрипт |
| 2. Запуск | Сервер запускает программу в новом процессе | Это и есть главная особенность и главный недостаток CGI |
| 3. Передача данных | Параметры запроса попадают в переменные окружения (REQUEST_METHOD, QUERY_STRING и другие), тело POST-запроса читается из стандартного ввода | Заголовки запроса приходят переменными вида HTTP_* |
| 4. Ответ | Программа печатает результат в стандартный вывод: заголовки (Content-Type, Location, Status) и тело, чаще всего HTML | Сервер отправляет это браузеру как ответ |
В RFC 3875 определены методы GET, POST и HEAD, причём GET должен быть безопасным и повторяемым. Поэтому действия вроде отправки заказа делают через POST.
CGI появился в начале 1990-х и стал первым распространённым способом сделать веб-страницу интерактивной, например обработать отправленную форму. Многие крупные серверы, включая Apache и Microsoft IIS, поддерживают его до сих пор. Что выбрать сегодня, зависит от нагрузки и сложности приложения.
| Подход | Как работает | Чем отличается от CGI |
|---|---|---|
| CGI | Новый процесс на каждый запрос | Простая схема, но дорогой запуск при большом трафике |
| Модули веб-сервера (mod_php, mod_perl, mod_python) | Обработка выполняется внутри сервера | Один долгоживущий процесс обслуживает много запросов |
| FastCGI, SCGI | Приложение живёт отдельно от сервера и общается с ним через сокет | Меньше памяти, чем у модулей, и приложение не зависит от сервера |
| WSGI | Интерфейс между Python-приложением и сервером (PEP 3333) | Только для Python, работает через mod_wsgi, Gunicorn, uWSGI |
Если ваш сайт работает на готовой системе управления, подрядчик сам выбирает способ запуска; вам важно знать, что такая настройка есть и от неё зависит скорость ответа сервера.
Ответить по одному признаку нельзя: поддержка CGI на хостинге не означает, что сайт её использует. Сверьте то, что видите, с таблицей.
| Что видите | Что это значит | Что делать |
|---|---|---|
| Хостинг указывает «поддерживается CGI» | Сервер умеет запускать такие программы. Использует ли их ваш сайт, это отдельный вопрос | Спросите разработчика, есть ли на сайте CGI-скрипты |
| Форма отправляется на адрес скрипта | Обработчик может быть CGI-программой, но может быть и другой технологией | Попросите разработчика назвать технологию обработчика и язык |
| Сайт замедляется при росте посетителей | Одна из возможных причин: процесс на каждый запрос. Причин может быть много | Измерьте время ответа сервера и обсудите с разработчиком FastCGI или модуль |
| Скрипту много лет, автора нет | Риск ошибок обработки данных и прав доступа (RFC 3875: скрипт работает с правами сервера) | Закажите проверку безопасности или замену скрипта |
CGI часто путают с языком или с самим скриптом, хотя это правила обмена между сервером и программой. В отличие от CGI, PHP это язык программирования, а mod_php встраивает его обработку прямо в сервер.
| Понятие | Что это | Отличие от CGI |
|---|---|---|
| CGI | Интерфейс между веб-сервером и внешней программой | Определяет, как программа получает запрос и возвращает ответ |
| Script | Программа, автоматизирующая действия | CGI-скрипт это скрипт, запускаемый по правилам CGI; бывают и скрипты в браузере |
| API | Интерфейс обмена между программами | CGI это один конкретный интерфейс сервера и программы, а не общий формат обмена данными |
| PHP | Язык программирования для сайтов | Язык, а не интерфейс; Wikipedia называет mod_php способом встроить обработку в сервер как альтернативу CGI |
Личные данные из формы передавайте в теле запроса, а не в адресе страницы. Остальные типовые ситуации разобраны в таблице.
| Ситуация | Что сделать |
|---|---|
| Подрядчик предлагает «переписать скрипты формы» | Попросите описать, на какой технологии они работают сейчас, и что изменится в скорости и безопасности |
| Страница отвечает медленно | Сначала измерьте время ответа сервера, затем разбирайтесь, связано ли это со способом запуска программ |
| Нужно понять, что видят пользователи и сервер | Откройте инструменты разработчика в браузере и посмотрите запрос и ответ (см. «Читайте дальше») |
| Форма принимает личные данные | Убедитесь, что данные передаются в теле запроса, а не в адресе страницы |
Это договорённость о том, как веб-сервер запускает внешнюю программу и получает от неё готовую страницу. Посетитель отправил запрос, сервер запустил программу, программа вернула HTML.
Программа, которую веб-сервер запускает по запросу посетителя по правилам CGI. Она получает данные запроса через переменные окружения и стандартный ввод, а результат печатает в стандартный вывод.
Сервер принимает запрос, запускает программу в новом процессе, передаёт ей параметры запроса и тело POST-запроса, а затем отправляет браузеру то, что программа вывела.
Это один из первых способов сделать сайт динамическим, он появился в начале 1990-х. Многие серверы его всё ещё поддерживают, но для нагруженных сайтов обычно выбирают FastCGI, модули сервера и другие решения.
CGI запускает новый процесс на каждый запрос, а FastCGI держит долгоживущее приложение отдельно от сервера и связывается с ним через сокет, что экономит ресурсы.
Может: создание и завершение процесса для каждого запроса иногда требует больше ресурсов, чем сама работа скрипта. Но скорость зависит и от многих других причин, поэтому сначала измерьте время ответа сервера.
Нет. В кино и играх CGI означает computer-generated imagery, то есть компьютерную графику. В вебе это Common Gateway Interface, интерфейс запуска программ на сервере.
Укажите тематику вашего бизнеса и мы пришлем вам кейсы в ближайшее время