СтатьиАдминистрирование

Делаем веб-сервер легче вместе с thttpd.
n0xi0uzz
22 мая 2008 18:23



Теги: web-servers, netbsd, nix

Перевод статьи «Lightweight Web Serving with thttpd» автора Julio M. Merino Vidal


Apache HTTP Server — наиболее популярный веб-сервер за счет своей функциональности, стабильности и совершенности. Как бы то ни было, это не делает его подходящим для всех пользователей: медленные машины и встроенные системы могут иметь серьезные проблемы с ним из-за его размера. Вот где «легкие» HTTP-сервера вступают в игру, так как их небольшое использование памяти дает неплохие результаты без свопинга данных на диск.

Так же, эти небольшие HTTP-сервера подходят для обработки статичного контента также эффективно, как и Apache, mod_perl, mod_python. Другими словами, эти приложения могут служить в качестве дополнения к вашему веб-серверу, наделенного всеми возможностями, а не в качестве замены.

Одним из таких серверов является thttpd, простой, небольшой, переносимый, быстрый и безопасный HTTP-сервер. Помимо этих достоинств, он поддерживает стандарты HTTP/1.1, CGI, виртуальные хосты и IPv6. Эта статья показывает, как установить и настроить этот сервер под NetBSD. Я выбрал NetBSD не только потому, что это моя любимая ОС, но ещё и потому, что она имеет возможность работать на очень старом аппаратном обеспечении, где thttpd демонстрирует свои сильные стороны. У меня был Macintosh Performa 630 (чип 68LC040 на 33 MHz) под NetBSD/mac68k 2.0 с thttpd на нём, хорошо обрабатывающий страницы для моей домашней сети.

Варианты использования

Ранее я указал несколько вариантов использования thttpd, но существует несколько других ситуаций, в которых он может быть полезным:
— Медленные машины — компьютеры со старым аппаратным обеспечением, на которых могут работать Unix-подобные операционные системы (такие как NetBSD), часто достаточно мощны для выдачи статичного контента с помощью thttpd.
— Сильно загруженные машины — у вас может быть очень мощный сервер, на котором запущены ресурсоемкие процессы, как DBMS, и ещё вам нужно выдавать некоторый веб-контент (например, статистику). В этом случае, thttpd может хорошо работать.
— Небольшие запросы — иногда вам может быть нужно предоставлять некоторый веб-контент, но вам не нужно столь много возможностей, сколько дают такие сервера, как Apache. В этом случае, «легкого» сервера может быть достаточно для ваших нужд. Более того, исходя из их небольших размеров кода, у них меньший шанс выйти из строя, и вы можете проводить аудит их кода более проще.
— Обработка статичного контента вместе с мощным сервером — у вас может быть сервер с Apache с набором модулей, который парсит очень сложные динамические страницы. Эти страницы часто нуждаются во включении в них других файлов, зачастую — статичного контента. В этом случае, thttpd может обрабатывать статичные данные бок о бок с Apache, который будет обрабатывать только сложный контент. Далее будет раздел, посвященный этому специфичному варианту использования.

Установка thttpd

По скольку я выбрал NetBSD, для установки thttpd я использовал pkgsrc, систему портов NetBSD. Как бы то ни было, пожалуйста, учтите, что вам не обязательно использовать NetBSD для использования pkgsrc, поэтому все примеры, приведенные здесь, могут быть применены и в других системах, с небольшими трудностями; в противном случае, используйте вашу систему портов для получения thttpd.

Что касается pkgsrc, есть два способа установить thttpd: из исходных кодов или из бинарников. Исходные коды предпочтительнее, если вы не хотите использовать настройки по умолчанию, и вы хотите сконфигурировать сборку (возможно, с ключами оптимизации), или же вам нужен thttpd на системе, для которой нет бинарных портов. С другой стороны, бинарники обычно подходят для всех других случаев. Я расскажу про оба варианта.

При наличии pkgsrc в /usr/pkgsrc/, установка из исходных кодов тривиальна:
# cd /usr/pkgsrc/www/thttpd/
# make install && make clean

Если же вы пошли по пути бинарников, убедитесь, что соответствующая сборка доступна для вашей платформы (посмотрите FTP-сайт портов NetBSD). В моем случае, я использовал NetBSD/i386 2.0 вместе с последней стабильной веткой pkgsrc, pkgsrc-2005Q2, так что имело место быть следующее:
# PKG_PATH=ftp://ftp.NetBSD.org/pub/NetBSD/packages/pkgsrc-2005Q2/
    NetBSD-2.0/i386/All pkg_add thttpd

Внезависимости от выбранного вами способа, вы увидите нечто подобное после успешной установки:
==================================================
Installing files needed by thttpd-2.25bnb3:

        /usr/pkg/etc/thttpd.conf
            [/usr/pkg/share/examples/thttpd.conf]

==================================================
==================================================
The following files should be created for thttpd-2.25bnb3:

        /etc/rc.d/thttpd (m=0755)
            [/usr/pkg/share/examples/rc.d/thttpd]

==================================================

==================================================
$NetBSD: MESSAGE,v 1.2 2001/11/19 16:23:16 jlam Exp $

In order to use makeweb:

        chgrp <group> makeweb
        chmod 2755 makeweb

The suggested group is "www".
==================================================

Обратите внимание на то, что этот текст зависит от ваших настроек в mk.conf. Я использовал настройки по умолчанию, поэтому программа установилась в /usr/pkg/, и файл её настроек сохранился, как /usr/pkg/etc/thttpd.conf. Запомните эти пути, прежде чем продолжать.

Создание директории сервера

А сейчас, когда сервер установлен, пришло время его настроить. Самая первая вещь, которую вы должны поменять, это корневая директория сервера (Apache называет её DocumentRoot). По умолчанию это /usr/pkg/share/thttpd/, что далеко от оптимального варианта по своей динамичной природе (помним, что /usr/ зачастую монтируется в режиме «только для чтения»). Лучшим местом, например, является /home/www/, так что поменяйте конфигурацию для использования этой директории. Откройте файл настроек (/usr/pkg/etc/thttpd.conf) в вашем любимом редакторе и поменяйте переменную dir, чтобы она указывала на правильную директорию, вот так:
dir=/home/www

Когда это сделано, создайте сами эту директорию и поместите туда простую страницу:
# mkdir /home/www
# cat >/home/www/index.html
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
  <head>
    <title>Welcome</title>
  </head>

  <body>
    <p>thttpd is running!<p>
  </body>
</html>
^D

Учтите, что, пока вы не создадите файл index.html, у людей будет возможность просмотреть содержимое директории, которое зачастую может носить частный характер.

Установка прав.

Прежде чем запустить thttpd, который уже готов к этому, не помешало бы немного ограничить права. Как и для любого сетевого приложения, хорошей идеей является запускать его без прав суперпользователя, для сокращения возможных повреждений системы в случае атаки. Вот почему моя цель запустить процесс сервера под обычным пользовательским аккаунтом. Создайте группу www, к которой будут относиться все вебмастеры, и пользователя thttpd, аккаунт которого будет запускать демона.
# useradd -g nobody -d /home/www thttpd
# groupadd www

Обратите внимание, как аккаунт thttpd использует группу nobody: www — группа для вебмастеров; демону нет дела до записи в директорию сервера.

Теперь, когда аккаунт готов, скажите thttpd использовать его:
# echo user=thttpd >>/usr/pkg/etc/thttpd.conf

Наконец, поменяйте права на директорию сервера, чтобы разрешить любому члену группы www модифицировать файлы внутри неё:
# chown -R root:www /home/www/
# chmod 775 /home/www/
# chmod 664 /home/www/index.html


Включаем сервер

Теперь вы готовы запустить сервер. Обычно это делают, используя предоставленный скрипт rc.d. Для начала, скопируйте этот скрипт в соответствующую системную директорию, /etc/rc.d/, для того, чтобы он был доступен во время загрузки:
# cp /usr/pkg/share/examples/rc.d/thttpd /etc/rc.d/

Теперь, когда он на месте, включите его. А сейчас другая возможность для того, чтобы сделать работу безопаснее: скажите демону изменять себе корневой каталог на корневую директорию сервера после запуска. В NetBSD это просто сделать с помощью ключа -r. Для этого, измените /etc/rc.conf:
# cat >>/etc/rc.conf
echo thttpd=YES
echo thttpd_flags=-r
^D

Готово. Запустите сервер с помощью следующей команды:
# /etc/rc.d/thttpd start

Прежде чем продолжить, полезно будет проверить, что все работает правильно. Сначала подключитесь к http://localhost/ (учтите, что эта ссылка будет работать, только если вы заходите по ней с того компьютера, на котором вы установили thttpd) и проверьте, что отображается страница, которую вы до этого записали. Затем, убедитесь, что ключ -r был эффективен; ведь вы не хотите обнаружить несколько месяцев спустя, это на самом деле не так. Проверьте это с помощью команды fstat, которая служит для показа статуса всех открытых файлов. Поищите файлы root, использующиеся демоном:
# fstat | grep ^thttpd | grep root
thttpd   thttpd      1206 root /home    2351520 drwxrwxr-x 512 r

Результат показывает, что команда выполняется в директории, указывающей на 2351520 айнод, находящийся в файловой системе /home (которая является отдельным разделом). Чтобы убедиться, что номер айнода соответствует вашей корневой директории сервера, используйте утилиту ls:
# ls -lidF /home/www/
2351520 drwxrwxr-x  2 root  www  512 Jun  4 16:35 /home/www/

Номер в первой колонке совпадает с номером айнода, показанного fstat. Этот демон поменял корневую директорию на соответствующую.

Поздравляю! Теперь сервер корректно настроен, запущен и работает. Но подождите, — вы ещё не закончили.

Запуск CGI скриптов

Простейшим путем запустить CGI-скрипт на только что установленном сервере — выключить возможность смены корневой директории (убрав строку thttpd_flags из /etc/rc.conf). Тем не менее, исходя из соображений безопасности, это плохая идея. Вы можете по-прежнему запускать CGI внутри тюрьмы chroot, хотя это и немного сложнее.

Для тестов создайте простое CGI-приложение. Shell-скрипт использован, чтобы сделать объяснение более простым, вы можете использовать любой подходящий язык, который вы предпочитаете.
# mkdir /home/www/cgi-bin
# cat >/home/www/cgi-bin/hello.sh
#!/bin/sh

echo "Content-type: text/html"
echo
echo "Hello, world!"
^D
# chmod +x /home/www/cgi-bin/hello.sh

Теперь добавьте следующий HTML-код в страницу, созданную ранее, /home/www/index.html:
<form name="hello" method="post" action="/cgi-bin/hello.sh">
  <input type="submit" value="Run it!" />
</form>

Если вы попытаетесь получить доступ к странице и нажать на кнопку, thttpd выдаст ошибку. Что произошло? Скрипт не может найти интерпретатор шелла, /bin/sh, указанный в первой строке (так как изменена корневая директория, thttpd полагает, что все пути начинаются с /home/www/). Чтобы исправить это, скопируйте файл, также как и любые другие необходимые вещи, внутрь «тюрьмы» (это может быть сделано проще со статичной сборкой sh). Это просто сделать следующим образом:
# cd /home/www
# mkdir bin
# cp /bin/sh bin
# ldd bin/sh
bin/sh:
        -ledit.2 => /lib/libedit.so.2
        -ltermcap.0 => /lib/libtermcap.so.0
        -lc.12 => /lib/libc.so.12
# mkdir lib
# cp /lib/libedit.so.2 lib
# cp /lib/libtermcap.so.0 lib
# cp /lib/libc.so.12 lib
# mkdir libexec
# cp /libexec/ld.elf_so libexec
# chown -R root:wheel bin lib libexec

В зависимости от приложений, нужных вам внутри измененной корневой директории, все может усложниться: вам может понадобиться создать файлы устройств, пользовательскую базу данных, пайпы и так далее. В качестве упражнения, проделайте эту работу для Perl.

После складывания всего в нужное место, попробуйте снова нажать на кнопку, и все должно пройти удачно: вы должны увидеть в ответе сообщение «Hello, world!».

Виртуальные хосты

thttpd поддерживает виртуальные хосты. Их настройка поразительно проста. Прежде всего вам надо создать все доменные имена для обработки сервером thttpd. В общем, это означает настройку CNAME-ов для главного имени хоста, но это специфичная задача для DNS. Обратитесь к документации вашего доменного сервера за более подробной информацией, или попросите администратора DNS-сервера сделать это.

Имея доменные имена, следующим шагом будет включить поддержку виртуальных хостов. Добавьте опцию vhost в файл настроек (отдельной строкой):
# echo vhost >>/usr/pkg/etc/thttpd.conf

После добавления этой опции (и перезапуска сервера), поведение корневой директории сервера (/home/www/) поменяется коренным образом: она больше не будет содержать HTML-страниц или других файлов. Вместо этого, в ней будет несколько поддиректорий, каждая из которой будет соответствовать одному из обслуживаемых виртуальных хостов. Имя каждой директории — имя виртуального хоста или его IP-адрес. Например, если предположим, что вы хотите обрабатывать веб-страницы для доменов products.example.com и support.example.com, то ваша корневая директория будет содержать следующее:
# ls -lF /home/www/
total 4
drwxr-xr-x  2 root  www  512 Sep  4 22:48 products.example.com/
drwxr-xr-x  2 root  www  512 Sep  4 22:48 support.example.com/

Да, это так просто!

Работа с другими серверами

В начале статьи упоминалось, что другим использованием thttpd является обслуживание статического контента вместе с мощными веб-серверами. Простейшим путем сделать это будет запустить thttpd на другом порту, что требует добавления дополнительной строки в файл настроек:
# echo port=8080 >>/usr/pkg/etc/thttpd.conf

Я предполагаю, что, если вы это сделали, то потому, что у вас есть веб-сервер с полным набором возмжностей на той же машине, что и thttpd. Следовательно, вам надо изменить веб-страницы, который он обрабатывает, чтобы указать, что статический контент теперь обрабатывается на http://localhost:8080/.

Заключение

Эта статья показала, как, шаг за шагом, установить и настроить «легкий» веб-сервер thttpd. Это приложение имеет несколько других возможностей. Если вы хотите узнать больше, потратье некоторое время, прочитав руководство по thttpd или сопроводительные записи к thttpd, в которых описано несколько интересных решений.

Конечно, существует много других простых HTTP-серверов, доступных в интернете. Если один не удовлетворяет ваши потребности, возможно, существует другой, который это сделает.


Теги: web-servers, netbsd, nix

Статьи с такими же тегами:

Кеширование динамического контента с помощью Apache httpd.
Пошаговая настройка SSL для Apache.
Веб-сервер lighttpd.
Отправка логов Apache в Syslog
Ускоряем время загрузки страницы для мобильных устройств с помощью Ziproxy
Изучаем параметры gcc.