lighttpd (Русский)
lighttpd - веб-сервер, разрабатываемый с расчётом на быстроту и защищённость, а также соответствие стандартам. В lighttpd есть поддержка сжатия отдаваемого содержимого «на лету», HTTP-аутентификации, перезаписи URL, SSL и автоматической балансировки нагрузки (нагрузка может автоматически распределяться по нескольким запущенным серверам lighttpd). Веб-сервер также поддерживает интерфейсы CGI, SCGI, FastCGI.
Установка
Установите пакет lighttpd.
Настройка
Базовая установка
Настройки lighttpd находятся в файле /etc/lighttpd/lighttpd.conf. Настройки по умолчанию позволяют проверить работоспособность сервера.
Проверить правильность настроек и выявить ошибки можно с помощью команды:
$ lighttpd -t -f /etc/lighttpd/lighttpd.conf
Также доступна более тщательная проверка:
$ lighttpd -tt -f /etc/lighttpd/lighttpd.conf
По умолчанию в качестве document-root сервера служит директория /srv/http/.
Для проверки установки создайте в ней файл главной страницы:
/srv/http/index.html
Hello world!
Запустите/включите службу lighttpd.service.
Затем откройте в своём браузере адрес http://localhost и вы должны увидеть тестовую страницу.
Примеры конфигурационных файлов вы можете найти в /usr/share/doc/lighttpd/config/.
Настройка журналов
lighttpd может записывать журналы обращений (accesslog) и ошибок (errorlog). Журнал ошибок включен по умолчанию (настраивается опцией server.errorlog). Для включения журнала обращений отредактируйте файл /etc/lighttpd/lighttpd.conf:
server.modules += ( "mod_accesslog", ) accesslog.filename = "/var/log/lighttpd/access.log"
Включение https
- Mozilla предоставляет генератор настроек, который можно использовать в том числе с lighttpd.
- Для проверки корректности настроек можно использовать сервис SSL Server Check от Qualys SSL Labs.
Самоподписанный сертификат
С помощью openssl можно сгенерировать самоподписанный SSL-сертификат.
Создаем директорию для хранения сертификатов:
# mkdir /etc/lighttpd/certs
Генерируем самоподписанный сертификат (пример команды):
# openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -sha256 -keyout /etc/lighttpd/certs/www.example.com.pem -out /etc/lighttpd/certs/www.example.com.pem
Выставляем владельца и нужные права:
# chown http:http /etc/lighttpd/certs/www.example.com.pem # chmod 600 /etc/lighttpd/certs/www.example.com.pem
Теперь нужно включить SSL в настройках lighttpd (в /etc/lighttpd/lighttpd.conf).
server.modules += ( "mod_openssl" )
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.pemfile = "/etc/lighttpd/certs/www.example.com.pem"
}
Подробнее о настройке можно почитать в документации: lighttpd TLS configuration.
Let's Encrypt
Можно использовать сертификаты, полученные от Let's Encrypt.
В файл /etc/lighttpd/lighttpd.conf добавьте следующие строки:
$SERVER["socket"] == ":443" {
ssl.engine = "enable"
ssl.privkey = "/etc/letsencrypt/live/домен/privkey.pem"
ssl.pemfile = "/etc/letsencrypt/live/домен/fullchain.pem"
}
Подробнее о настройке можно почитать в документации: bootstrap Let's Encrypt.
Перенаправление HTTP на HTTPS
mod_redirect должен быть включён:
/etc/lighttpd/lighttpd.conf
server.modules += ( "mod_redirect" )
Перенаправляем трафик для домена example.org:
/etc/lighttpd/lighttpd.conf
$SERVER["socket"] == ":80" {
$HTTP["host"] == "example.org" {
url.redirect = ( "^/(.*)" => "https://example.org/$1" )
server.name = "example.org"
}
}
Чтобы перенаправить все хосты на их https-эквиваленты, используйте следующую конфигурацию сокета 80 вместо приведённой выше:
$SERVER["socket"] == ":80" {
$HTTP["host"] =~ ".*" {
url.redirect = (".*" => "https://%0$0")
}
}
Перенаправляем запросы на HTTPS для части сайта (в примере ниже - /secure):
/etc/lighttpd/lighttpd.conf
$SERVER["socket"] == ":80" {
$HTTP["url"] =~ "^/secure" {
url.redirect = ( "^/(.*)" => "https://example.com/$1" )
}
}
Защита каталога паролем
Обратите внимание, что этот модуль требует установки mariadb-libs. Для аутентификации пользователей необходим passwd-файл, который является lighttpd-эквивалентом системного /etc/passwd. Настройка требует определённого формата и хеширования пароля md5sum, но пользователи могут быстро и легко создать запись, используя в качестве примера следующее:
$ user=foo $ password=b@R102 $ realm='Password Required' $ hash=`echo -n "$user:$realm:$password" | md5sum | cut -b -32` # echo "$user:$realm:$hash" >> /etc/lighttpd/lighttpd.user
Измените /etc/lighttpd/lighttpd.conf, добавив в него строки, включающие защиту каталога:
server.modules = (
"mod_auth",
)
auth.backend = "htdigest"
auth.backend.htdigest.userfile = "/etc/lighttpd/lighttpd.user"
# note this entry is relative to the server.document-root
auth.require = ( "/secret" =>
(
"method" => "basic",
"realm" => "Password Required",
"require" => "valid-user"
)
)
/etc/lighttpd/lighttpd.conf, должно совпадать со значением из файла /etc/lighttpd/lighttpd.user, чтобы аутентификация работала.CGI
Скрипты Common Gateway Interface (CGI) работают с lighttpd из коробки, вам просто нужно включить модуль CGI, добавить файл настроек и убедиться, что выбранный вами интерпретатор языка программирования установлен. (например, для python установите пакет python).
Создайте файл /etc/lighttpd/conf.d/cgi.conf и добавьте в него следующее:
/etc/lighttpd/conf.d/cgi.conf
server.modules += ( "mod_cgi" )
cgi.assign = ( ".pl" => "/usr/bin/perl",
".cgi" => "/usr/bin/perl",
".rb" => "/usr/bin/ruby",
".erb" => "/usr/bin/eruby",
".py" => "/usr/bin/python",
".php" => "/usr/bin/php-cgi" )
index-file.names += ( "index.pl", "default.pl",
"index.rb", "default.rb",
"index.erb", "default.erb",
"index.py", "default.py",
"index.php", "default.php" )
}
Для php-скриптов в /etc/php/php.ini также добавьте:
cgi.fix_pathinfo = 1
Включаем эти настройки в /etc/lighttpd/lighttpd.conf:
/etc/lighttpd/lighttpd.conf
include "conf.d/cgi.conf"
FastCGI
Установите fcgi. Теперь у вас есть lighttpd с поддержкой fcgi. Если это то, что вы хотели, то всё в порядке. Тем, кто хочет использовать Ruby on Rails, PHP или Python, нужно провести дополнительную настройку.
Сперва скопируйте пример настроек /usr/share/doc/lighttpd/config/conf.d/fastcgi.conf в /etc/lighttpd/conf.d
Следующее содержимое нужно добавить в файл конфигурации
/etc/lighttpd/conf.d/fastcgi.conf
server.modules += ( "mod_fastcgi" )
#server.indexfiles += ( "dispatch.fcgi" ) #this is deprecated
index-file.names += ( "dispatch.fcgi" ) #dispatch.fcgi if rails specified
server.error-handler-404 = "/dispatch.fcgi" #too
fastcgi.server = (
".fcgi" => (
"localhost" => (
"socket" => "/run/lighttpd/rails-fastcgi.sock",
"bin-path" => "/path/to/rails/application/public/dispatch.fcgi"
)
)
)
Включаем этот конфиг в /etc/lighttpd/lighttpd.conf строкой
/etc/lighttpd/lighttpd.conf
include "conf.d/fastcgi.conf"
Для PHP и Ruby on Rails смотрите следующие разделы.
PHP
С помощью php-cgi
Установите пакеты php и php-cgi (смотрите также PHP и LAMP).
Проверяем, что php-cgi работает:
$ php-cgi --version
PHP 5.3.8 with Suhosin-Patch (cgi-fcgi) (built: Sep 11 2011 10:04:49) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
Если вы увидели похожий вывод, значит всё установлено правильно.
Создайте новый файл настроек:
/etc/lighttpd/conf.d/fastcgi.conf
server.modules += ("mod_fastcgi")
index-file.names += ("index.php")
fastcgi.server = (
# Распределение запросов к этому адресу...
".php" => (
# ... по следующим серверам FastCGI. Строка с именем сервера — это
# просто метка, которая позволяет идентифицировать сервер в журналах
"localhost" => (
"bin-path" => "/usr/bin/php-cgi",
"socket" => "/tmp/php-fastcgi.sock",
# breaks SCRIPT_FILENAME in a way that PHP can extract PATH_INFO
# from it
"broken-scriptfilename" => "enable",
# Запуск (max-procs + (max-procs * PHP_FCGI_CHILDREN)) процессов, где
# max-procs это "watchers", а остальные это "workers". Смотрите:
# https://redmine.lighttpd.net/projects/1/wiki/frequentlyaskedquestions#How-many-php-CGI-processes-will-lighttpd-spawn
"max-procs" => "4", # значение по умолчанию
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "1" # значение по умолчанию
)
)
)
)
Включаем этот конфиг в /etc/lighttpd/lighttpd.conf строкой
/etc/lighttpd/lighttpd.conf
include "conf.d/fastcgi.conf"
/usr/share/doc/lighttpd/config/modules.conf.Перезагрузите службу lighttpd.service с новыми настройками (reload).
- Если вы получаете ошибки, подобные этим "No input file found" при попытке получить доступ к вашему php файлу, у этого могут быть разные причины; смотрите этот FAQ.
- Убедитесь, что нет других модулей (например,
mod_cgi), которые будут пытаться обрабатывать .php файлы.
С помощью php-fpm
Установите пакет php-fpm и запустите/включите службу php-fpm.service.
/etc/php/php-fpm.conf. Более подробную информацию о php-fpm можно найти на сайте php-fpm. Не забывайте перезапускать php-fpm.service после изменения настроек.В файл /etc/lighttpd/conf.d/fastcgi.conf добавьте:
/etc/lighttpd/conf.d/fastcgi.conf
server.modules += ( "mod_fastcgi" )
index-file.names += ( "index.php" )
fastcgi.server = (
".php" => (
"localhost" => (
"socket" => "/run/php-fpm/php-fpm.sock",
"broken-scriptfilename" => "enable"
))
)
)
Аналогично предыдущему описанию включаем этот конфиг в /etc/lighttpd/lighttpd.conf строкой
/etc/lighttpd/lighttpd.conf
include "conf.d/fastcgi.conf"
uWSGI
В файл /etc/lighttpd/lighttpd.conf добавьте
server.modules += ("mod_scgi")
$HTTP["url"] =~ "^/uwsgi/" {
scgi.protocol = "uwsgi"
scgi.server = (
"/uwsgi/foo" => ((
"socket" => "/путь/к/сокету",
"check-local" => "disable"
)),
"/uwsgi/bar" => ((
"host" => "127.0.0.1",
"port" => "8080",
"check-local" => "disable"
))
)
}
Затем вы можете запустить приложение uwsgi либо как юнит systemd либо напрямую. Здесь руководство от digitalocean о том, как настроить приложение flask с нуля.
Сжатие исходящих данных
Сжатие исходящих данных уменьшает нагрузку на сеть и может улучшить общую пропускную способность веб-сервера.
Скопируйте файл с примером настроек:
# mkdir /etc/lighttpd/conf.d # cp /usr/share/doc/lighttpd/config/conf.d/deflate.conf /etc/lighttpd/conf.d/
Включите настройки, добавив в /etc/lighttpd/lighttpd.conf:
include "conf.d/deflate.conf"
Наконец, перезапустите lighttpd.service с новыми настройками, и он будет динамически сжимать простой текст и html.
/etc/lighttpd/lighttpd.conf.Также можно выбрать тип содержимого, которое должно быть сжато, изменив в файле /etc/lighttpd/conf.d/deflate.conf параметр deflate.mimetypes:
deflate.mimetypes = ("text/plain", "text/html", "text/javascript", "text/css", "text/xml")
Можно создать каталог для хранения сжатых файлов. Создаём нужную директорию и задаём владельца:
# mkdir /var/cache/lighttpd/compress/ # chown http:http /var/cache/lighttpd/compress/
В файле /etc/lighttpd/conf.d/deflate.conf раскомментируйте и измените параметр deflate.cache-dir:
deflate.cache-dir = "/var/cache/lighttpd/compress"
Смотрите также
- Lighttpd wiki (англ.)