Установка и настройка веб-сервера Lighttpd

lighttpd logo

Введение

Быстрый и легкий веб-сервер Lighttpd имеет совершенно не выговариваемую аббревиатуру, которая читается по английски, как «lighty», или по-русски «лайти».
Связка Lighttpd с менеджером процессов PHP-FPM - легкое и удобное решение, которое позволяет обойтись без тяжеловесного сервера Apache.
Наряду с Nginx Lighttpd  идет в лидерах по тестам быстродействия, но Lighttpd  показался мне проще в настройке.
Выбрана версия PHP 7, как наиболее современная и (теоретически) дающая прирост производительности относительно PHP 5.
СУБД MariaDB выбрана за простоту, скорость и надежность.
В описанном случае установка тестировалась на виртуальном контейнере с Debian 8 x64 minimal.
Linux дистрибутив Debian восьмой версии выбран, как надежный и оптимальный для веб-сервера. CentOS занимает несколько больше памяти на диске, более архаичен и на практике требует подключения к большему числу сторонних репозитариев. ОС Ubuntu для сервера показалась в целом сомнительной идеей, которая вряд ли имеет какие-то преимущества по отношению к Debian. Остальные дистрибутивы Linux  редко используются для веб-серверов.

Предполагается, что до установки веб-сервера изучена важная предварительная информация по основам работы с виртуальным сервером, изложенная в отдельной статье.

Предварительные настройки

Обновление репозиториев:

apt-get update
apt-get dist-upgrade

Установка минимума необходимых компонентов:

apt-get install mc zip unzip nano dialog sudo

Указаны компоненты, которые отсутствуют в минимальной конфигурации Debian и могут частично присутствовать в другой конфигурации.
При желании можно руссифицировать интерфейс операционной системы и прикладных программ.
Команда:

dpkg-reconfigure locales

В появившемся интерфейсе нужно выбрать русский язык - локаль: ru_Ru.UTF-8.
Затем ту же локаль выбрать по умолчанию.
После нового подключения к серверу через SSH-клиент русская локаль должна работать.

MariaDb

Установка необходимых пакетов:

apt-get install mariadb-server mariadb-client

В ходе установки в ответ на запрос потребуется указать хороший взломоустойчивый root-пароль базы данных.

Затем для безопасности рекомендуется выполнить:

mysql_secure_installation

В появившемся диалоге потребуется указать только что заданный вами root-пароль, ответить на вопросы (обычно это n,y,y,y,y)

Lighttpd

Установка веб-сервера:

apt-get install lighttpd

После этого, набрав в браузере ip-адрес VPS, можно увидеть ответ сервера - заставку «Welcome page», которая подтверждает корректный запуск сервера Lighttpd и его способность выдачи информации по протоколу http.

Дальнейшие настройки веб-сервера будут происходить после установки обработчика языка PHP.

PHP 7 (PHP-FPM)

В связи с тем, что на момент подготовки данной статьи (начало 2016 года) в стандартном репозитарии Debian 8 отсутствует пакет PHP 7 версии, потребуется подключить сторонний репозитарий:

nano /etc/apt/sources.list

Добавьте в имеющийся файл следующие строки:

deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

Для корректной работы с пакетами нужна установка ключа этого репозитария:

wget http://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg

Обновление списка пакетов:

apt-get update

Установка пакета PHP 7:

apt-get install php7.0-fpm

Установка расширений PHP для работы CMS:

apt-get install php7.0-mysql php7.0-curl php7.0-gd php7.0-sqlite php7.0-xmlrpc php7.0-xsl php7.0-tidy 
apt-get install php7.0-imap php-pear php7.0-intl php7.0-mcrypt php7.0-recode

Приведенный набор расширений может оказаться избыточным, конкретный выбор зависит от CMS. Лишние расширения в теории - добавочный путь для уязвимостей.

Настройка параметров PHP в конфигурационном файле:

nano /etc/php/7.0/fpm/php.ini

В этом файле для исправления настройки безопасности раскомментировать строку с текстом:

cgi.fix_pathinfo=1

Там же во время теста были изменены значения двух параметров по умолчаний, которые мешают загрузке дампа базы данных м его распаковке в PhpMyAdmin, ограничивая в интерпретаторе php максимальный размер загружаемого файла и время исполнения скрипта:   

upload_max_filesize = 100M
max_execution_time = 200

Перезапуск сервиса php:

service php7.0-fpm restart

Настройка PHP и Lighttpd для их совместной работы

Создаем резервную копию конфигурации и редактируем ее:

cd /etc/lighttpd/conf-available/
cp 15-fastcgi-php.conf 15-fastcgi-php-spawnfcgi.conf
nano 15-fastcgi-php.conf

Заменяем содержимое редактируемого файла на нижеследующее:

fastcgi.server += ( ".php" =>
        ((
                "socket" => "/var/run/php/php7.0-fpm.sock",
                "broken-scriptfilename" => "enable"
        ))
)

Подключаем модули Лайти:

lighttpd-enable-mod fastcgi
lighttpd-enable-mod fastcgi-php

Не меняя папку, в которой находимся, создаем ссылку для запуска новой конфигурации:

ls -l /etc/lighttpd/conf-enabled

Перезапускаем службу сервера Лайти для применения новых параметров.

systemctl force-reload lighttpd

Проверяем корректную работу полученной связки, создав тестовый файл в папке сервера по умолчанию:

nano /var/www/html/info.php

Содержимое файла:

<?php
phpinfo();
?>

Если все корректно настроено,  то у вас получится увидеть большую тестовую страницу PHP, открыв в браузере URL:

http://ip_сервера/info.php

Не забудьте после теста удалить файл info.php.

Настройка нескольких хостов

Для определения пути расположения каждого сайта открываем файл конфигурации Лайти:

nano /etc/lighttpd/lighttpd.conf

В этом файле после строк описания сервера (server.port = ...) добавляем строки для описания каждого сайта:

$HTTP["host"] == "test.ru" {
server.document-root = "/var/www/test.ru"
}

В приведенном примере "test.ru" - веб-адрес сайта, а /var/www/test.ru - локальный адрес папки этого сайта на сервере.

Для применения новых параметров  - новый перезапуск Лайти:

systemctl force-reload lighttpd

Чистые ссылки

Веб-сервер Lighttpd  по принципиальным соображениям не обрабатывает файлы ".htaccess", в которых хранятся настройки Apache для отдельных папок. Эти файлы содержат, в том числе, информацию о правилах редиректов (Redirect), то есть о правилах переадресации с одних веб-адресов страниц на другие.  Переадресация позволяет сокращать адреса и использовать "человекопонятные" - чистые веб адреса страниц. Вместо файлов ".htaccess" Lighttpd использует соответствующие параметры конфигурации самого Lighttpd, а также вспомогательные модули.

Предлагаемые на форумах решения с использованием модуля "mod rewrite" не позволяют корректно решить проблемы определения корректного url (введен ли адрес файла, или папки; нужно ли добавить слэш а адресе и искать в текущей папке файл index.php ... )   
Также в CMS Drupal, использованной для тестирования, проблема не позволяла работать модулю Drupal - ImageCaсhe. По логике рабюоты Drupal при отсутствии миниатюры изображения редирект перенаправляет запрос на модуль ImageCaсhe, после чего ImageCaсhe создает недостающую миниатюру и сохраняет ее в файл, который выдается при генерации страницы и используется в дальнейшем при запросе тоже же изображения.
Поэтому использован другой вариант с подключаемым модулем magnet для Lighttpd  и скрипт на языке Lua, который собственно и будет обрабатывать ссылки.

Ниже описана конфигурация, предназначенная для CMS Drupal 7. Она подходит, как есть, для большинства других CMS, но не для Drupal 8.

Устанавливаем LUA и magnet ( ниже указана текущая версия Lua, которая может в дальнейшем отличаться цифрой):

apt-get install lighttpd-mod-magnet  lua5.2

Подключаем мод magnet:

lighttpd-enable-mod magnet

Редактируем файл конфигурации Лайти:

nano /etc/lighttpd/lighttpd.conf

добавляем в начале файла в списке модулей строку:

"mod_magnet",

а в конце файла добавляем строку, указывающую  путь к файлу скрипта "drupal.lua" :

magnet.attract-physical-path-to = ( "/etc/lighttpd/drupal.lua" )

Создаем файл скрипта:

nano /etc/lighttpd/drupal.lua

Его содержимое:

function file_exists(path)
  local attr = lighty.stat(path)
  if (attr) then
      return true
  else
      return false
  end
end
function removePrefix(str, prefix)
  return str:sub(1,#prefix+1) == prefix.."/" and str:sub(#prefix+2)
end
local prefix = ''
if (not file_exists(lighty.env["physical.path"])) then
    -- file still missing. pass it to the fastcgi backend
    request_uri = removePrefix(lighty.env["uri.path"], prefix)
    if request_uri then
      lighty.env["uri.path"]          = prefix .. "/index.php"
      local uriquery = lighty.env["uri.query"] or ""
      lighty.env["uri.query"] = uriquery .. (uriquery ~= "" and "&" or "") .. "q=" .. request_uri
      lighty.env["physical.rel-path"] = lighty.env["uri.path"]
      lighty.env["request.orig-uri"]  = lighty.env["request.uri"]
      lighty.env["physical.path"]     = lighty.env["physical.doc-root"] .. lighty.env["physical.rel-path"]
    end
end

В том случае, если файлы CMS находятся не в корневой папке сайта, потребуется изменить в файле строку с текстом  "local prefix". Например, для локальной папки с сайтом  /drupal эта строка будет выглядеть так:

local prefix = '/drupal'

Снова перезапускаем Лайти, чтобы изменения настроек вступили в силу:

systemctl force-reload lighttpd

Настройка e-mail

Почти наверняка потребуется отправка почты с сайта, например, для регистрации новых  пользователей, оповещении об новостях, отчетов о доступных обновлениях и т.д. Если тестовая отправка не работает, как это было в моем случае, то потребуется настроить почтовый агент. В моем случае это Exim. Установка Exim:

apt-get install exim4

Настройка работы:

dpkg-reconfigure exim4-config

Отвечаем на вопросы в появившемся интерфейсе настройки, например:

  • Интернет сайт (прием и отправка напрямую).
  • Имя сервера (стоит по умолчанию). 127.0.0.1
  • Другие места (пусто)
  • Домены релейные (пусто)
  • Сокращать кол-во dns-запросов – нет
  • Метод доставки – любое значение
  • Делить на маленькие файлы – нет
  • Адрес для сбора почты postmaster | root  – указать

Полученные настройки будут сохранены в файле /etc/exim4/update-exim4.conf
Но перед тестированием работы почты нужно не забыть запустить:

update-exim4.conf

Основные источники:

Установка PHP 7 с Dotdeb
Installing Lighttpd with PHP5 (PHP-FPM) and MySQL on Debian 8 (Jessie)
Drupal on lighttpd with clean urls made easy