SCGI (Simple Common Gateway Interface)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 21:59, 8 ноября 2016.
SCGI
Scgi.jpg
Создатели: Neil Schemenauer
Разработчики: The GNU
Выпущена: June 2008; 14 years ago (2008-06)
Постоянный выпуск: 3:3 / 2 March 2016 года; 6 years ago (2016-03-02)
Предыдущий выпуск: 0.1 / 25 May 2010 года; 12 years ago (2010-05-25)
Состояние разработки: Active
Написана на: Многоязычный (указаны в статье)
Операционная система: Linux, OS X, Windows
Тип ПО: Raster graphics editor
Лицензия: LGPLv3
Веб-сайт www.neilvandyke.org/racket/scgi/

Simple Common Gateway Interface (SCGI) — протокол по взаимодействию приложений с веб (http) серверами, разработанный как альтернатива Common Gateway Interface. Он похож на FastCGI, но проще в реализации.
Спецификация была опубликована Neil Schemenauer <nas@python.ca> 12 января 2006 года.

Введение

SCGI библиотека реализует быстрый веб-CGI, используя протокол SCGI. Этой библиотекой пользуются в сочетании с сервером HTTP, поддерживающим SCGI,такой как Apache HTTP Server с модулем mod_scgi.
Библиотека SCGI также поддерживает работу, как обычный веб-CGI без каких-либо изменений в исходном коде приложения, например, во время разработки приложения, намеревался быть развернутым, с использованием SCGI. Это также дает гибкость в развертывании, позволяя системному администратору переключиться между любым режимом, путем редактирования конфигурации HTTP-сервера.
Протокол SCGI был определен Neil Schemenauer в “SCGI: в "SCGI: простая альтернатива Common Gateway Interface" от 2008-06-23.
Пример использования этой библиотеки:

(require scgi) 
(cgi #:startup  (lambda ()
(printf "Startup for cgi-type ~S..."
(cgi-type)))
 
#:request  (lambda ()
(display "Content-type: text/html\r\n\r\n")
(display "<p>Hello, world!</p>")
(printf "<p>Your IP address is: ~S</p>"
(cgi-remote-addr)))
 
#:shutdown (lambda ()
(printf "Shutdown for cgi-type ~S..."
(cgi-type))))

Процедура, предусмотренная в #:request является той, которая вызывается для каждого запроса. В рамках этой процедуры имеется контекст запроса CGI, в котором процедуры можно назвать, как cgi-remote-addr, чтобы получить информацию об этом конкретном запросе. Все три процедуры вызываются в контексте CGI, в котором процедуры, касающиеся механизма CGI отдельно от индивидуальных запросов, таких как CGI-типа может быть назван. Много программ должны будут предоставить только #:request процедуру.

Спецификация

Клиент соединяется с сервером SCGI по надежному потоковому протоколу, позволяющему передачу 8-разрядных байтов. Клиент начинает работу, отправив запрос. Внизу находится формат запросов. Когда сервер SCGI видит конец запроса он посылает ответ и закрывает соединение. Формат ответа не определен этим протоколом.

Формат запроса

Запрос состоит из заголовков и тела. Формат заголовков:

headers ::= header*
header ::= name NUL value NUL
name ::= notnull+                
value ::= notnull+
notnull ::= <01> | <02> | <03> | ... | <ff>
NUL = <00>

Повторяющиеся имена не допускаются в заголовках. Первый заголовок должен иметь имя «CONTENT_LENGTH», а в его теле — непустой последовательности ASCII цифр — должна быть указана длина тела сообщения (в десятичном представлении). Заголовок "CONTENT_LENGTH" должен всегда присутствовать, даже если его значение "0". Должен также всегда быть заголовок с именем "SCGI" и значение "1". Чтобы упростить переход от CGI, стандартные переменные окружения CGI должны быть обеспечены как заголовки SCGI.

Заголовки отправляются на серверное приложение, закодированные как сетевые строки (англ. Netstring). Тело пересылается за заголовками и его длина должна определяться заголовком «CONTENT_LENGTH».

Пример

Веб-сервер (клиент SCGI) открывает соединение и посылает следующие строки:

 "70:"
"CONTENT_LENGTH" <00> "27" <00>
"SCGI" <00> "1" <00>
"REQUEST_METHOD" <00> "POST" <00>
"REQUEST_URI" <00> "/deepthought" <00>
","
"What is the answer to life?"

SCGI сервер посылает следующий ответ:

"Status: 200 OK" <0d 0a>
"Content-Type: text/plain" <0d 0a>
"" <0d 0a>
"42"

Затем сервер SCGI закрывает соединение.

Модуль Apache mod_scgi

Конфигурация Apache mod_scgi

HTTP-сервер Apache является одним из способов запустить SCGI, хотя это и не единственный способ. Обратите внимание, что установка Apache может не иметь модуль mod_scgi установки или включен по умолчанию. Если вам запускаете Debian GNU / Linux, этот модуль может быть установлен с помощью пакета Debian libapache2-Mod-SCGI.
После того, как вы установили mod_scgi, вам потребуются некоторые стандартные директивы SCGI, чтобы в конечном итоге в ваших конфигурационных файлах Apache, выполняете ли Вы это, редактируя файлы конфигурации вручную, делая символьные ссылки в "mods-enabled" каталоге или щелкнув в графическом интерфейсе GUI. Например, следующие загрузки mod_scgi, путь URL под "/ mypath" на сервер SCGI на локальной машине в стандартном SCGI TCP порту, и устанавливает 60-секундный тайм-аут для сервера SCGI, чтобы ответить на запрос, прежде чем Apache подаст соединение: LoadModule scgi_module /usr/lib/apache2/modules/mod_scgi.so SCGIMount / mypath 127.0.0.1:4000~~HEAD=pobj SCGIServerTimeout 60.
Существуют дополнительные директивы mod_scgi Apache конфигурации, в том числе SCGIHandler и SCGIServer.

Поиск неисправностей Apache mod_scgi

У этого раздела есть некоторые подсказки по поиску и устранению неисправностей. В настоящее время они прибывают из использования с mod_scgi на Apache 2.2.9 на GNU/Linux Debian.

  • Ошибочная tcp-запись “: ошибочная запись (Поврежденный канал; errno=32)” или “tcp-запись: ошибочная запись (Соединение сброшено коллегой; errno=104)” происходит, вероятно, из-за запроса HTTP, отброшенного клиентом HTTP (например, пользователь останавливает загрузку страницы в их браузере, прежде чем страница закончит загружаться), или ударом Apache SCGIServerTimeout для запроса. Обратите внимание на то, что буферизированный ввод-вывод означает, что Вы не обязательно получите эту ошибку, даже если запрос будет прерван этот путь.
  • Запись журнала ошибок Apache “Преждевременный конец заголовков сценария: СОЕДИНИТЕ КАНАЛОМ” сопровождаемый “(500) Неизвестная ошибка 500: scgi: Неизвестная ошибка 500: ошибка читая заголовки ответа” может означать, что SCGIServerTimeout был поражен, прежде чем любые HTTP-заголовки от обработчика запроса SCGI были запущены или завершены. Обратите внимание на то, что буферизированный ввод-вывод может означать, что часть кода Ракетки обработчика записала некоторый текст, но это еще не было сброшено клиенту SCGI.
  • Запись журнала ошибок Apache “(70007) определенный тайм-аут истекла: ap_content_length_filter: apr_bucket_read () неудавшийся” сопровождаемый “(70007) определенный тайм-аут истек: scgi: определенный тайм-аут истек: ap_pass_brigade ()” может означать, что SCGIServerTimeout был поражен после того, как HTTP-заголовки от обработчика запроса были получены клиентом SCGI.
  • Запись журнала ошибок Apache “(32) Поврежденный канал: scgi: Поврежденный канал: ошибка, отправляющая тело запроса”, могла бы произойти из-за обработчика запроса, законченного, не используя все данные POST HTTP.
  • Запись журнала ошибок Apache “(103) программное обеспечение вызвала аварийное прекращение работы соединения: scgi: программное обеспечение вызвало аварийное прекращение работы соединения: ap_pass_brigade ()” является другим, который может быть вызван клиентом HTTP, отбрасывающим соединение, прежде чем обработчик закончится.

Интерфейс SCGI для Perl

Этот модуль реализует интерфейс SCGI для сервера приложений.
Открытые методы
новый
Берет гнездо, сопровождаемое рядом вариантов (пары значения ключа), и возвращает нового слушателя SCGI. В настоящее время единственный поддержанный выбор блокирует, чтобы указать, что гнездо блокирует и что библиотека не должна рассматривать его соответственно. Дефолтом блокирование ложное. (ОТМЕТЬТЕ: блокирование - теперь названный, а не позиционный параметр. Используя, поскольку позиционный параметр произведет предупреждение в этой версии и бросит исключение в следующую версию).

принять
Принимает связь от гнезда и возвращает SCGI:: Запрос о нем.

гнездо
Возвращает гнездо, которое было передано конструктору.

блокировка
Прибыль, верная, если это было обозначено, что гнездо должно блокировать, когда объект SCGI был создан.
Пример кода:

use SCGI;
use IO::Socket;
 
my $socket = IO::Socket::INET->new(Listen => 5, ReuseAddr => 1, LocalPort => 8080)
or die "cannot bind to port 8080: $!";
 
my $scgi = SCGI->new($socket, blocking => 1);
 
while (my $request = $scgi->accept) {
$request->read_env;
read $request->connection, my $body, $request->env->{CONTENT_LENGTH};
# 
print $request->connection "Content-Type: text/plain\n\nHello!\n";
}

Версии SCGI

  • Версия 3:3 — 2016-03-02 - Настроенный info.rkt, имена файлов.
  • Версия 3:2 — 2016-02-25 - Фиксированный deps.
  • Версия 3:1 — 2016-02-25 - Прокомментированный код в "stress1-server.rkt" как самый целесообразный способ заставить новую системную сборку пакета передаваться.
  • Версия 3:0 — 2016-02-21 - Перемещение от PLaneT до новой системы пакета.
  • Версия 2:4 — 2015-04-02 - Тонкие настройки документации.
  • Версия 2:3 — 2014-11-23 - Удаленная выборка-1.rkt файла от пакета, чтобы уменьшить зависимости от пакета. (Предложенный Matt Gushee.)
  • Версия 2:2 — 2013-04-19 - Теперь разместите имена переменной SCGI, сгенерированные аутентификацией Mellon.
  • Версия 2:1 — 2013-04-12 - Теперь не блюет на заголовках как прокси-nokeepalive. (Благодаря Erik для отчета об ошибках и диагноза.)
  • Версия 2:0 — 2012-06-12 - У трех основных параметров процедур cgi процедуре теперь есть ключевые слова. Что является теперь #:startup, и #:shutdown параметры теперь также дополнительные. Преобразованный в McFly. Измененные внутренние единственные идентификаторы от наличия % снабжают префиксом к %scgi: префикс, чтобы помочь снимать неоднозначность, когда идентификаторы появляются в сообщениях об ошибках в больших системах. Изменения документации. Улучшение внутреннего макроса отладки.
  • Версия 0.6 — версия 1:5 — 2011-08-22 - Маленькие исправления документации.
  • Версия 0.5 — версия 1:4 — 2011-05-16 - Для ближе к обратной совместимости со Схемой 4.x PLT, измененными ссылками на модули ракетки, чтобы интриговать. Больше документации.
  • Версия 0.4 — версия 1:3 — 2011-05-16 - Добавленный #:reuse-scgi-port? параметр процедуре cgi. Добавленный несколько новых процедур переменной окружения CGI. Добавленный делают cgi переменную proc. cgi процедура теперь использует tcp-accept/enable-break, а не tcp-принять. Добавленный больше отладки журнала. Добавленная документация о mod_scgi конфигурации, поиске и устранении неисправностей и параметрах ключевого слова cgi процедуре. Удаленные заполнители документации для end-cgi-request на данный момент. Различное дополнительное тестирование гарантии качества было сделано, и больше - работы.
  • Версия 0.3 — версия 1:2 — 2010-11-14 - Добавленный cgi http агент пользователя.
  • Версия 0.2 — версия 1:1 — 2010-10-11 - Документация изменяется, чтобы отразить, что она успешно используется в реальной системе, и некоторая работа остается.
  • Версия 0.1 — версия 1:0 — 2010-05-25 - Начальный выпуск. Предварительный.

Веб-серверы, которые реализуют SCGI

  • Apache HTTP Server
  • Cherokee
  • Lighttpd
  • Mathopd - with unofficial patch
  • Microsoft Internet Information Services with ISAPI SCGI extension
  • nginx
  • Avuna HTTPD

Языковые привязки для SCGI API

  • Cobra
  • Haskell
  • Java, with SCGI connector
  • Lisp
  • Perl, with the SCGI Package
  • PHP
  • Python
  • Racket, with the SCGI: Web Server HTTP SCGI and CGI
  • Ruby
  • Scheme
  • Tcl
  • Nim

Примечание

Документ Спецификация был помещен в общественное достояние Нил Schemenauer 12 января 2006 года.

Литература

  1. [Электронный ресурс]: — Режим доступа: Спецификация SCGI
  2. [Электронный ресурс]: — Режим доступа: Спецификация netstrings
  3. [Электронный ресурс]: — Режим доступа: Библиотека ADA SCGI
  4. [Электронный ресурс]: — Режим доступа: Оригинальный интерфейс ADA SCGI
  5. [Электронный ресурс]: — Режим доступа: Модули Apache SCGI и интерфейс SCGI Phyton
  6. [Электронный ресурс]: — Режим доступа: Интерфейс SCGI на Perl
  7. [Электронный ресурс]: — Режим доступа: Пакет SCGI Hascell
  8. [Электронный ресурс]: — Режим доступа: Модуль nginx SCGI
  9. [Электронный ресурс]: — Режим доступа: Модуль TCL в SCGI
  10. [Электронный ресурс]: — Режим доступа: Расширение SCGI сервер IIS