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