img

Что такое интерфейс стандарта CGI?

21 ноября
20:00
Бесплатный вебинар
Введение в Docker
Ведущий — Филипп Игнатенко.
Руководитель центра разработки
Записаться
img
img

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

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

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

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

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

Серверы с поддержкой CGI обрабатывают запросы следующим образом:

  1. Сервер получает новый запрос: /example.pl.
  2. Он распознает example.pl как исполняемый CGI-скрипт и инициирует его вызов. 
  3. 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-ответ, который включает в себя заголовки и необязательное тело. Этот ответ отправляется через стандартный поток вывода CGI-скрипта. После чего сервер отправляет ответ клиенту через HTTP-соединение. 

Где же сейчас используется CGI?

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

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

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

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

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

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

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

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

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
DevOps
Скидка 25%
DevOps-инженер с нуля
Научитесь использовать инструменты и методы DevOps для автоматизации тестирования, сборки и развертывания кода, управления инфраструктурой и ускорения процесса доставки продуктов в продакшн. Станьте желанным специалистом в IT-индустрии и претендуйте на работу с высокой заработной платой.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Git Flow - это специальная система ветвления для Git. Она помогает команде лучше контролировать и добавлять различные версии про
img
Docker — популярная платформа виртуализации на уровне ОС. Она поставляет приложения в пакетах (контейнерах), которые, представля
img
Хуки в Git — это bash-скрипты, которые запускаются до или после команд Git, например, коммитов и пушей. Они позволяют автоматизи
img
  Nomad и Kubernetes – это две самые популярные платформы оркестровки, предназначенные для оркестровки динамических рабочих нагр
img
  Давайте узнаем о новом Ops-течении – GitOps! DevOps поспособствовал цифровизации многих компаний. Речь идет о командах разрабо
img
  Канареечное (canary) развёртывание – это метод разработки и развертывания программного обеспечения, который позволяет выпускат
21 ноября
20:00
Бесплатный вебинар
Введение в Docker