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, а оптимизацию проводите по измерениям, а не по советам из интернета.