Jump to content
From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи 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 (англ.)

Category:

- Web server (Русский)