Простой общий интерфейс шлюза
Эта статья нуждается в дополнительных цитатах для проверки . ( октябрь 2017 г. ) |
Простой общий интерфейс шлюза ( SCGI ) — это протокол взаимодействия приложений с HTTP -серверами в качестве альтернативы протоколу CGI . Он похож на FastCGI , но упрощён для анализа. В отличие от CGI, он позволяет длительному процессу обслуживания продолжать обслуживать запросы, избегая тем самым задержек в ответе на запросы из-за накладных расходов на настройку (например, соединения с базой данных).
SCGI — это протокол , определяющий связь между веб-сервером и сервером приложений. В этом отличие от CGI, который представляет собой более ранний интерфейс приложения (шлюза), разработанный для того, чтобы позволить программисту приложения избежать сложности сокетов и длительных сервисных процессов, когда приемлема плохая масштабируемость и высокие накладные расходы.
Протокол SCGI использует тот факт, что веб-сервер уже проанализировал и подтвердил HTTP-запрос, и канонически передает запрос на сервер SCGI, позволяя программисту приложения избежать неоднозначностей анализа и пограничных случаев протокола. Это позволяет избежать сложных правил анализа и объединения заголовков из RFC 2616, существенно усложняя процесс сервера SCGI.
История
[ редактировать ]Нил Шеменауэр опубликовал оригинальную спецификацию протокола SCGI, датированную октябрем 2001 года. [ 1 ] Он разработал первые реализации SCGI и опубликовал их в апреле 2002 года. [ 2 ]
Спецификация
[ редактировать ]Клиент подключается к серверу SCGI по надежному потоковому протоколу, позволяющему передавать 8-битные байты. Клиент начинает с отправки запроса. Когда сервер SCGI видит конец запроса, он отправляет ответ и закрывает соединение. Формат ответа конкретно не указан в этом протоколе, хотя обычно используются HTTP-ответы, эквивалентные CGI. [примечание 1]
Формат запроса
[ редактировать ]Запрос SCGI представляет собой объединение заголовков , закодированных в сетевой строке , и тела. Ответ SCGI — это обычный ответ HTTP.
Каждый заголовок состоит из пары имя-значение , где и имя, и значение представляют собой строки с нулевым завершением ( строки C ). Значением может быть пустая строка , и в этом случае завершающий нуль все равно остается. Ни имя, ни значение не могут содержать внедренных нулевых байтов . Эти соображения являются стандартными для строк C, но часто сбивают с толку программистов, привыкших к другим стандартам обработки строк.
Все предоставленные заголовки объединяются в одну последовательность байтов, а затем кодируются в виде сетевой строки . Затем добавляется необработанное тело, если таковое имеется.
Повторяющиеся имена в заголовках запроса не допускаются; Объединение заголовков в соответствии с RFC 2616 [примечание 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> "/deepthought" <00> "," "What is the answer to life?"
Сервер SCGI отправляет обратно на веб-сервер следующий ответ:
"Status: 200 OK" <0d 0a> "Content-Type: text/plain" <0d 0a> "" <0d 0a> "42"
Сервер SCGI закрывает соединение.
Веб-серверы, реализующие SCGI
[ редактировать ](этот список не полный)
- HTTP-сервер Apache
- Чероки
- Лайттпд
- Microsoft Internet Information Services с расширением ISAPI SCGI
- nginx
- Althttpd [ 3 ]
Языковые привязки для SCGI API
[ редактировать ]SCGI может быть реализован на любом языке, поддерживающем сетевые сокеты и сетевые строки . Ниже приведен неполный список языков с известными привязками SCGI:
- Кобра
- D , с arsd.cgi библиотекой
- Emacs Lisp с url-scgi библиотекой
- Вперед , с scgi пакетом
- Хаскелл
- Java , с разъемом SCGI или с [1] библиотекой
- Лисп
- Perl с пакетом SCGI или Plack . платформой
- PHP
- Питон
- Ракетка с scgi библиотекой
- Руби
- Rust с tokio-scgi ящиком
- Схема
- Ткл
- Nim
См. также
[ редактировать ]Протоколы приложений/шлюзов:
- Common Gateway Interface (CGI) — запускает дочерний процесс по запросу.
- FastCGI — попытка повысить масштабируемость за счет поддержки длительных процессов, подобных CGI.
- Протокол Apache JServ — двоичный протокол, предназначенный для передачи запросов между веб-сервером и сервером приложений.
Хосты приложений (в зависимости от языка):
- Rack — Ruby интерфейс веб-сервера
- PSGI — Perl интерфейс шлюза веб-сервера
- WSGI — Python интерфейс шлюза веб-сервера
- JSGI — JavaScript. интерфейс шлюза веб-сервера
Примечания
[ редактировать ]- 1. ^ Документ спецификации был размещен в открытом доступе Нилом Шеменауэром 12 января 2006 года.
- 2. ^ Для объединения заголовков HTTP см. раздел 4.2 RFC2616 .
Ссылки
[ редактировать ]- ^ Шеменауэр, Нил (30 октября 2001 г.). «SCGI: альтернатива простому общему интерфейсу шлюза» . Архивировано из оригинала 3 апреля 2002 г.
- ^ "scgi-0.1.tar.gz" . Индекс /software/files/scgi. MNX: Биржа МЭМС и нанотехнологий . 12 апреля 2002 г. Архивировано из оригинала 20 октября 2002 г.
- ^ «Althttpd: Веб-сервер Althttpd» . sqlite.org . Проверено 19 мая 2023 г.