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

Добавление встраиваемых HTTP сервисов и динамического контента во встраиваемые веб-приложения

Статья включает:

Где следует размещать файлы?
Запуск Web-сервера slinger
Динамический HTML
Метод CGI
Метод SSI
Метод с использованием сервера данных
Меры обеспечения безопасности
Примеры

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

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

16_1.png
Рисунок 1. Пример сервера данных

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

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


Caution: Обращайте особое внимание на место размещения файлов. Каталог для них (или каталоги) не должен быть доступен извне, иначе ваша система может подвергаться необоснованному риску. Например, не размещайте 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

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

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

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

slinger &


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

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


Во многих встраиваемых серверах при добавлении страниц пользователю приходится повторно соединяться с сервером, что является угрозой надежности, потому что программные коды поставщика и пользователя оказываются в разделяемом пространстве памяти. Несмотря на свой размер, сервер 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 будут отключены, а все запросы на исполнения этих сценариев будут приводить к ошибке.


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

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


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

У сервера slinger существует несколько переменных окружения, которые используются в CGI-сценариях. Более подробно об этом см. в описании программы slinger.

Метод 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, которые вы можете использовать в своих сценариях.

Отображение времени и даты:
<!--#echo var="DATE_LOCAL" -->
Отображение времени и даты по Гринвичу:
<!--#echo var="DATE_GMT" -->
Отображение IP-адреса посетителя:
<!--#echo var="REMOTE_ADDR" -->
Отображение информации о браузере посетителя:
<!--#echo var="HTTP_USER_AGENT" -->
Отображение даты последнего изменения страницы:
<!--#config timefmt = "%A %B %d, %y" --> Последнее изменение этого файла <!--#echo vars="LAST_MODIFIED" -->
Включить в данном месте HTML-документа содержимое файла myfile.shtml:
<!--#include virtual = "myfile.shtml" -->
Выполнить CGI-сценарий counter.pl и поместить выходные результаты его работы на Web-страницу:
<!--#exec cgi = "counter.pl" -->
Отобразить на Web-странице содержимое каталога /tmp:
<!--#config cmdecho = "ON" --><!-- #exec cmd = "cd /tmp; ls" -->

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

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

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

Более подробно о процессе сервера данных см. в описании программы ds. Там же приведен пример приложения, осуществляющего мониторинг устройства.

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

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

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

Не подвергайте необоснованному риску вашу машину. Проверьте, чтобы:

Данные рекомендации помогут избежать ситуации несанкционированной замены файла с паролем или Web-страниц.

Более подробно об этом см. в разделе Обеспечение безопасности системы.

Примеры

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

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

export HTTPD_ROOT_DIR=/usr/local/httpd export HTTPD_ROOT_DOC=index.html export HTTPD_SCRIPTALIAS=/usr/www/cgi-bin slinger &

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

export HTTPD_ROOT_DIR=/usr/www export HTTPD_ROOT_DOC=index.html export HTTPD_SCRIPTALIAS=/usr/www slinger &

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

export HTTPD_ROOT_DIR=/usr/local/httpd export HTTPD_ROOT_DOC=index.shtml export HTTPD_SCRIPTALIAS=/usr/www/cgi-bin slinger -des&

Сценарии

Далее приводятся два примера простого 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:

<H2>Случайное изображение</H2> <P> Perl Script: <!--#exec cgi="rand_images.pl" --><BR> C Program: <!--#exec cgi="rand_images.cgi" --><BR>

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

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

cc -o rand_images.cgi rand_images.с

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

/* Данная программа генерирует случайное число и затем выбирает изображение в зависимости
* от этого числа. В результате при каждой загрузке Web-страницы изображение меняется. */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/* установка переменных */
char *dir = "/images/";
char *files[] = { "file1.jpg", "file2.jpg", "file3.jpg", "file4.jpg", "file5.jpg" };
int num;
int size;
int main()
{
size = sizeof (files) / sizeof (files[0]);
srand( (int)time( NULL ) );
num = rand() % 4;
/* Печать заголовка со случайным именем файла и базовым каталогом */
printf( "<img src=\"%s%s\" alt=%s border=1 >\n<BR>", dir, files[num], files[num] );
printf( "Location: %s%s\n\n<BR>",dir, files[num] );
return (0);
}

Скрипт rand_images.pl

#!/usr/bin/perl
# Данный сценарий генерирует случайное число, а затем выбирает изображение в зависимости
# от этого числа. В результате при каждой загрузке Web-страницы изображение меняется.
# установка переменных
$dir = "/images/";
@files = ( "file1.jpg", "file2.jpg", "file3.jpg", "file4.jpg", "file5.jpg" );
srand( time ˆ $$ );
$num = rand( @files ); # Pick a Random Number
# Печать заголовка со случайным именем файла и базовым каталогом
print "<img src=\"$dir$files[$num]\"
alt=$files[$num] border=1 >\n<BR>";
print "Location: $dir$files[$num]\n\n<BR>";




Предыдущий раздел: перейти