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" )
если указана, то только пользователи из этого списка могут использовать эту возможность
По умолчанию: пусто (включена для всех пользователей)