Lighttpd — компактный веб-сервер с событийной моделью обработки соединений. Он появился как решение для сайтов с большим числом одновременных подключений при небольших требованиях к памяти и до сих пор хорошо подходит для встраиваемых систем, роутеров, NAS и небольших виртуальных машин. Сервер умеет отдавать статику, работать с FastCGI и PHP, проксировать запросы и завершать TLS. Разберём установку, конфигурацию, виртуальные хосты и диагностику.

Установка и структура конфигурации

В Debian, Ubuntu и Linux Mint пакет ставится одной командой и сразу запускается как служба. Основной файл — /etc/lighttpd/lighttpd.conf; модули описываются в conf-available и включаются символическими ссылками в conf-enabled.

sudo apt install lighttpd
sudo systemctl enable --now lighttpd
sudo lighttpd-enable-mod fastcgi fastcgi-php
sudo lighttpd -tt -f /etc/lighttpd/lighttpd.conf

Ключ -t проверяет синтаксис, -tt делает более глубокую проверку и пытается загрузить модули. Это первое, что стоит выполнить после любой правки: сервер не запустится с ошибкой в конфиге, а в журнале останется лишь общая строка. Каталог сайта по умолчанию — /var/www/html, пользователь службы — www-data.

Минимальный конфиг и виртуальные хосты

Базовая настройка задаёт порт, корень, индексные файлы и список модулей. Для нескольких сайтов используют условия по имени хоста: внутри блока $HTTP["host"] переопределяются корень, логи и правила.

server.port = 80
server.document-root = "/var/www/html"
server.modules = ( "mod_access", "mod_accesslog", "mod_deflate", "mod_expires" )
index-file.names = ( "index.html", "index.php" )
$HTTP["host"] == "example.org" {
    server.document-root = "/var/www/example"
    accesslog.filename = "/var/log/lighttpd/example.access.log"
}

Условия можно комбинировать: $HTTP["url"] для путей, $SERVER["socket"] для портов. Так делают запрет доступа к служебным каталогам и отдельные правила кэширования для статики. Не забывайте, что порядок блоков имеет значение, а вложенность ограничена разумными пределами.

$HTTP["url"] =~ "^/\.(git|env)" { url.access-deny = ( "" ) }
$HTTP["url"] =~ "\.(css|js|png|jpg|svg)$" {
    expire.url = ( "" => "access plus 30 days" )
}
server.errorlog = "/var/log/lighttpd/error.log"

PHP через FastCGI

Lighttpd не встраивает PHP в процесс, а общается с отдельным пулом PHP-FPM по сокету. Это правильнее с точки зрения безопасности и стабильности: падение скрипта не роняет веб-сервер.

sudo apt install php-fpm
systemctl list-units --type=service 'php*-fpm*'
ls /run/php/
sudo lighttpd-enable-mod fastcgi-php

В конфиге модуля укажите сокет, который реально существует в /run/php/. Имя версии зависит от дистрибутива, поэтому не копируйте путь из чужого руководства вслепую. После правки перезагрузите lighttpd и проверьте страницу с phpinfo(), затем удалите её.

fastcgi.server = ( ".php" =>
  ( "php-local" =>
    ( "socket" => "/run/php/php8.3-fpm.sock",
      "broken-scriptfilename" => "enable" ) ) )

Обратный прокси и TLS

Модуль mod_proxy позволяет отдать часть путей приложению на другом порту. Это удобно для API, админки или сервиса, который не умеет работать напрямую с интернетом.

server.modules += ( "mod_proxy" )
$HTTP["url"] =~ "^/api/" {
    proxy.server = ( "" => ( ( "host" => "127.0.0.1", "port" => 8080 ) ) )
}

Для HTTPS включите mod_openssl, укажите сертификат и ключ, а также перенаправление с 80 на 443. Сертификаты Let’s Encrypt удобно получать через certbot в режиме webroot, не останавливая сервер.

server.modules += ( "mod_openssl" )
$SERVER["socket"] == ":443" {
    ssl.engine = "enable"
    ssl.pemfile = "/etc/letsencrypt/live/example.org/fullchain.pem"
    ssl.privkey = "/etc/letsencrypt/live/example.org/privkey.pem"
}
$HTTP["scheme"] == "http" {
    url.redirect = ( "^/(.*)" => "https://example.org/$1" )
}

Оптимизация для слабого железа

Главные рычаги — число соединений, размеры буферов и кэширование статики. На устройстве с 256 МБ памяти не стоит поднимать лимиты «на всякий случай»: каждый буфер расходуется на активное соединение. Проверьте реальное потребление процесса и только потом меняйте параметры.

ps -o pid,rss,vsz,comm -C lighttpd
ss -s
curl -sI http://127.0.0.1/ | head
curl -so /dev/null -w '%{http_code} %{time_total}\n' http://127.0.0.1/

Сжатие mod_deflate экономит трафик, но на слабом CPU может увеличить задержку. Кэширование через mod_expires снижает число запросов к диску. Для флеш-накопителей полезно уменьшить запись логов или вынести их в tmpfs, если потеря истории допустима.

Отдельно стоит позаботиться о ротации журналов: без неё небольшой раздел на встраиваемом устройстве заполнится за недели. В Debian этим занимается logrotate, но конфигурацию для виртуальных хостов нужно добавить вручную. Проверьте, что файлы логов не растут бесконечно, и ограничьте уровень детализации, если отладка уже завершена.

sudo logrotate -d /etc/logrotate.conf
sudo logrotate -f /etc/logrotate.d/lighttpd
du -sh /var/log/lighttpd
df -h /var

Безопасность начинается с минимального набора модулей: отключите всё, что не используется, запретите листинг каталогов и доступ к скрытым файлам, а также ограничьте методы запросов. Для админ-панели добавьте отдельный виртуальный хост и, если возможно, ограничение по адресу сети.

dir-listing.activate = "disable"
$HTTP["remoteip"] !~ "^192\.168\.1\." {
    $HTTP["url"] =~ "^/admin/" { url.access-deny = ( "" ) }
}
server.max-connections = 256

Диагностика

Если сайт не открывается, идите по цепочке: слушает ли порт, отвечает ли локально, что в журнале ошибок, совпадают ли права на файлы. Частая причина 403 — отсутствие прав на каталог или индексного файла, 404 — неверный document-root.

sudo systemctl status lighttpd --no-pager
sudo ss -ltnp | grep -E ':80|:443'
tail -n 50 /var/log/lighttpd/error.log
namei -l /var/www/example/index.html

Для проверки конфигурации используйте lighttpd -tt, для просмотра итоговых значений — lighttpd -p -f /etc/lighttpd/lighttpd.conf. Не забывайте перезагружать службу после правок и проверять, что автозапуск включён.

Если нужен HTTP/2, убедитесь, что версия сервера его поддерживает, и включите модуль mod_h2 вместе с TLS: на практике протокол работает именно по защищённому соединению. Для статики выигрыш заметен на множестве мелких файлов, для одиночного API — меньше. Включайте по одному изменению и сравнивайте время ответа, иначе легко списать на протокол ошибку конфигурации.

lighttpd -v
curl -I --http2 https://example.org/
curl -o /dev/null -s -w '%{time_total}\n' https://example.org/

Чек-лист

  • Проверьте синтаксис конфига ключом -tt до перезапуска.
  • Задайте отдельные логи для каждого виртуального хоста.
  • Для PHP используйте сокет PHP-FPM, а не запуск от пользователя сервера.
  • Настройте редирект на HTTPS и автопродление сертификата.
  • Ограничьте доступ к скрытым и служебным каталогам.
  • Измеряйте RSS и число соединений на реальной нагрузке.

Итог

Lighttpd остаётся разумным выбором там, где важны малый размер, предсказуемое потребление памяти и простая конфигурация: на домашнем сервере, NAS, роутере или недорогой VPS. Он не стремится заменить nginx во всех сценариях, но для статики, PHP и лёгкого проксирования возможностей достаточно. Начните с минимального конфига, проверьте его через -tt, подключите PHP-FPM и TLS, а оптимизацию проводите по измерениям, а не по советам из интернета.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте