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.
Например, встраиваемый сервер
может:
-
исполнять утилиты в указываемой пользователем
точке HTML-документа (в качестве дополнительной
возможности выходные результаты этих утилит могут быть
включены в состав документа);
-
вставлять в указанную пользователем точку
содержимое других HTML-файлов;
- исполнять условные
операторы (например, if, break, goto), чтобы определить, какие
части HTML-документа должны передаваться.
Для того чтобы
лексемы языка 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 в руководстве "Описание
программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13
01. Там же приведен пример приложения, осуществляющего
мониторинг устройства.
Меры обеспечения безопасности
Когда вы выбираете каталог для
хранения файлов данных, мы советуем вам соблюдать следующие
рекомендации:
-
не размещайте в каталоге для документов
значимые для работы файлы;
-
изолируйте каталог с вашими файлами данных от
каталога с системными файлами. Например, использовать
каталог /usr/www гораздо безопаснее, чем
корневой каталог /. Корневой каталог / открывает для
обслуживания сервером Slinger всю вашу систему.
При конфигурировании сервера Slinger
для поддержки работы с CGI-сценариями придерживайтесь таких
рекомендаций:
-
размещайте CGI-сценарии в каталоге,
изолированном от каталога с обычными системными
исполняемыми файлами. Не используйте для этих целей
каталоги /bin или /usr/bin;
-
если владельцем файла является
привилегированный пользователь (например, имеющий
учетную запись root), то не допускайте
установку для CGI-сценария флага SUID;
-
храните файлы CGI-сценариев и файлы документов
в разных каталогах. Это предотвратит от получения
несанкционированного доступа к файлам сценариев.
Не подвергайте необоснованному риску
вашу машину. Проверьте, чтобы:
-
все файлы и каталоги имели атрибут "только
чтение";
-
не было файлов, владельцем которого был бы
пользователь с ID (-2), потому что под этим
идентификатором запускается сервер Slinger, а
следовательно, он станет владельцем таких файлов.
Данные рекомендации помогут избежать ситуации
несанкционированной замены файла с паролем или
Web-страниц.
Более
подробно об этом см. граздел 19.
Примеры
Конфигурация
Мы порекомендовали размещать
файлы ваших документов и сценариев в разных каталогах. В
приводимом далее примере для документов отводится каталог /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.с
Для компиляции этого приложения нужно
выполнить команду:
Листинг программы:
/* Данная
программа генерирует случайное число и затем выбирает
изображение в
зависимости от этого числа. В результате
при каждой загрузке 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.pi
#!/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>";