Простой общий интерфейс шлюза - Simple Common Gateway Interface

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

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

Протокол SCGI использует тот факт, что клиент уже проанализировал и подтвердил HTTP-запрос, и канонически передает запрос на сервер SCGI, позволяя программисту приложения избежать синтаксического анализа неоднозначностей и пограничных случаев протокола. Это позволяет избежать сложных правил синтаксического анализа и объединения заголовков из RFC2616, что значительно снижает сложность процесса сервера SCGI.

История

Нил Шеменауэр опубликовал оригинальную спецификацию протокола SCGI от октября 2001 года.[1] Он разработал первые реализации SCGI и первоначально опубликовал их в апреле 2002 года.[2]

Технические характеристики

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

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

Запрос SCGI - это конкатенация из netstring -кодированные заголовки и тело. Ответ SCGI - это обычный HTTP-ответ.

Каждый заголовок состоит из пара имя-значение, где и имя, и значение строки с завершающим нулем (C струны ). Значение может быть пустой строкой, и в этом случае завершающий нуль все еще остается. Ни имя, ни значение не могут содержать никаких встроенных нулевые байты. Эти соображения являются стандартными для строк C, но часто сбивают с толку программистов, привыкших к другим стандартам обработки строк.

Все предоставленные заголовки соединенный чтобы сформировать однобайтовую последовательность, затем netstring -кодировано. Затем добавляется необработанное тело, если оно есть.

В заголовках запросов не допускаются повторяющиеся имена; RFC2616 -совместимое комбинирование заголовков[заметка 2] должно быть, уже произошло. Первый заголовок запроса должен иметь имя «CONTENT_LENGTH» и значение, которое представляет собой длину тела в десятичном формате. Заголовок запроса «CONTENT_LENGTH» должен присутствовать всегда, даже если его значение равно «0». Также всегда должен быть заголовок запроса с именем «SCGI» и значением «1». Стандартный CGI переменные среды должны быть предоставлены в заголовках SCGI для совместимости при преобразовании старых программ CGI в SCGI. Тело запроса (если есть) следует за заголовками; его длина определяется заголовком запроса «CONTENT_LENGTH».

Хотя протокол SCGI изолирует программиста службы от некоторых соображений HTTP, различных деталей (таких как интерпретация октетов тела сообщения в соответствии с заголовком Transfer-Encoding, CONTENT_LENGTH - это количество октетов после того, как тело было закодировано для передачи, и т. Д. .) по-прежнему требуют знания спецификации протокола HTTP.

Пример

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

       "70:" "CONTENT_LENGTH" <00> "27" <00> "SCGI" <00> "1" <00> "REQUEST_METHOD" <00> "POST" <00> "REQUEST_URI" <00> "/ глубокая мысль" <00> "," "Каков ответ жизни?"

Сервер SCGI отправляет веб-серверу следующий ответ:

       "Статус: 200 ОК" <0d 0a> "Content-Type: text / plain" <0d 0a> "" <0d 0a> "42"

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

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

(этот список не полный)

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

SCGI может быть реализован на любом языке, поддерживающем сетевые розетки и netstrings. Ниже приводится неполный список языков с известными привязками SCGI:

Смотрите также

Протоколы приложений / Gatway:

  • Общий интерфейс шлюза (CGI) - Запускает дочерний процесс по запросу
  • FastCGI - Попытки повысить масштабируемость за счет поддержки длительных процессов, подобных CGI.
  • Протокол Apache JServ - Бинарный протокол, предназначенный для прокси-запросов между веб-сервером и сервером приложений.

Хосты приложений (зависит от языка):

Примечания

1.^ Документ спецификации был размещен в открытом доступе Нилом Шеменауэром 12 января 2006 г.
2.^ Для объединения заголовков HTTP см. RFC2616 раздел 4.2.

Рекомендации

  1. ^ Шеменауэр, Нил (30 октября 2001 г.). «SCGI: простой альтернативный интерфейс общего шлюза». Архивировано из оригинал на 2002-04-03.
  2. ^ "scgi-0.1.tar.gz". Индекс / программное обеспечение / файлы / scgi. MNX: MEMS и обмен нанотехнологиями. 12 апреля 2002 г. Архивировано с оригинал на 2002-10-20.

внешняя ссылка