16.
Настройка встраиваемого Web-сервера


ОСРВ Neutrino поставляется вместе с небольшим Web-сервером Slinger, оптимизированным для работы со встраиваемыми приложениями. Поскольку этот Web-сервер поддерживает общий шлюзовый интерфейс (Common Gateway Interface, CGI) версии 1.1, стандарт HTTP 1.1 и динамический HTML (через команды SSI), то во встраиваемые приложения можно просто добавлять встраиваемые услуги HTTP и динамическое содержание.

Например, можно написать приложение, которое управляет принтером и использует сервер Slinger для обновления удаленного клиента, где отображаются данные о текущем состоянии принтера (рис. 16.1).


Где следует размещать файлы?

Перед запуском Web-сервера Slinger и началом создания Web-страниц необходимо определить подходящую структуру каталогов и места для размещения файлов.

Предупреждение.

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

Для конфигурирования Web-сервера Slinger используйте следующие переменные окружения:

HTTPD_ROOT_DIR — имя каталога, где предполагается размещение файлов данных для Web-сервера Slinger. Имя каталога по умолчанию: /usr/local/httpd;

HTTPD_ROOT_DOC — имя основного (корневого) HTML-документа. Когда Web-клиент запрашивает основной документ, то значение HTTPD_ROOT_DOC присоединяется к значению HTTPD_ROOT_DIR, в результате чего формируется полный путь к основному документу. По умолчанию основному документу назначается имя index.html.

Например, если в качестве значения HTTPD_ROOT_DOC определено имя index.html, а в качестве значения HTTPD_ROOT_DIR определен каталог /usr/www, то в качестве полного пути в Web-сервере Slinger будет использоваться значение /usr/www/index.html.

После принятия решения о структуре каталога до запуска сервера Slinger нужно экспортировать указанные выше переменные окружения:

export HTTPD_ROOT_DIR=/usr/local/httpd

export HTTPD_ROOT_DOC=index.html

Подробности об установке переменных окружения см. в разделе 9.


Запуск Web-сервера Slinger

Для запуска Web-сервера Slinger нужно просто ввести команду:

slinger &

Примечание. Web-сервер Slinger работает поверх сокетов TCP. Поэтому должны быть запущены программы поддержки работы с сокетами, что означает необходимость запуска стека протокола TCP/IP. Подробности об этом см. в разделе 13.

Сервер Slinger осуществляет прослушивание порта 80 протокола TCP. Поскольку номер этого порта меньше значения 1024, то запуск сервера Slinger должен осуществляться от имени пользователя с учетной записью root. Сразу после присоединения к порту 80 сервер изменяет свой идентификатор пользователя на –2, используя для этого вызов (setuid (-2)).

Во многих встраиваемых серверах при добавлении страниц пользователю приходится повторно соединяться с сервером, что является угрозой надежности, потому что программные коды поставщика и пользователя оказываются в разделяемом пространстве памяти. Несмотря на свой размер, сервер Slinger предоставляет достаточно функциональных возможностей для поддержки доступа к динамически сгенерированным HTML-страницам через сценарии CGI или механизм SSI.

Динамический HTML

Встраиваемый Web-сервер предоставляет несколько путей создания динамических HTML-страниц:

Метод CGI

Встраиваемый Web-сервер поддерживает интерфейс CGI (Common Gateway Interface) версии 1.1, который представляет собой удобное средство для управления динамическими данными. Недостатком CGI является то, что он ресурсоемок из-за использования фрагментов на языке интерпретируемого типа.

Если вы используете интерфейс CGI, то нужно решить, где располагать каталог cgi-bin, в котором сохраняются CGI-сценарии.

Для настройки Web-сервера на использование интерфейса CGI необходимо применять переменную окружения HTTPD_SCRIPTALIAS, в которой указывается место расположения исполняемых файлов и CGI-сценариев, например:

export HTTPD_SCRIPTALIAS=/usr/www/cgi-bin


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

Предупреждение.

Не используйте для каталога CGI-сценариев имена /bin или /usr/bin. Не размещайте в каталоге cgi-bin никаких значимых файлов, потому что они не будут защищены от воздействия со стороны того, кто использует Web-сервер.

Проверьте, чтобы файлы в каталоге cgi-bin могли бы исполняться любым пользователем, но их изменение должно быть доступно только пользователям с учетной записью root. Поэтому для файлов этого каталога должен быть установлен код прав доступа 755 (нужно выполнить команду chmod 755).

Например, пусть для каталога в переменной окружения HTTPD_SCRIPTALIAS определено имя /usr/www/cgi-bin. Если сервер Slinger получит запрос на ресурс www.qnx.com/cgi-bin/get_data.cgi/foo, то будет выполнен найденный в каталоге /usr/www/cgi-bin сценарий get_data.cgi, а имя foo будет передано сценарию get_data.cgi в качестве пути. Имя каталога foo сохраняется в переменной окружения PATH_INFO, и оно используется для передачи дополнительной информации о пути.

У сервера Slinger существует несколько переменных окружения, которые используются в CGI-сценариях. Более подробно об этом см. в описании программы slinger в руководстве "Описание программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13 01.

Метод SSI


SSI (Server Side Includes, вставки на стороне сервера) представляет собой разновидность командного языка, элементы которого могут встраиваться в HTML-файлы. С помощью SSI можно добавлять к HTML-странице динамическое содержание. Для передачи информации SSI-команде exec в сервере Slinger используются переменные окружения PATH и CMD_INT. Просматривая динамические страницы HTML, клиенты могут использовать на своих Web-страницах в реальном времени интерактивные функции.

Клиенты могут создавать динамические HTML-страницы, помещая на них внутри кода HTML лексемы языка SSI. Лексема языка SSI включает в себя команду, управление которой осуществляет сервер Slinger. При передаче HTML-кода сервер Slinger заменяет лексему HTML-данными, основанными на теге, содержащемся в лексеме SSI.

Например, встраиваемый сервер может:

Для того чтобы лексемы языка SSI обрабатывались сервером Slinger, HTML-файл должен иметь расширение .shtml.

Теги языка SSI можно использовать для взаимодействия с сервером данных.

Синтаксис команд SSI

Далее приводится несколько примеров команд SSI, которые вы можете использовать в своих сценариях.

Отображение времени и даты:

 Метод с использованием сервера данных

Управлять динамическими HTML-страницами можно также с использованием сервера данных (процесс ds). Сервер данных позволяет использовать многопоточные разделяемые данные, независимо от границ процессов. Поскольку встраиваемый Web-сервер поддерживает язык SSI, мы решили расширить его возможности, добавив взаимодействие с сервером данных.

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

Более подробно о процессе сервера данных см. в описании программы ds в руководстве "Описание программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13 01. Там же приведен пример приложения, осуществляющего мониторинг устройства.


Меры обеспечения безопасности


Когда вы выбираете каталог для хранения файлов данных, мы советуем вам соблюдать следующие рекомендации:

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

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

Мы порекомендовали размещать файлы ваших документов и сценариев в разных каталогах. В приводимом далее примере для документов отводится каталог /usr/local/httpd, файл index.html размещается в корневом каталоге, а для CGI-сценариев предназначается каталог /usr/www/cgi-bin.

В следующем примере показан неправильный способ задания конфигурации сервера Slinger. При такой конфигурации возможна загрузка файлов со сценариями сторонним пользователем, поскольку документы и сценарии оказываются в одном и том же каталоге:

Для изменения конфигурации сервера Slinger таким образом, чтобы была возможность работать с командами SSI и проводить отладку, используйте следующие команды:

Сценарий

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

Исполняемую программу на С (rand_images.cgi) и сценарий на языке Perl (rand_images.pl) нужно поместить в каталог /usr/www/cgi-bin. Используйте команду chmod, чтобы проверить установку кода прав доступа 755 для обоих файлов.

Выбираемые изображения размещаются в каталоге /usr/local/httpd/images. Доступ к изображению со стороны Web-страницы происходит из локального каталога, в CGI-сценарии просто вычисляется, какое изображение нужно загрузить.

Для запуска сценария из Web-страницы используется следующий HTML-код с командами SSI:
Программа rand_images.с

Для компиляции этого приложения нужно выполнить команду:

Листинг программы:

/* Данная программа генерирует случайное число и затем выбирает

изображение в зависимости от этого числа. В результате

при каждой загрузке Web-страницы изображение меняется.

*/

Программа rand_images.pi