Ж у р н а л   о   к о м п ь ю т е р н ы х   с е т я х   и   т е л е к о м м у н и к а ц и о н н ы х   т е х н о л о г и я х
СЕТИ И СИСТЕМЫ СВЯЗИ on-line
  ПОИСК: ПОДПИСКА НА НОВОСТИ: НОМЕР:
    ДОМОЙ • Архив: Новостей | Конференций | НомеровПодписка
 
   
 
   
    
РЕДАКЦИЯ
 
Все о журнале
Подписка
Как проехать
Где купить
Отдел рекламы
График выхода журнала
Адреса в Интернет

РУБРИКАТОР
   
• Инфраструктура
• Информационные
   системы

• Сети связи
• Защита данных
• Кабельные системы
• Бизнес
• Колонка редактора
• Электронная
   коммерция

• Только на сервере
• Системы
   учрежденческой
   связи

• Новые продукты


Rambler's Top100

  

Прикладные программные интерфейсы для Web

Барри Нэнс

CGI, ISAPI, ICAPI, NSAPI — это еще далеко не полный перечень средств реализации прикладных задач во Всемирной паутине. Какое же из них следует выбрать для обслуживания посетителей вашего Web-узла? В последнее время разработчики часто предпочитают простым решениям замысловатые, полагая, что в незатейливых может оказаться что-то не так. Ведь наверняка у производителей ПО были какие-то причины для создания усложненных продуктов, не так ли? Ну а тратить время и силы на решение несуществующих проблем — слишком накладное занятие. По этому поводу Марк Твен сказал следующее: "Я знал, что в жизни меня ждет много неприятностей. К счастью, большая часть их так и не произошла".

При использовании интерфейса CGI (Common Gateway Interface) недостаточная производительность Web-узла может подтолкнуть вас к использованию интерфейсов низкого уровня, например таких, как Internet Server Application Programming Interface (ISAPI) фирмы Microsoft, Internet Connection API (ICAPI) фирмы IBM, Netscape API (NSAPI) фирмы Netscape Communications или других серверных API. Если вы планируете заменить CGI на какое-либо другое средство, которое позволило бы вам получить более высокую производительность, прочитайте данную статью — в ней вы найдете то, что необходимо знать, прежде чем начинать разработку приложения.

Вообще-то, производители ПО предлагают множество Web-ориентированных средств разработки, их ассортимент постоянно растет и может смутить даже бывалого программиста. Хотя CGI и преобладает сегодня, он не без оснований считается слишком медленным. Сейчас все большее внимание привлекают языки Java и JavaScript, но и их не считают быстрыми. Программные интерфейсы ISAPI, ICAPI и NSAPI являются конкурирующими между собой, если рассматривать их с позиций непосредственного подключения к Web-серверу, обработки HTML-потоков внутри него и модификации его поведения. При этом производительность Web-сервера (т. е. скорость его отклика) в любом случае всегда должна быть главным критерием для разработчиков.

Мы проанализировали все эти интерфейсы, чтобы выяснить целесообразность их использования, и пришли к любопытному выводу: с одной стороны, построение компьютерной программы, основанной на одном из интерфейсов — ISAPI, ICAPI или NSAPI, а не на обобщенном интерфейсе приложений CGI, может увеличить стоимость разработки и риск краха Web-сервера, усложнить тестирование, а также ограничить выбор платформы для сервера; с другой — специализированные серверные программные интерфейсы позволяют предпринять некоторые дополнительные меры (например, аутентификацию пользователя) в рамках Web-серверного процесса.

Основные характеристики

Как уже говорилось, CGI, ISAPI, ICAPI и NSAPI — это программные интерфейсы, а не среды разработки или полноценные языки программирования. Самым популярным из них является CGI, поддерживающий большинство Web-серверных платформ, он проще для программирования и безопаснее в применении, чем интерфейсы ISAPI, ICAPI и NSAPI. Если пользователь хочет выполнить CGI-приложение, он нажимает кнопку запуска на Web-странице, содержащей элемент "form" языка HTML, а Web-сервер запускает компьютерную программу, написанную, например, на языке Cи или Perl.

Интерфейс CGI определяет среду, в которой выполняется запущенная на сервере компьютерная программа. Информация о пользователе (его IP-адрес, доменное имя или номер порта и т. п.) и данные, введенные им в форму, поступают в CGI-программу из стандартного потока ввода STDIN или в виде переменных среды. Программа выполняется как отдельный процесс, а результат ее работы (динамически созданная Web-страница) возвращается Web-серверу через стандартный поток вывода STDOUT.

Интерфейсы ISAPI, ICAPI и NSAPI используются для непосредственного управления поведением Web-сервера. Так, ISAPI позволяет осуществлять доступ к функциям и службам Web-сервера Internet Information Server (IIS) фирмы Microsoft, NSAPI — Web-сервера фирмы Netscape, а ICAPI — Web-сервера Internet Connection Server фирмы IBM. В каждом отдельном случае применения интерфейсов пишется программный код, который вызывается Web-сервером как выходная пользовательская процедура (user exit routine) или "закладка" (user hook). Процедуры вызываются в некоторых заданных (опубликованных) точках программного кода Web-сервера и записываются не в виде отдельных программ, а в виде набора библиотечных функций, действующих в качестве расширения Web-сервера.

Запускаемая Web-сервером CGI-программа — отдельный процесс, загружаемый операционной системой с диска. Для пользователя, смотрящего на экран, слишком большой размер исполняемого CGI-файла может увеличить время отклика системы, поскольку его загрузка с диска в память потребует некоторого времени. Если CGI-программа интерпретируемая (например, написана на языке REXX или Perl), она будет выполняться еще медленнее. При наличии сотен или тысяч обращений к HTML-форме произойдет запуск сотен или тысяч CGI-программ соответственно, каждая из которых будет обрабатывать эту форму (справедливости ради отметим, что достаточно "разумные" операционные системы, в частности Unix, могут повторно использовать уже загруженный программный код первого процесса, создавая для каждого нового обращения только свой экземпляр данных).

В пользу CGI говорит тот факт, что для написания таких программ подходит почти любой язык программирования. Если он обеспечивает доступ к переменным среды и ввод-вывод через стандартные потоки STDIN и STDOUT, вы можете применить его для написания CGI-программ. Существуют интерпретаторы языка Perl, предназначенные для различных интерфейсов Web-серверов.

Программа, основанная на использовании ISAPI, — это не самостоятельно исполняемый модуль, а библиотека динамической загрузки (Dynamic Link Library — DLL). Фирмы Microsoft и Progress Software разработали ISAPI для двух видов расширений Web-серверов: модулей типа Internet Server Application (ISA) и ISAPI-фильтров. DLL-модули типа ISA загружаются и выполняются так же, как CGI-программы. HTML-конструкция для вызова ISA-модуля имеет следующий вид: <form method=POST action=/scripts/ISA-func.dll>. Когда сервер IIS получает запрос от браузера, он загружает DLL-модуль. Функции последнего используют интерфейс ISAPI для получения данных из управляющих блоков (Extension Control Blocks — ECB), где содержится информация, аналогичная той, которую CGI-программа получает из переменных среды. Модуль типа ISA применяет ISAPI для обработки запроса и пересылки его результата (например, динамически созданной HTML-страницы) на браузер.

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

ISAPI-фильтр совершенно не имеет ничего общего с CGI-программой. При регистрации ISAPI-фильтра на сервере IIS DLL-модуль сообщает, какие события он собирается обрабатывать. Для этого используется структура данных HTTP_FILTER_VERSION. Вам необходимо отредактировать системный реестр таким образом, чтобы он содержал эти условия фильтрации. При наступлении события программа IIS каждый раз будет вызывать соответствующую функцию ISAPI-фильтра. Однако учтите, что в отношении объема обработки событий должен быть выработан взвешенный подход. Попытка "перехватить" слишком большое число событий может замедлить работу Web-сервера, поэтому, чтобы обрабатывать несколько запросов одновременно, ISAPI-фильтр и ISA-модуль должны быть многопоточными. Лучшим средством построения модулей обоих типов на основе ISAPI является компилятор Visual C++ фирмы Microsoft.

ISAPI-фильтр может помещать дополнительную информацию в журнал регистрации доступа к Web-серверу, обеспечивать предопределенные методы для обработки форм и накладывать дополнительный уровень аутентификации на некоторые HTML-запросы. В сущности, ISAPI-фильтр представляет собой расширение Web-сервера, которое может выполнять "заказные" функции и взаимодействовать с сервером или HTML-потоками.

При обработке клиентских HTML-потоков NSAPI- и ICAPI-программы, использующие интерфейс NSAPI, способны более "тонко" управлять поведением Web-сервера, чем ISAPI. По существу, ICAPI-интерфейс — это разновидность NSAPI-интерфейса фирмы Netscape, созданная компанией IBM для своего пакета Internet Connection Server. Интерфейсы NSAPI и ICAPI расширяют возможности Web-сервера таким же образом, как и интерфейс ISAPI. Чтобы придать дополнительные возможности Web-серверу фирмы Netscape, вы можете использовать NSAPI точно так же, как и ISAPI — по отношению к Web-серверу фирмы Microsoft. Для ОС Windows NT библиотеки NSAPI и ICAPI реализованы в виде DLL-модулей, а для Unix — в виде библиотек для совместного использования (shared libraries).

В интерфейсе NSAPI все прикладные функции (такие, как внутренние функции сервера, допускающие работу с задаваемой пользователем выходной процедурой) делятся на пять классов: AuthTrans, NameTrans, PathCheck, ObjectType и Service.

Функции класса AuthTrans помогают расшифровать данные авторизации, которые посылает браузер. Функции класса NameTrans преобразуют виртуальный путь к каталогу, например /bankacct, в абсолютный путь, в частности в /usr/bin/netscape/ bankacct/. Процедуры класса PathCheck проверяют права доступа пользователя к данному каталогу. Функции класса ObjectType служат для поиска объектов файловой системы. Функции класса Service представляют собой "сердцевину" интерфейса NSAPI: с их помощью вы можете обрабатывать и посылать ответы на клиентские браузеры. О принадлежности написанных вами функций к тем или иным пользовательским выходным процедурам сервер узнает из соответствующих записей в текстовых файлах OBJ.CONF и MAGNUS.CONF.

Компилятор Visual C++ фирмы Microsoft для Windows NT или поставляемые производителями операционных систем компиляторы C/C++ для различных версий Unix могут служить инструментальным набором средств при построении программ, использующих интерфейс NSAPI. Разработка же программ c интерфейсом ICAPI требует наличия компилятора Visual Age C++ фирмы IBM.

Для NSAPI-приложений, как и в случае использования ISAPI-фильтра, необходимо предусмотреть одновременную многопоточную обработку большого числа обращений к Web-странице. Организуя доступ к HTML-странице, следует учитывать особенности структуры данных NSAPI, а также значения таких параметров, как URL, номер версии браузера и идентификатор пользователя. Кроме того, ваш программный код надо протестировать непосредственно с сервером фирмы Netscape.

Использование API

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

С точки зрения искусства программирования "многопоточная природа" интерфейсов NSAPI, ISAPI и ICAPI (в противоположность интерфейсу CGI) предоставляет новые возможности. В случае нескольких одновременных обращений к Web-странице необходимо отслеживать каждое обращение и поддерживать для него отдельный экземпляр данных. Альтернативой является выделение критических участков кода и использование функций программного интерфейса для непрерывного их выполнения. Вы можете применить семафоры для защиты данных от многократных одновременных изменений, но это потребует очень кропотливой работы.

Даже если не принимать во внимание поддержку многопоточности, работать с интерфейсами NSAPI, ISAPI, и ICAPI будет для вас сложнее, чем с интерфейсом CGI, но эта сложность находится в пределах разумного. Овладение миром доступных извне внутренних функций Web-сервера требует от программиста специальных знаний, а не гениальности. Если вы способны написать и отладить, кроме обычной программы, DLL-модуль, то смело сможете пользоваться этими интерфейсами.

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

Если CGI-программирование сравнить с поездкой в автомобиле от дома до магазина и обратно, то использование внутренних интерфейсов Web-серверов, NSAPI, ISAPI и ICAPI больше похоже на автогонки. Авария с автомобилем по дороге в магазин может закончиться для вас помятым крылом, опозданием домой, ну и, наконец, визитом в страховую компанию. А авария на трассе автогонок зачастую приводит к перерыву в гонках до тех пор, пока не будут ликвидированы ее последствия. Ошибка в CGI-программе редко влечет за собой остановку Web-сервера, если последняя вообще случается. Ошибка в DLL-модуле легко приводит к краху Web-сервера, поскольку модуль "вмешивается" в работу его внутренних функций.

Действительно, по сравнению с CGI-программами программы, основанные на интерфейсах NSAPI, ISAPI и ICAPI, иногда могут уменьшить время ожидания отклика Web-сервера. Однако следует иметь в виду, что выигрыш в производительности, если он есть, зависит от ряда факторов. Например, загрузка DLL-модуля при первом вызове может занимать столько же времени, сколько и загрузка CGI-программы. Учтите, что программа, написанная на языке Cи, как правило, работает быстрее, чем программа на языке Perl или REXX, поэтому проблему производительности может решить простой перевод программы на другой язык. Пропускная способность линии связи, средства кэширования браузера, производительность ЦПУ, скорость обмена информацией с диском и производительность самого Web-сервера — все это влияет на величину скорости, с которой выполняется процесс "запрос-ответ". Было бы ошибочно думать, что наилучшим является какое-то одно-единственное известное вам решение. Выбирая определенный подход, особенно для решения проблем, связанных с производительностью, необходимо сначала разобраться, где находится "узкое" место.

***

Интерфейс CGI прост в использовании, доступен для большинства платформ и относительно надежен. При определенной изобретательности, используя CGI, вы сможете справиться с такими задачами, для которых в иной ситуации пришлось бы применять NSAPI, ISAPI или ICAPI. Занесение дополнительных данных в журналы регистрации и даже выполнение дополнительной аутентификации можно реализовать в рамках CGI. Однако если вам нужна "тонкая" настройка Web-сервера (например, для обеспечения защиты информации) и вас не пугает привязка приложений к определенному типу Web-сервера, да к тому же вы можете позволить себе дополнительные расходы, то, обратившись к интерфейсам ISAPI, ICAPI или NSAPI, вы сделаете правильный выбор


распечатать статью




  
7 '1997
СОДЕРЖАНИЕ

колонка редактора

• Microsoft и сыр

локальные сети

• Коммутаторы Ethernet и Fast Ethernet. Сделай правильный выбор

• Как Кристофер Робин модернизировал свое предприятие

• Масштабируемость сервера

корпоративные сети

• Лучшие продукты 1997 года

услуги сетей связи

• Оптические абонентские сети - уже сегодня

• CDMA: сказка становится былью

• Технология ADSL

интернет и интрасети

• Меняю ваучер на компьютер с доступом в Интернет

• Групповое ПО: миграция в Интернет

• Если TCP упрямится

• Прикладные программные интерфейсы для Web

защита данных

• ИБП для централизованных систем питания

• "Спасательное" ПО, или Как удержаться на плаву

новые продукты

• Коммутатор ForeRunnerLE 155 фирмы FORE Systems, Универсальный сетевой анализатор PrismLite

только на сервере

• Вокруг сетевого компьютера

• Интернет в вопросах и ответах

• Рецепты для корпоративных пользователей Интернет



 Copyright © 1997-2007 ООО "Сети и Системы Связи". Тел. (495) 234-53-21. Факс (495) 974-7110. вверх