Версия для печати

Архив документации на OpenNet.ru / Раздел "Web мастеру, CGI, Perl, PHP, Apache" (Многостраничная версия)

Документация по web-серверу Lighttpd


Mark Silinio <silinio(at)mail.ru>
последнее обновление 24/07/05



Далее дан перевод документации по web-серверу Lighttpd с сайта www.lighttpd.net.



<- На титульную страницу
Valid HTML 4.01! Valid CSS!

Доступ

Модуль: mod_access

Автор: Allan Wind
Дата: 2005-01-30
Версия: 1.1

Суть

Модуль доступа используется чтобы ограничить доступ к файлам заканчивающимися на определённые символы.

Содержание

Описание

Модуль доступа используется чтобы ограничить доступ к файлам заканчивающимися на определённые символы.

Опции

url.access-deny

Запрещает доступ ко всем файлам с определённым окончанием.

По умолчанию: пусто

Пример:

url.access-deny = ( "~", ".inc")

в данном примере запрещается доступ к файлам оканчивающимся на знак тильда (~) или расширение .inc, т.е. например к файлам example~ или example.inc. Файлы с тильдой на конце обычно являются файлами отката различных текстовых редакторов (например vim). Файлы с расширением .inc часто используются в качестве include файлов с кодом.


Лог доступа

Модуль: mod_accesslog

Автор: Jan Kneschke
Дата: 2004-11-03
Версия: 1.2

Суть

Модуль лога доступа ...

Содержание

Описание

CLF в конце строки по-умолчанию, гибкость настроек как у apache'а

Опции

accesslog.use-syslog

писать лог доступа в syslog

По-умолчанию: выключено

accesslog.filename

имя файла в который должен писаться лог если syslog не используется.

если используется символ '|', то за ним пишется название программы которая будет запущена и начнёт принимать лог доступа на stdin

например:

accesslog.filename = "/var/log/lighttpd.log"

$HTTP["host"] == "mail.example.org" {
  accesslog.filename = "|/usr/bin/cronolog"
}

По умолчанию: отключено

accesslog.format

формат лога

Опция Описание
%% знак процента
%h имя или адрес удалённого хоста
%l ident имя (не поддерживается)
%u авторизованный пользователь
%t отметка времени(timestamp) начала запроса
%r запрошенная линия(request-line)
%s код статуса
%b отправлено байт в body
%i поле HTTP-заголовка
%a удалённый адрес
%A локальный адрес
%B тоже что и %b
%C поле cookie(не поддерживается)
%D использованное время в мс.(не поддерживается)
%e окружение(не поддерживается)
%f phyiscal имя файла
%H протокол запроса (HTTP/1.0, ...)
%m метод запроса (GET, POST, ...)
%n (не поддерживается)
%o заголовок ответа
%p порт сервера
%P (не поддерживается)
%q строка запроса(query)
%T использованное время в секундах
%U запрошенный URL
%v имя сервера
%V (не поддерживается)
%X статус соединения
%I входящее кол-во байт
%O исходящее кол-во байт

Если %s написано как %>s или %<s то < и > игнорируются. Они поддерживаются для совместимости с apache.

%i и %o используют имя поля которое должно быть написано в фигурных скобках.

например:

accesslog.format = "%h %l %u %t \"%r\" %b %>s \"%{User-Agent}i\" \"%{Referer}i\""

По умолчанию: CLF совместимый вывод

заголовок ответа

accesslog модуль позволяет писать в лог информацию поступающую от приложения. Это может использоваться чтобы записывать в лог идентификатор сессии(session id) .

Если вы хотите сохранять это в лог, просто укажите имя поля в виде %{...}o

accesslog.format = "%h %l %u %t \"%r\" %b %>s \"%{User-Agent}i\" \"%{Referer}i\" \"%{X-LIGHTTPD-SID}o\""

Каждый заголовок ответа с приставкой X-LIGHTTPD- имеет спец. значение для lighttpd и не отсылается клиенту.

Использование этой возможности показано ниже:

<?php

session_start();

header("X-LIGHTTPD-SID: ".session_id());

?>

Псевдонимы

Модуль: mod_alias

Автор: Jan Kneschke
Дата: 2004-08-29
Версия: 1.1

Суть

Модуль псевдонимов ...

Содержание

Описание

Модуль псевдонимов используется чтобы указать специальную директорию для заданного URL .

Опции

alias.url

указывает путь к директории для определённого URL

По умолчанию: пусто

Пример:

alias.url = ( "/cgi-bin/" => "/var/www/servers/www.example.org/cgi-bin/" )

Пользовательская аутентификация

Модуль: mod_auth

Автор: Jan Kneschke
Дата: 2004-11-03
Версия: 1.3

Суть

Модуль аутентификации предостовляет ...

Содержание

Описание

Поддерживаемые методы

lighttpd поддерживает оба метода аутентификации описанные в RFC 2617:

basic

Basic метод передаёт имя пользователя и пароль по сети в открытом виде(закодированными в base64), что способствует возникновению проблемы безопастности в случае если соединение между клиентом и сервером не шифруется.

digest

Digest метод передаёт только хешированную информацию, что значительно повышает конфидециальность аутентификационных данных в незащищённых сетях.

Backends

В зависимости от метода lighttpd позволяет использовать различные методы хранения данных необходимых для аутентификации.

для basic аутентификации:

для digest аутентификации:

plain

Файл содержит строки с именами пользователей и паролями в открытом виде. Имя пользователя и пароль разделяются двоеточием. :

например:
agent007:secret

htpasswd

Файл содержит строки с именами пользователей и зашифрованными с помощью crypt() паролями. Имя пользователя и пароль разделяются двоеточием.

например:
agent007:XWY5JwrAVBXsQ

Для работы с такими файлами вы можете использовать программу htpasswd, входящую в состав apache.

$ htpasswd lighttpd.user.digest agent007

htdigest

Файл содержит строки с именами пользователей, realm'ом и зашифрованными с помощью md5() паролями. Имя пользователя, realm и пароль разделяются двоеточием.

например:
agent007:download area:8364d0044ef57b3defcfa141e8f77b65

Для работы с такими файлами вы можете использовать программу htdigest, входящую в состав apache.

$ htdigest src/lighttpd.user.digest 'download area' agent007

Использование md5sum также может использоваться для создания хэша пароля:

$ echo -n "agent007:download area:secret" | md5sum -
8364d0044ef57b3defcfa141e8f77b65  -

ldap

ldap backend обычно выполняет следующие действия для аутентификации пользователя

  1. анонимное соединение (при загрузке plugin'а)
  2. получение DN для фильтрации = username
  3. аутентификация на ldap сервере
  4. рассоединение

если четвёртый шаг проходит без ошибок, то пользователь считается авторизированным

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

## отладка
# 0 для выключения, 1 для 'auth-ok' сообщений, 2 для подробных сообщений
auth.debug                 = 0

## тип backend'а
# plain, htpasswd, ldap или htdigest
auth.backend               = "htpasswd"

# имя файла в котором хранится информация необходимая
# для plain аутентификации
auth.backend.plain.userfile = "lighttpd-plain.user"

## для htpasswd
auth.backend.htpasswd.userfile = "lighttpd-htpasswd.user"

## для htdigest
auth.backend.htdigest.userfile = "lighttpd-htdigest.user"

## для ldap
# знак $ в auth.backend.ldap.filter заменяется на
# 'имя пользователя' из login диалога
auth.backend.ldap.hostname = "localhost"
auth.backend.ldap.base-dn  = "dc=my-domain,dc=com"
auth.backend.ldap.filter   = "(uid=$)"

## ограничения
# выставление ограничений:
#
# ( <left-part-of-the-url> =>
#   ( "method" => "digest"/"basic",
#     "realm" => <realm>,
#     "require" => "user=<username>" )
# )
#
# <realm> это значение которое будет показано в диалоговом окне
#               и также будет использоваться для digest-алгоритма и
#               должно совпадать с realm'ом в htdigest файле (если используется)
#

auth.require = ( "/download/" => 
                 ( 
                   "method"  => "digest",
                   "realm"   => "download archiv",
                   "require" => "user=agent007|user=agent008"
                 ),
                 "/server-info" => 
                 ( 
                   "method"  => "digest",
                   "realm"   => "download archiv",
                   "require" => "user=jan"
                 )
               )

Ограничения


CGI

Модуль: mod_cgi

Автор: Jan Kneschke
Дата: 2004-11-03
Версия: 1.2

Суть

cgi модуль предостовляет CGI-соответствующий интерфейс

Содержание

Описание

CGI программы позволяют вам повысить функциональность сервера простым и удобным способом. ...

Опции

cgi.assign

Соответствие расширения файлов определённой CGI программе, которая будет их запускать

например:

cgi.assign = ( ".pl"  => "/usr/bin/perl",
               ".cgi" => "/usr/bin/perl" )

Например

Чтобы файлы с некоторым расширением исполнялись безо всякой спец. программы, просто не указывайте никакую CGI-программу.

cgi.assign = ( ".sh" => "" )

Файл без расширения, но имеет определённую правую часть URL:

cgi.assign = ( "/testfile" => "" )

Сжатие исходящих данных

Модуль: mod_compress

Автор: Jan Kneschke
Дата: 2004-08-29
Версия: 1.1

Суть

хорошее, короткое описание модуля

Содержание

Описание

Сжатие исходящих данных уменьшает нагрузку на сеть и может улучшить общую пропускную способность веб-сервера.

На сегодня поддерживается только статичное содержимое.

Сервер автоматически договаривается какой метод сжатия использовать. Поддерживается gzip, deflate, bzip.

Опции

compress.cache-dir

имя директории используемой для кэша сжатых данных

напр.:

compress.cache-dir = "/var/www/cache/"

# как раз неплохо для виртуальго хостинга
$HTTP["host"] == "docs.example.org" {
  compress.cache-dir = "/var/www/cache/docs.example.org/"
}

По умолчанию: не выстоалять, сжимать файл для каждого запроса

compress.filetype

mime-типы также могут быть сжаты

например:

compress.filetype           = ("text/plain", "text/html")

По умолчанию: не выставлено

Сжатие Динамического Контента

Для сжатия динамичного содержимого с помощью PHP включите

zlib.output_compression = 1

в php.ini, таким образом PHP сжимает данные сам.


FastCGI интерфейс

Модуль: mod_fastcgi

Автор: Jan Kneschke
Дата: 2004-11-03
Версия: 1.3

Суть

Интерфейс FastCGI это быстрейший и наиболее безопастный способ обработки запросов внешними программами, тикими как Perl, PHP а также вашими самописными приложениями.

Содержание

Описание

lighttp предостовляет интерфейс ко внешним программам которые поддерживают FastCGI интерфейс. FastCGI Интерфейс определён http://www.fastcgi.com/ и это платформо-независимый и серверо-независимый интерфейс между web-приложением и web-сервером.

Это подразумевает что FastCGI программы запущенные с Apache web-сервером также запустятся с lighttpd и наоборот.

FastCGI

FastCGI ликвидирует множество ограничений CGI программ. Проблема CGI программ в том что они должны быть перезапущенны web-сервером при каждом запросе, что приводит к понижению производительности.

FastCGI убирает это ограничение сохраняя процесс запущенным и передавая запросы этому постоянно запущенному процессу. Это позволяет не тратить время на создание (fork()) новых процессов.

Пока CGI программы соединены с сервером через pipe'ы, FastCGI процессы используют Unix-Domain-Sockets или TCP/IP для связи с сервером. Это даёт следующее преимущество над обычными CGI программами: FastCGI программы могут быть запущенны не только на этом же сервере, но и где угодно в сети

lighttpd включает в себя внутренный FastCGI распределитель нагрузки который может использоваться для распределения сразу на несколько FastCGI серверов. В отличие от иных решений только FastCGI процесс должен находиться в кластере, а не целый web-сервер. Это позволяет использовать FastCGI процессу больше резурсов чем, например, load-balancer+apache+mod_php.

Если вы сравните FastCGI с apache+mod_php вы должны обратить внимание на то, что FastCGI обеспечивает дополнительную безопастность, как запуст FastCGI процесса под пользователем отличным от пользователя web-сервера, а также может находиться в chroot'е отличным от chroot'а web-сервера.

Опции

Поддержка FastCGI в lighttod предоставляется через модуль fastcgi (mod_fastcgi) который имеет 2 опции в конфигурационном файле:

fastcgi.debug
значение от 0 до 65535 для выставления уровня отладки в FastCGI модуле. На данный момент используются только 0 или 1. Выставите 1 чтобы включить отладку, и 0 чтобы выключить.
fastcgi.server

сообщает модулю куда надо отправлять FastCGI вызовы. каждое расширение файла может отправлять своему собственному FastCGI серверу. Балансировка нагрузки реализуется указанием нескольких FastCGI сервером для одного расширения.

структура fastcgi.server секции:

( <extension> => 
  ( <handle> => 
    ( "host" => <string> ,
      "port" => <integer> ,
      "socket" => <string>,       # socket
                                  # или пара host+port
      "bin-path" => <string>,     # ОПЦИОНАЛЬНО 
      "bin-environment" => <array>, # ОПЦИОНАЛЬНО 
      "bin-copy-environment" => <array>, # ОПЦИОНАЛЬНО 
      "mode" => <string>,         # ОПЦИОНАЛЬНО
      "docroot" => <string> ,     # ОПЦИОНАЛЬНО если "mode" 
                                  # не "authorizer"
      "check-local" => <string>,  # ОПЦИОНАЛЬНО
      "min-procs" => <integer>,   # ОПЦИОНАЛЬНО
      "max-procs" => <integer>,   # ОПЦИОНАЛЬНО
      "max-load-per-proc" => <integer>, # ОПЦИОНАЛЬНО
      "idle-timeout" => <integer> # ОПЦИОНАЛЬНО
    )
  ), 
  ( <handle> => ... 
  )
)
<extension>:расширение файла или префикс (если начинается с "/")
<handle>:уникальное имя для этого handle
"host":имя хоста/ip данного FastCGI процесса
"port":tcp-порт на "host" используемый FastCGI процессом
"bin-path":путь к локальному исполняемому файлу FastCGI который должен быть запущен если не используется отдельный FastCGI процесс
"socket":путь к unix-domain socket
"mode":режим FastCGI протокола. По умолчанию это "responder", также есть режим "authorizer" .
"docroot": это опционально, и это docroot (корневая директория для документов) на удалённом хосте для режима "responder" mode. Для режима "authorizer" это ОБЯЗАТЕЛЬНО и указывает на docroot для авторизованных запросов. По причинам безопастности рекомендуется держать этот docroot вне дерева каталога server.document-root.
"check-local":опционально и может быть включено "enable" (по умолчанию) или "disable". Если включено то сервер сначала проверяет файл в локальном server.document-root каталоге и возвращает 404 (Not Found) если такого файла нет. Если выключено, то сервер перенаправляет запрос к FastCGI интерфейсу без этой проверки.

Если указана bin-path:

"min-procs":выставляет минимальное количество процессов стартующих при запуске
"max-procs":верхний лимит запущенных процессов
"max-load-per-proc":
 максимальное количество ожидающих процессов до того как запуститься новый процесс
"idle-timeout":количество секунд после прошествия которых неиспользуемый процесс будет уничтожен
"bin-environment":
 помещает пременную окружения для запускаемого процесса
"bin-copy-environement":
 очищает переменные окружения и копирует только указанные переменные в новое окружение создаваемого процесса

Примеры

Множественные расширения для того же хоста

fastcgi.server = ( ".php" =>
                   ( "grisu" => 
                     ( 
                       "host" => "127.0.0.1",
                       "port" => 1026,
                       "bin-path" => "/usr/local/bin/php"
                     )
                   ),
                  ".php4" =>
                   ( "grisu" => 
                     ( 
                       "host" => "127.0.0.1",
                       "port" => 1026
                     )
                   )
                 )

Пример с префиксом:

fastcgi.server = ( "/remote_scripts" =>
                   ( "fcg" =>
                     (
                       "host" => "192.168.0.3",
                       "port" => 9000,
                     "check-local" => "disable",
                     "docroot" => "/" # удалённый сервер может использовать
                                        # свой docroot
                     )
                   )
                 )

Запрос http://my.host.com/remote_scripts/test.cgi будет перенаправлен на fastcgi сервер на 192.168.0.3 и значение "/remote_scripts/test.cgi" будет использовано для переменной SCRIPT_NAME. Удалённый сервер может обработать его со своим собственным document root. Обработка index файлов в данном случае также ложиться на удалённый сервер.

Пример для режима "authorizer":

fastcgi.server = ( "/remote_scripts" =>
                   ( "auth" =>
                     (
                       "host" => "10.0.0.2",
                       "port" => 9000,
                       "docroot" => "/path_to_private_docs",
                       "mode" => "authorizer"
                     )
                   )
                 )

Заметьте что если "docroot" определена, тогда её значение будет использовано в переменных DOCUMENT_ROOT и SCRIPT_FILENAME FastCGI сервера.

Распределение нагрузки

FastCGI plugin предоставляет автоматическое распределение нагрузки между несколькими FastCGI серверами.

fastcgi.server = ( ".php" => 
                   ( "server1" => 
                     ( "host" => "10.0.0.3",
                       "port" => 1030 ),
                     "server2" =>
                     ( "host" => "10.0.0.3",
                       "port" => 1030 )
                   )
                 )

Чтобы понять как работает распределение нагрузки вы можете включить опцию fastcgi.debug и получить вывод подобный этому:

proc: 127.0.0.1 1031  1 1 1 31454
proc: 127.0.0.1 1028  1 1 1 31442
proc: 127.0.0.1 1030  1 1 1 31449
proc: 127.0.0.1 1029  1 1 2 31447
proc: 127.0.0.1 1026  1 1 2 31438
got proc: 34 31454
release proc: 40 31438
proc: 127.0.0.1 1026  1 1 1 31438
proc: 127.0.0.1 1028  1 1 1 31442
proc: 127.0.0.1 1030  1 1 1 31449
proc: 127.0.0.1 1031  1 1 2 31454
proc: 127.0.0.1 1029  1 1 2 31447

Данный вывод показывает множество породений FastCGI на локальной машине. Следующее объяснение верно также и для удалённых соединений.

Вывод показывает:

Как вы можете видеть список всё время упорядочен по полю загрузуки

При запросе нового соеденения, выбирается первый указатель на FastCGI процесс (один с наименьшей нагрузкой), значение загрузки увеличивается на 1 (got proc: ...) и список сортируется вновь.

Если FastCGI запрос заканчивается или соединение обрывается, загрузка FastCGI proc уменьшается на 1 и список опять сортируется (release proc: ...)

Такое поведение занимает мало кода, весьма эффективно, и позволяет использовать fastcgi-сервера равнозагруженно, даже если они имеют разные CPU.

Adaptive Process Spawning

Начиная с 1.3.8 lighttpd может создавать просцессы по запросу если определена bin-path, и FastCGI процессы запускаются локально.

Если вы хотите иметь запущенным по крайней мере один FastCGI процесс и больше при запросах, вы можете использовать min-procs и max-procs.

Новый процесс запускается как только среднее количество запросов ожидающих обработку одним процессом превысит max-load-per-proc.

Параметр idle-timeout определяет как долго fastcgi-процесс должен ожидать новый запрос прежде чем завешит свою работу

Пример

fastcgi.server = ( ".php" => ( "localhost" => 
                   ( "socket" => "/tmp/php.socket",
                     "bin-path" => "/usr/local/bin/php",
                     "min-procs" => 1,
                     "max-procs" => 32,
                     "max-load-per-proc" => 4,
                     "idle-timeout" => 20 ) 
                   ) )

Отключение Adaptive Spawning

Adaptive Spawning всё ещё новая возможность, и может вести себя нестабильно. Здесь указаны несколько возможностей как контролировать создание новых процессов:

  1. "max-load-per-proc" => 1 если это работает у вас то всё хорошо.

  2. Если не выставлено min-procs == max-procs.

  3. Для PHP вы также можете использовать:

    $ PHP_FCGI_CHILDREN=384 ./lighttpd -f ./lighttpd.conf
    
    fastcgi.server = ( ".php" => ( "localhost" =>
                       ( "socket" => "/tmp/php.socket",
                         "bin-path" => "/usr/local/bin/php",
                         "min-procs" => 1,
                         "max-procs" => 1,
                         "max-load-per-proc" => 4,
                         "idle-timeout" => 20 )
                     ) )
    

    Это создаст один socket и позволит PHP самому создать 384 процесса.

  4. Если вы не хотите позволять lighttpd управлять fastcgi процессами, уберите bin-path и используйте spawn-fcgi чтобы FastCGI создавал процессы сам

FastCGI и Языки Программирования

Подготовка PHP как FastCGI программы

Одно из наиболее важных приложений которое имеет FastCGI интерфейс это php который может быть скачан с http://www.php.net/ . Вы должны перекомпилировать php из исходников чтобы активировать FastCGI интерфейс, т.к. он не включен по умолчанию.

Если у вас уже имеется работающий PHP на web-сервере, выполните короткий скрипт который просто содержит

<?php phpinfo(); ?>

и посмотрите на строки содержащие вызов configure. Вы можете использовать их как основы для компиляции.

Вы должны удалить опции --with-apxs, --with-apxs2 и те которые используются для компилирования с поддержкой Apache. Добавьте следующие три опции для компиляции PHP с поддержкой FastCGI:

$ ./configure \
  --enable-fastcgi \
  --enable-discard-path \
  --enable-force-cgi-redirect \
  ...

После компиляции и инстраляции проверьте что ваш PHP поддерживает FastCGI, выполнив:

$ php -v
PHP 4.3.3RC2-dev (cgi-fcgi) (built: Oct 19 2003 23:19:17)

Обратите внимание на (cgi-fcgi).

Настройка PHP

Важно чтобы php.ini содержал:

cgi.fix_pathinfo = 1

В противном случае PHP_SELF не примет правильное значение.

Запуск FastCGI-PHP

Начиная с версии 1.3.6 lighttpd может сам создавать FastCGI процессы если необходимо:

fastcgi.server = ( ".php" =>
                   ( "localhost" =>
                     ( "socket" => "/tmp/php-fastcgi.socket",
                       "bin-path" => "/usr/local/bin/php"
                     )
                   )
                 )

PHP предоставляет 2 специальные переменные окружения которые контролируют число рабочих запущенных процессов под контроллем одного наблюдательного процесса (PHP_FCGI_CHILDREN) и число запросов которые один рабочий процесс обработает до завершения.

fastcgi.server = ( ".php" =>
                   ( "localhost" =>
                     ( "socket" => "/tmp/php-fastcgi.socket",
                       "bin-path" => "/usr/local/bin/php",
                       "bin-environment" => ( 
                         "PHP_FCGI_CHILDREN" => "16",
                         "PHP_FCGI_MAX_REQUESTS" => "10000"
                       )
                     )
                   )
                 )

Чтобы улучшить безопастность запущенных процессов вы только должны передать необходимые переменные окружения FastCGI процессу.

fastcgi.server = ( ".php" =>
                   ( "localhost" =>
                     ( "socket" => "/tmp/php-fastcgi.socket",
                       "bin-path" => "/usr/local/bin/php",
                       "bin-environment" => ( 
                         "PHP_FCGI_CHILDREN" => "16",
                         "PHP_FCGI_MAX_REQUESTS" => "10000"
                       ),
                       "bin-copy-environment" => (
                         "PATH", "SHELL", "USER"
                       )
                     )
                   )
                 )

Внешний Spawning

Создание процесса FastCGI прямо в web-сервере имеет следующие недостатки

  • процесс FastCGI может быть запущен только локально
  • имеет тебе права что и web-сервер
  • имеет туже base-dir что и web-сервер

Как только вы начнёте использовать отдельный FastCGI сервер чтобы снять нагрузку с web-сервера, вы сможете контролировать процесс FastCGI внешними программами, такими как spawn-fcgi.

spawn-fcgi используется чтобы запустить FastCGI процесс в своём окружении, выставить ему user-id, group-id и сменить корневую директорию (chroot).

Для большего удобства должен быть использван wrapper скрипт берущий на себя заботу обо всех опциях. Такой скрипт включён в состав lighttpd,- spawn-php.sh.

Скрипт использует набор конфигурационных переменных на которые вы должны обратить внимание:

## АБСОЛЮТНЫЙ путь к исполняемому файлу spawn-fcgi
SPAWNFCGI="/usr/local/sbin/spawn-fcgi"

## АБСОЛЮТНЫЙ путь к исполняемому файлу PHP
FCGIPROGRAM="/usr/local/bin/php"

## bind к tcp-порту на localhost
FCGIPORT="1026"

## bind к unix domain socket
# FCGISOCKET="/tmp/php.sock"

## число запускаемых PHP потомков
PHP_FCGI_CHILDREN=10

## число запросов которые будет обрабатывать один php-процесс пока
## он не перезапуститься
PHP_FCGI_MAX_REQUESTS=1000

## IP адресса с которых PHP позволяет соединяться
FCGI_WEB_SERVER_ADDRS="127.0.0.1,192.168.0.1"

# разрешённые переменные окружения разделямые пробелами
ALLOWED_ENV="ORACLE_HOME PATH USER"

## если скрипт запущен root'ом, сменить на следующего владельца
USERID=wwwrun
GROUPID=wwwrun

Как только вы указали необходимые вам значения, вы можете запустить spawn-php.sh:

$ spawn-php.sh
spawn-fcgi.c.136: child spawned successfully: PID: 6925

Если вы видите "child spawned successfully: PID:" значит php процесс запущен успешно. Вы должны увидеть их в своём списке процессов:

$ ps ax | grep php
6925 ?        S      0:00 /usr/local/bin/php
6928 ?        S      0:00 /usr/local/bin/php
...

Число процессов должно быть PHP_FCGI_CHILDREN + 1. В данном случае процесс 6925 это master slave'ов работающих параллельно. Число рабочих процессов указывается в PHP_FCGI_CHILDREN. Рабочий процесс автоматически завершает свою работу после обработки PHP_FCGI_MAX_REQUESTS запросов, т.к. в PHP могут возникнуть утечки памяти.

Если вы запустите скрипт как пользователь root, php процессы будут работать с пользовательским USERID и GROUPID группы. В ином случае php процессы запустятся с правами того пользователя которые запустил скрипт.

Так как скрипт может быть запущен с неопределённого уровня запуска или даже напрямую с коммандной строки, он очищает переменные окружения прежде чем запустить процессы. ALLOWED_ENV содержит все внешние переменные окружения которые должны быть доступны php-процессам.

Perl

Для Perl вы должны установить FCGI модуль с CPAN.

TCL

Для TCL ...

Шаблон для удалённого авторизатора

Базовая функциональнось авторизатора (см. http://www.fastcgi.com/devkit/doc/fcgi-spec.html, 6.3 для подробностей).

#include <fcgi_stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main () {
  char* p;

  while (FCGI_Accept() >= 0) {   
    /* wait for fastcgi authorizer request */

    printf("Content-type: text/html\r\n");

    if ((p = getenv("QUERY_STRING")) == NULL) ||
         <QUERY_STRING is unauthorized>)
         printf("Status: 403 Forbidden\r\n\r\n");

    else printf("\r\n");  
      /* default Status is 200 - allow access */
  }

  return 0;
}

Это позволит использовать любое другое значение предостовляемое интерфейсом FastCGI для проверки авторизации. Здесь только пример.

Проблемы

fastcgi.debug должен быть включен для решения проблем.

Если вы получаете:

(fcgi.c.274) connect delayed:  8
(fcgi.c.289) connect succeeded:  8
(fcgi.c.745) unexpected end-of-file (perhaps the fastcgi 
   process died):  8

процесс fastcgi принимает соединения но закрывает их в любом случае. Это случается если FCGI_WEB_SERVER_ADDRS не включает хост с которого происходит соединение.

Если вы получаете

(fcgi.c.274) connect delayed:  7
(fcgi.c.1107) error: unexpected close of fastcgi connection 
   for /peterp/seite1.php (no fastcgi process on host/port ?)
(fcgi.c.1015) emergency exit: fastcgi: connection-fd: 5 
   fcgi-fd: 7

процесс fastcgi не запущен на хосте/порту к которому вы соединяетесь. Проверьте вашу конфигурацию.

Если вы получаете

(fcgi.c.274) connect delayed:  7
(fcgi.c.289) connect succeeded:  7

всё нормально. Вызов connect() просто немного задержался, но соединениё установилось.


Виртуальный хостинг на MySQL

Модуль: mod_mysql_vhost

Автор: ada@riksnet.se
Дата: 2004-08-29
Версия: 1.1

Суть

Этот модуль позволяет создавать виртуальный хостинг (vhosts) на основе MySQL таблицы, и (опционально) подготовить mod_fastcgi для под-chroot'а для развёртывания FastCGI.

Содержание

Описание

виртуальный хостинг с помощью mysql

Опции

Пример:

mysql-vhost.db             = "lighttpd"
mysql-vhost.user           = "lighttpd"
mysql-vhost.pass           = "secret"
mysql-vhost.sock           = "/var/mysql.lighttpd.sock"
mysql-vhost.sql            = "SELECT docroot,fcgioffset,fcgiarg FROM domains WHERE domain='?'"

Настройка MySQL:

GRANT SELECT ON lighttpd.* TO lighttpd@localhost IDENTIFIED BY 'secret';

CREATE DATABASE lighttpd;

USE lighttpd;

CREATE TABLE domains (
  domain char(64) not null primary key,
  docroot char(128) not null,
  fcgioffset tinyint unsigned not null,
  fcgiarg smallint unsigned not null
);

INSERT INTO domains VALUES ('host.dom.ain','/http/host.dom.ain/',5,10001);

Дополнительно:

fastcgi.server = ( ".php" => ( "php-fcgi" => (
  "socket" => "../php/socket",
  "spawn"  => "/php/php-spawn"
))) 

Вышеописанный пример берёт docroot для виртуального хоста из таблицы lighttpd.domains, а также меняет docroot для FastCGI на 5 (=fcgioffset) символов ниже web docroot (в примере выше это означает что web docroot будет /http/host.dom.ain/, в FastCGI docroot,- /host.dom.ain/).

"socket" fastcgi.server указывается относительно docroot'а, и аргумент "spawn" указывает на команду которая будет использоваться для динамического запуска нового FastCGI процесса в случае если таковой не запущен (в противовес "bin-path" указывающего не запускать/перезапускать FastCGI процессы динамически).

Пример выше также добавляет аргумент "10001" (=fcgiarg) при вызове /php/php-spawn (=spawn). Если программа php-spawn имеет setuid бит, это может использоваться для chroot'а и смене gid/uid на определённого пользователя до запуска FastCGI программы.

ЗАМЕЧАНИЕ: как fcgioffset так и fcgiarg необязательны. Если не будут вами использоваться, просто уберите их в примере выше для обычного виртуального сервера. Так же вы можете использовать только fcgioffset без fcgiarg, если вам так надо.


Прокси Интерфейс

Модуль: mod_proxy

Автор: Jan Kneschke
Дата: 2004-08-01
Версия: 1.1

Суть

Прокси-модуль позволяет элементарно соединять java серверы (и не только) имеющие HTTP-интерфейс.

Содержание

Описание

...

Опции

lighttpd предостовляет поддержку Прокси через прокси модуль и имеет две опции для его настройки:

proxy.debug: значение от 0 до 65535 устанавливает уровень отладки в прокси-модуле. На данные момент может принимать только два значения,- 1(включить) и 0(выключить).

proxy.server:

указывает куда надо направлять запросы. Для каждого расширения файла можно указать своё направление. Распределение нагрузки реализуется выставлением нескольких направлений для одного расширения.

структура секции proxy.server:

( <extension> => 
  ( <handle> => 
    ( "host" => <string> ,
      "port" => <integer>
    )
  ), 
  ( <handle> => ... 
  )
)
<extension>:расширение файла или префикс (если начинается с "/")
<handle>:отличное имя
"host":ip прокси сервера
"port":tcp-порт на "host" используемый прокси сервером

например:

proxy.server = ( ".php" =>
                   ( "grisu" => 
                     ( 
                       "host" => "192.168.0.2",
                       "port" => 1026
                     )
                   )
                 )

Перенаправлени URL

Модуль: mod_redirect

Автор: Jan Kneschke
Дата: 2004-08-29
Версия: 1.1

Суть

перенаправление url

Содержание

Описание

...

Опции

url.redirect

перенаправляет заданные URL на внешний

например:

url.redirect = ( "^/show/([0-9]+)/([0-9]+)$" => "http://www.example.org/show.php?isdn=$1&page$2",
                 "^/get/([0-9]+)/([0-9]+)$"  => "http://www.example.org/get.php?isdn=$1&page$2" )

rrdtool

Модуль: mod_rrdtool

Автор: Jan Kneschke
Дата: 2004-08-29
Версия: 1.1

Суть

mod_rrdtool используется для мониторинга траффика(к серверу и от сервера) и нагрузки на web-сервер

Содержание

Описание

RRD это программа для хранения и отображения информации по времени (загрузка сети, температура процессора, средняя нагрузка на сервер и пр.).

Опции

rrdtool.binary

путь к программе rrdtool

например:

rrdtool.binary = "/usr/bin/rrdtool"
rrdtool.db-name

название файла rrd-базы данных. Проверьте чтобы <rrdtool.db-name> отсутствовал до первого запуска (с mod_rrdtool),- lighttpd сам создаст этот файл.

например:

rrdtool.db-name = "/var/www/lighttpd.rrd"

Создание Графиков

#!/bin/sh

RRDTOOL=/usr/bin/rrdtool
OUTDIR=/var/www/servers/www.example.org/pages/rrd/
INFILE=/var/www/lighttpd.rrd
OUTPRE=lighttpd-traffic

DISP="-v bytes --title TrafficWebserver \
        DEF:binraw=$INFILE:InOctets:AVERAGE \
        DEF:binmaxraw=$INFILE:InOctets:MAX \
        DEF:binminraw=$INFILE:InOctets:MIN \
        DEF:bout=$INFILE:OutOctets:AVERAGE \
        DEF:boutmax=$INFILE:OutOctets:MAX \
        DEF:boutmin=$INFILE:OutOctets:MIN \
        CDEF:bin=binraw,-1,* \
        CDEF:binmax=binmaxraw,-1,* \
        CDEF:binmin=binminraw,-1,* \
        AREA:binmin#ffffff: \
        STACK:binmax#f00000: \
        LINE1:binmin#a0a0a0: \
        LINE1:binmax#a0a0a0: \
        LINE2:bin#a00000:incoming \
        GPRINT:bin:MIN:%.2lf \
        GPRINT:bin:AVERAGE:%.2lf \
        GPRINT:bin:MAX:%.2lf \
        AREA:boutmin#ffffff: \
        STACK:boutmax#00f000: \
        LINE1:boutmin#a0a0a0: \
        LINE1:boutmax#a0a0a0: \
        LINE2:bout#00a000:outgoing \
        GPRINT:bout:MIN:%.2lf \
        GPRINT:bout:AVERAGE:%.2lf \
        GPRINT:bout:MAX:%.2lf \
        "


$RRDTOOL graph $OUTDIR/$OUTPRE-hour.png -a PNG --start -14400 $DISP
$RRDTOOL graph $OUTDIR/$OUTPRE-day.png -a PNG --start -86400 $DISP
$RRDTOOL graph $OUTDIR/$OUTPRE-month.png -a PNG --start -2592000 $DISP

OUTPRE=lighttpd-requests

DISP="-v req --title RequestsperSecond -u 1 \
        DEF:req=$INFILE:Requests:AVERAGE \
        DEF:reqmax=$INFILE:Requests:MAX \
        DEF:reqmin=$INFILE:Requests:MIN \
        AREA:reqmin#ffffff: \
        STACK:reqmax#00f000: \
        LINE1:reqmin#a0a0a0: \
        LINE1:reqmax#a0a0a0: \
        LINE2:req#006000:requests"


$RRDTOOL graph $OUTDIR/$OUTPRE-hour.png -a PNG --start -14400 $DISP
$RRDTOOL graph $OUTDIR/$OUTPRE-day.png -a PNG --start -86400 $DISP
$RRDTOOL graph $OUTDIR/$OUTPRE-month.png -a PNG --start -2592000 $DISP

Безопастное и Быстрое Скачивание Файлов

Модуль: mod_secdownload

Автор: Jan Kneschke
Дата: 2004-08-01
Версия: 1.1

Суть

с помощью этого модуля можно позволить скачивание файлов пользователям прошедшим аутентификацию, на некоторое время

Содержание

Опции

secdownload.secret        = <string>
secdownload.document-root = <string>
secdownload.uri-prefix    = <string>  (по умолчанию: /)
secdownload.timeout       = <short>   (по умолчанию: 60s)

Описание

имеется несколько способов обеспечить безопастное скачивание файлов:

  1. использовать web-сервер и внутреннюю HTTP-аутентификацию
  2. использовать для аутентификации отдельное приложение и отдавать файл через это же приложение

Оба способа имеют свои ограничения:

web-сервер:

приложение:

Простейшим способом объединить оба подхода в один может быть:

  1. приложение аутентифицирует пользователя и проверяет права доступа для скачивания файла .
  2. приложение перенаправляет пользователя имеющего права на скачивание файла к web-серверу
  3. web-сервер передаёт файл пользователю

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

mod_secdownload ликвидирует эту проблему аутентификацией к определённому URL на определённое время. Приложение создаёт "билет"(token) и "отметку о времени"(timestamp) которые проверяются web-сервером прежде чем дать доступ к файлу.

Полученный URL имеет слудующий формат:

<uri-prefix><token>/<timestamp-in-hex><rel-path>

<token> это контрольная сумма(MD5) из

  1. секретной строки (данной пользователем)
  2. <относитьного пути> (начиная с /)
  3. <временной метки в hex>

Как видите билет не полностью ограничивает пользователя. Единственным лимитирующем фактором является временная метка, определяющая возможность использования этого URL в течении некоторого времени (secdownload.timeout).

Замечание

Не используйте secret данный в этих примерах так как это только часть билета неизвестного пользователю.

Если пользователь пытается использовать произвольный билет, то он получает от web-сервера сообщение 403 'Forbidden'.

Как только время использования билета истекло, клиент получает сообщение 408 'Request Timeout' (хотя это не совсем стандартное поведение web-сервера).

Если и билет и время его действия в порядке, берётся <rel-path> и добавляется в URL в соответствии с конфигурацией (secdownload.document-root) , пропуская клиента к нужному файлу. После этого шага коды возрата от web-сервера могут быть только 200 или 404.

Пример

Приложение

<?php

$secret = "verysecret";
$uri_prefix = "/dl/";

# имя файла
$f = "/secret-file.txt";

# метка с текущем временем
$t = time();

$t_hex = sprintf("%08x", $t);
$m = md5($secret.$f.$t_hex);

# получившаяся ссылка
printf('<a href="%s%s/%s%s">%s</a>',
       $uri_prefix, $m, $t_hex, $f, $f);
?>

Web-сервер

server.modules = ( ..., "mod_secdownload", ... )

secdownload.secret          = "verysecret"
secdownload.document-root   = "/home/www/servers/download-area/"
secdownload.uri-prefix      = "/dl/"

Простой Виртуальный Хостинг

Модуль: mod_simple_vhost

Автор: Jan Kneschke
Дата: 2004-08-29
Версия: 1.1

Суть

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

Содержание

Описание

Простое присвоение:

В указанной директории хостинга имя каждого каталога соответствует аналогичному имени вируального хоста. Внутри каждого такого каталога находится dccroot вируального хоста.

Docroot для каждого вируального хоста строится из следующих трёх значений:

Абсолютный путь к docroot'у строится из:

server-root + hostname + document-root

в случае если путь не существует

server-root + default-host + document-root

Небольшой пример должен дать всё понять:

/var/www/
/var/www/logs/
/var/www/servers/
/var/www/servers/www.example.org/
/var/www/servers/www.example.org/lib/
/var/www/servers/www.example.org/pages/
/var/www/servers/mail.example.org/
/var/www/servers/mail.example.org/lib/
/var/www/servers/mail.example.org/pages/

simple-vhost.server-root = "/var/www/servers/"
simple-vhost.default-host = "www.example.org"
simple-vhost.document-root = "pages"

Вы можете использовать символьные ссылки чтобы соотнести несколько имён хостов одной директории.

Условия vs. виртуальный хостинг

Вы должны знать об использовании условий с виртуальным хостингом.

simple-vhost.server-root = "/var/www/servers/"
simple-vhost.default-host = "www.example.org"
simple-vhost.document-root = "pages"

$HTTP["host"] == "news.example.org" {
  server.document-root = "/var/www/servers/news2.example.org/pages/"
} 

Даже если server.document-root установлен в /var/www/servers/news2.example.org/pages/ если news.example.org запрашиваемый виртуальный хост, то server.document-root смениться.

Если каталог /var/www/servers/news.example.org/pages/ существует, то он будет использован,, в противном случае будет использован /var/www/servers/www.example.org/pages/ по умолчанию.

Дабы те работали параллельно:

$HTTP["host"] !~ "^(news\.example\.org)$" {
  simple-vhost.server-root = "/var/www/servers/"
  simple-vhost.default-host = "www.example.org"
  simple-vhost.document-root = "pages"
}

$HTTP["host"] == "news.example.org" {
  server.document-root = "/var/www/servers/news2.example.org/pages/"
} 

Такая настройка активирет виртуальный хостинг для всех хостов отличных от news.example.org.

Опции

simple-vhost.server-root
корневая директория виртуального хостинга
simple-vhost.default-host
использовать это имя хоста если
simple-vhost.document-root
ниже директории виртуального хоста

Server-Side Includes (SSI)

Модуль: mod_ssi

Автор: Jan Kneschke
Дата: 2004-08-29
Версия: 1.2

Суть

Это модуль для поддержи NSCA/Apache совместимых SSI.

Содержание

Описание

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

server.modules = ( ..., "mod_ssi", ... )
ssi.extension = ( ".shtml" )

Поддерживаемые Опции

  • <!--#echo var="..." -->
  • <!--#include (file="..."\|virtual="...") -->
  • <!--#flastmod (file="..."\|virtual="...") -->
  • <!--#fsize (file="..."\|virtual="...") -->
  • <!--#config timefmt="..." sizefmt="(bytes|abbrev)" -->
  • <!--#printenv -->
  • <!--#set var="..." value="..." -->
  • <!--#if expr="..." -->
  • <!--#elif expr="..." -->
  • <!--#else -->
  • <!--#endif -->

Выполнение Выражений

Каждое ''выражение'' может интерпретироваться:

  • логическое: AND, OR, !
  • сравнение: =, <, <=, >, =>, !=
  • старшинство: (, )
  • строки в кавычках (quoted strings): 'string with a dollar: $FOO'
  • подстановка переменных: $REMOTE_ADDR
  • строки без кавычек (unquoted strings): string

Контроль Потока

операторы if, elif, else и endif могут использоваться для определения условий включения SSI выражений.

Неподдерживаемые Возможности

По сравнению с оригинальным модулем от NCSA и Apache, не поддерживаются следующие опции:

  • exec
  • nested virtual
  • config.errmsg
  • echo.encoding

Безопастный HTTP

Модуль: core

Автор: Jan Kneschke
Дата: 2004-08-29
Версия: 1.2

Суть

Как настроить SSL в lighttpd

Содержание

Описание

lighttpd скомпилированный с библиотекой openssl поддерживает протоколы SSLv2 и SSLv3.

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

Чтобы включить SSL для всего HTTP-сервера, нужно в настройках lighttpd указать путь к вашим SSL-сертификатам и активировать SSL.:

ssl.engine = "enable"
ssl.pemfile = "/path/to/server.pem"

SSL не работает с named-based виртуальным хостингом,- необходимо использовать IP-based виртуальный хостинг если вы хотите запустить несколько SSL-серверов одним lighttpd:

$SERVER["socket"] == "10.0.0.1:443" {
  ssl.engine                  = "enable"
  ssl.pemfile                 = "www.example.org.pem"
  server.name                 = "www.example.org"

  server.document-root        = "/www/servers/www.example.org/pages/"
}

Самоподписанные сертификаты

Самоподписанный сертификат можно создать выполнив следующюю команду:

$ openssl req -new -x509 \
  -keyout server.pem -out server.pem \
  -days 365 -nodes

Server Status

Модуль: mod_status

Автор: Jan Kneschke
Дата: 2004-11-03
Версия: 1.2

Суть

mod_status показывает server-status и server-config

Содержание

Описание

Модуль mod_status используется для просмотра статуса и конфигурации lighttpd на отдельных web-страницах

Опции

status.status-url

По умолчанию: не указано

status.config-url

По умолчанию: не указано

Ограничитель Трафика

Модуль: в ядре

Автор: Jan Kneschke
Дата: 2004-11-03
Версия: 1.2

Суть

ограничивает скорость соединения

Содержание

Описание

Начиная с версии 1.3.8 lighttpd поддерживает ограничение скорости для одиночного соединения или в контексте конфигурации, как то виртуальный хост или URL.

Опции

connection.kbytes-per-second:
 

ограничить скорость соединения для одиночного соединения до указанного лимита в Кб/с.

по умолчанию: 0 (не ограничено)

server.kbytes-per-second:
 

ограничить суммарную скорость соединения до указанного лимита в Кб/с.

если вы хотите ограничить скорость соединения для определённого виртуально сервера, сделайте подобным образом:

$HTTP["host"] == "www.example.org" {
  server.kbytes-per-second = 128
}

что ограничит скорость независимо от настроек по умолчанию для данного хоста.

по умолчанию: 0 (не ограничено)

Дополнительные Замечания

Помните, что выставление лимита менее 32Кб/с на самом деле будет ограничением в 32Кб/с. Это связано с размером исходящего буфера TCP.


Пользовательские Директории

Модуль: mod_userdir

Автор: Jan Kneschke
Дата: 2004-08-29
Версия: 1.1

Суть

модуль для использования web-сервером пользовательских директорий

Содержание

Описание

Этот модуль позволяет web-серверу легко использовать пользовательские директории.

Запрос вида /~user/page.html преобразуется так что возвращает файл page.html из пользовательской директории. Если указана userdir.path, то path добавляется к пути домашней директории.

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

Опции

userdir.path

обычно должно быть "public_html" чтобы использовать ~/public_html/ как docroot

По умолчанию: пусто (домашняя директория является docroot) Пример:

userdir.path = "public_html"
userdir.exclude-user

список пользователей для которых нужно отключить эту возможность

По умолчанию: пусто (работает для всех пользователей) Пример:

userdir.exclude-user = ( "root", "postmaster" )
userdir.include-user

если указана, то только пользователи из этого списка могут использовать эту возможность

По умолчанию: пусто (включена для всех пользователей)