Mark Silinio <silinio(at)mail.ru>
последнее обновление 24/07/05
| <- На титульную страницу |
|
| Автор: | Allan Wind |
|---|---|
| Дата: | 2005-01-30 |
| Версия: | 1.1 |
Суть
Модуль доступа используется чтобы ограничить доступ к файлам заканчивающимися на определённые символы.
Модуль доступа используется чтобы ограничить доступ к файлам заканчивающимися на определённые символы.
Запрещает доступ ко всем файлам с определённым окончанием.
По умолчанию: пусто
Пример:
url.access-deny = ( "~", ".inc")
в данном примере запрещается доступ к файлам оканчивающимся на знак тильда (~) или расширение .inc, т.е. например к файлам example~ или example.inc. Файлы с тильдой на конце обычно являются файлами отката различных текстовых редакторов (например vim). Файлы с расширением .inc часто используются в качестве include файлов с кодом.
| Автор: | Jan Kneschke |
|---|---|
| Дата: | 2004-11-03 |
| Версия: | 1.2 |
Суть
Модуль лога доступа ...
CLF в конце строки по-умолчанию, гибкость настроек как у apache'а
писать лог доступа в syslog
По-умолчанию: выключено
имя файла в который должен писаться лог если syslog не используется.
если используется символ '|', то за ним пишется название программы которая будет запущена и начнёт принимать лог доступа на stdin
например:
accesslog.filename = "/var/log/lighttpd.log"
$HTTP["host"] == "mail.example.org" {
accesslog.filename = "|/usr/bin/cronolog"
}
По умолчанию: отключено
формат лога
| Опция | Описание |
|---|---|
| %% | знак процента |
| %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());
?>
| Автор: | Jan Kneschke |
|---|---|
| Дата: | 2004-08-29 |
| Версия: | 1.1 |
Суть
Модуль псевдонимов ...
Модуль псевдонимов используется чтобы указать специальную директорию для заданного URL .
указывает путь к директории для определённого URL
По умолчанию: пусто
Пример:
alias.url = ( "/cgi-bin/" => "/var/www/servers/www.example.org/cgi-bin/" )
| Автор: | Jan Kneschke |
|---|---|
| Дата: | 2004-11-03 |
| Версия: | 1.3 |
Суть
Модуль аутентификации предостовляет ...
lighttpd поддерживает оба метода аутентификации описанные в RFC 2617:
Basic метод передаёт имя пользователя и пароль по сети в открытом виде(закодированными в base64), что способствует возникновению проблемы безопастности в случае если соединение между клиентом и сервером не шифруется.
Digest метод передаёт только хешированную информацию, что значительно повышает конфидециальность аутентификационных данных в незащищённых сетях.
В зависимости от метода lighttpd позволяет использовать различные методы хранения данных необходимых для аутентификации.
для basic аутентификации:
для digest аутентификации:
Файл содержит строки с именами пользователей и паролями в открытом виде. Имя пользователя и пароль разделяются двоеточием. :
например: agent007:secret
Файл содержит строки с именами пользователей и зашифрованными с помощью crypt() паролями. Имя пользователя и пароль разделяются двоеточием.
например: agent007:XWY5JwrAVBXsQ
Для работы с такими файлами вы можете использовать программу htpasswd, входящую в состав apache.
$ htpasswd lighttpd.user.digest agent007
Файл содержит строки с именами пользователей, 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 backend обычно выполняет следующие действия для аутентификации пользователя
если четвёртый шаг проходит без ошибок, то пользователь считается авторизированным
## отладка
# 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"
)
)
| Автор: | 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" => "" )
| Автор: | Jan Kneschke |
|---|---|
| Дата: | 2004-08-29 |
| Версия: | 1.1 |
Суть
хорошее, короткое описание модуля
Сжатие исходящих данных уменьшает нагрузку на сеть и может улучшить общую пропускную способность веб-сервера.
На сегодня поддерживается только статичное содержимое.
Сервер автоматически договаривается какой метод сжатия использовать. Поддерживается gzip, deflate, bzip.
имя директории используемой для кэша сжатых данных
напр.:
compress.cache-dir = "/var/www/cache/"
# как раз неплохо для виртуальго хостинга
$HTTP["host"] == "docs.example.org" {
compress.cache-dir = "/var/www/cache/docs.example.org/"
}
По умолчанию: не выстоалять, сжимать файл для каждого запроса
mime-типы также могут быть сжаты
например:
compress.filetype = ("text/plain", "text/html")
По умолчанию: не выставлено
Для сжатия динамичного содержимого с помощью PHP включите
zlib.output_compression = 1
в php.ini, таким образом PHP сжимает данные сам.
| Автор: | Jan Kneschke |
|---|---|
| Дата: | 2004-11-03 |
| Версия: | 1.3 |
Суть
Интерфейс FastCGI это быстрейший и наиболее безопастный способ обработки запросов внешними программами, тикими как Perl, PHP а также вашими самописными приложениями.
lighttp предостовляет интерфейс ко внешним программам которые поддерживают FastCGI интерфейс. FastCGI Интерфейс определён http://www.fastcgi.com/ и это платформо-независимый и серверо-независимый интерфейс между web-приложением и web-сервером.
Это подразумевает что FastCGI программы запущенные с Apache web-сервером также запустятся с lighttpd и наоборот.
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 вызовы. каждое расширение файла может отправлять своему собственному 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.
Начиная с 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 всё ещё новая возможность, и может вести себя нестабильно. Здесь указаны несколько возможностей как контролировать создание новых процессов:
"max-load-per-proc" => 1 если это работает у вас то всё хорошо.
Если не выставлено min-procs == max-procs.
Для 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 процесса.
Если вы не хотите позволять lighttpd управлять fastcgi процессами, уберите bin-path и используйте spawn-fcgi чтобы 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.ini содержал:
cgi.fix_pathinfo = 1
В противном случае PHP_SELF не примет правильное значение.
Начиная с версии 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"
)
)
)
)
Создание процесса FastCGI прямо в 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 вы должны установить FCGI модуль с CPAN.
Для 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() просто немного задержался, но соединениё установилось.
| Автор: | 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, если вам так надо.
| Автор: | 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> => ...
)
)
например:
proxy.server = ( ".php" =>
( "grisu" =>
(
"host" => "192.168.0.2",
"port" => 1026
)
)
)
|
| Автор: | Jan Kneschke |
|---|---|
| Дата: | 2004-08-29 |
| Версия: | 1.1 |
Суть
перенаправление url
...
перенаправляет заданные 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" )
| Автор: | Jan Kneschke |
|---|---|
| Дата: | 2004-08-29 |
| Версия: | 1.1 |
Суть
mod_rrdtool используется для мониторинга траффика(к серверу и от сервера) и нагрузки на web-сервер
RRD это программа для хранения и отображения информации по времени (загрузка сети, температура процессора, средняя нагрузка на сервер и пр.).
путь к программе rrdtool
например:
rrdtool.binary = "/usr/bin/rrdtool"
название файла 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
| Автор: | Jan Kneschke |
|---|---|
| Дата: | 2004-08-01 |
| Версия: | 1.1 |
Суть
с помощью этого модуля можно позволить скачивание файлов пользователям прошедшим аутентификацию, на некоторое время
secdownload.secret = <string> secdownload.document-root = <string> secdownload.uri-prefix = <string> (по умолчанию: /) secdownload.timeout = <short> (по умолчанию: 60s)
имеется несколько способов обеспечить безопастное скачивание файлов:
Оба способа имеют свои ограничения:
web-сервер:
приложение:
Простейшим способом объединить оба подхода в один может быть:
Так как web-сервер ничего не знает о правах доступа используемых в приложении, полученный URL может использоваться каждым пользователем знающем его.
mod_secdownload ликвидирует эту проблему аутентификацией к определённому URL на определённое время. Приложение создаёт "билет"(token) и "отметку о времени"(timestamp) которые проверяются web-сервером прежде чем дать доступ к файлу.
Полученный URL имеет слудующий формат:
<uri-prefix><token>/<timestamp-in-hex><rel-path>
<token> это контрольная сумма(MD5) из
Как видите билет не полностью ограничивает пользователя. Единственным лимитирующем фактором является временная метка, определяющая возможность использования этого 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);
?>
server.modules = ( ..., "mod_secdownload", ... ) secdownload.secret = "verysecret" secdownload.document-root = "/home/www/servers/download-area/" secdownload.uri-prefix = "/dl/"
| Автор: | 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"
Вы можете использовать символьные ссылки чтобы соотнести несколько имён хостов одной директории.
Вы должны знать об использовании условий с виртуальным хостингом.
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.
| Автор: | Jan Kneschke |
|---|---|
| Дата: | 2004-08-29 |
| Версия: | 1.2 |
Суть
Это модуль для поддержи NSCA/Apache совместимых SSI.
server.modules = ( ..., "mod_ssi", ... ) ssi.extension = ( ".shtml" )
Каждое ''выражение'' может интерпретироваться:
операторы if, elif, else и endif могут использоваться для определения условий включения SSI выражений.
По сравнению с оригинальным модулем от NCSA и Apache, не поддерживаются следующие опции:
| Автор: | 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
| Автор: | Jan Kneschke |
|---|---|
| Дата: | 2004-11-03 |
| Версия: | 1.2 |
Суть
mod_status показывает server-status и server-config
Модуль mod_status используется для просмотра статуса и конфигурации lighttpd на отдельных web-страницах
| Автор: | 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.
| Автор: | Jan Kneschke |
|---|---|
| Дата: | 2004-08-29 |
| Версия: | 1.1 |
Суть
модуль для использования web-сервером пользовательских директорий
Этот модуль позволяет web-серверу легко использовать пользовательские директории.
Запрос вида /~user/page.html преобразуется так что возвращает файл page.html из пользовательской директории. Если указана userdir.path, то path добавляется к пути домашней директории.
Чтобы контроллировать то для каких пользователей включить или отключить эту возможность, используйте include или exclude для имени пользователя.
обычно должно быть "public_html" чтобы использовать ~/public_html/ как docroot
По умолчанию: пусто (домашняя директория является docroot) Пример:
userdir.path = "public_html"
список пользователей для которых нужно отключить эту возможность
По умолчанию: пусто (работает для всех пользователей) Пример:
userdir.exclude-user = ( "root", "postmaster" )
если указана, то только пользователи из этого списка могут использовать эту возможность
По умолчанию: пусто (включена для всех пользователей)