lighttpd (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
lighttpd
. Дата последней синхронизации: 10 апреля 2022. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
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
Важно
Пользователи, планирующие внедрять SSL/TLS, должны знать, что некоторые варианты и реализации уязвимы для атак. Подробности описаны в статье
OpenSSL
.
Совет
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"
   )
)
Примечание
Значение realm, введённое в файле
/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, нужно провести дополнительную настройку.
Примечание
По умолчанию lighttpd будет запускать процессы от пользователя и группы "http".
Сперва скопируйте пример настроек
/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"
Примечание
Демон php-fpm необходимо запускать до lighttpd, иначе php-скрипты не будут обрабатываться (будут выдаваться ошибки 500 или 503).
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
(англ.)