Поиск по сайту:

Что такое общий интерфейс шлюза (CGI)?


Общий интерфейс шлюза (CGI) — это стандарт, определяющий, как внешние программы могут предоставлять информацию веб-серверам. CGI предоставляет механизм для веб-серверов, таких как Apache, для обмена данными с языками программирования, такими как Perl.

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

Программное обеспечение веб-сервера традиционно ограничивалось обслуживанием статических веб-страниц. Сценарии CGI позволяют создавать динамические ответы, создаваемые при получении запроса.

Стандартизация HTTP-серверов

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

Серверы с поддержкой CGI будут обрабатывать запросы, используя процесс, аналогичный следующему:

  1. Получен новый запрос: /example.pl.
  2. Веб-сервер распознает example.pl как исполняемый сценарий CGI, поэтому он вызывает этот сценарий.
  3. Сценарий Perl CGI получает все данные о запросе, такие как его URL-адрес и заголовки HTTP.
  4. Выполняется сценарий example.pl; его выходные данные будут переданы обратно на веб-сервер для отправки в виде HTTP-ответа.

Описанный выше поток резко отличается от обычной работы веб-сервера. Базовый запрос /example.pl вернет содержимое этого файла. Если бы файл не существовал, вместо этого вы получили бы ответ 404.

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

Обмен информацией через CGI

Бинарный файл программы, выполняемый через CGI, может получить доступ к различным данным о входящем HTTP-запросе. Сюда входят URL-адрес, заголовки, строка запроса и метод HTTP, а также IP-адрес удаленного клиента.

Серверное программное обеспечение не обязано предоставлять все данные дословно. Спецификация CGI позволяет серверам исключать заголовки из переменных среды. Это может быть сделано для того, чтобы исключить конфиденциальную информацию, например значение заголовка Authorization, или чтобы избежать избыточности, когда доступ к той же информации можно получить с помощью специальной переменной.

Помимо данных о запросе, CGI-совместимые серверы также должны указывать различные подробности о себе. Это включает в себя имя и версию программного обеспечения хост-сервера. Скрипты могут использовать эти данные по своему усмотрению.

Информация передается с сервера в программу CGI в виде переменных среды. Программа обращается к ним так же, как и к любой другой переменной среды. Сервер будет запускать программу как собственный дочерний процесс, устанавливая переменные среды перед вызовом исполняемого файла.

Есть один фрагмент данных, который не будет передаваться как переменная среды. Тело запроса получает особую обработку, так как оно может быть очень длинным. Это будет передано в сценарий в его стандартном входном потоке. Скрипты получают информацию о том, сколько данных доступно, через переменную среды CONTENT_LENGTH.

После завершения обработки скрипт CGI возвращает ответ HTTP на сервер. Это должен быть полный ответ HTTP, содержащий заголовки и необязательное тело. Сценарий выдает ответ на свой стандартный поток вывода. Затем сервер отправляет ответ обратно клиенту через HTTP-соединение.

Где CGI сегодня?

Компьютерная графика помогла создать современную сеть. Он предоставил чрезвычайно простой способ создания динамических сценариев на стороне сервера с использованием технологий середины 90-х годов. Веб-страница больше не была статическим HTML-файлом.

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

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

CGI также ограничен с точки зрения контроля над сценариями. Скрипты могут определять только содержимое ответа, отправляемое обратно клиенту. Они не могут влиять ни на какую другую часть HTTP-обмена, например на аутентификацию или управление сеансом.

Наконец, есть проблемы с безопасностью. Сценарии CGI обычно выполняются как дочерние процессы сервера. Это означает, что сервер должен быть защищен от вмешательства скриптов. Неправильная конфигурация может дать сценарию нежелательный доступ к другим ресурсам, управляемым сервером, таким как его конфигурация и файлы журналов.

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

В других местах отдельные языки программирования реализовали свои собственные серверные интерфейсы. Они напрямую интегрируются в веб-серверы, обычно через дополнительные модули. Одним из примеров являются mod_php и mod_perl Apache, которые предлагают встроенную поддержку этих языков программирования без использования CGI (хотя оба они могут использоваться через CGI).

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