Table of Contents

LuCI на lighttpd

LuCI — основна веб-утиліта для адміністрування OpenWrt. За замовчуванням LuCI використовує uHTTPd.

Однак ви можете використовувати інші вебсервери. У сховищах OpenWrt доступно кілька варіантів — див. webserver.

Ця стаття пояснює, як запустити вебінтерфейс LuCI на вебсервері lighttpd.

Див. також:

Увага: у версіях 1.4.56–1.4.59 lighttpd була проблема з реалізацією HTTP/2, яка могла впливати на завантаження LuCI (іноді сторінка завантажувалася лише після F5). Проблему виправлено у версії 1.4.59-2 — рекомендовано оновитися.

Встановлення

Цей підхід дозволяє встановити мінімальну версію LuCI (на відміну від метапакетів `luci` чи `luci-ssl`, які автоматично тягнуть `uHTTPd`).

Спершу встановіть lighttpd і базові пакети LuCI:

opkg update
opkg install lighttpd lighttpd-mod-cgi luci-mod-admin-full libiwinfo

Примітка: `libiwinfo` потрібен тільки якщо ваш роутер має Wi-Fi.

З версії 1.4.56 модулі SSL не встановлюються за замовчуванням, тому виберіть і встановіть один із доступних:

# Подивитися доступні модулі lighttpd
opkg list lighttpd*
# Наприклад:
opkg install lighttpd-mod-openssl

Далі — встановіть тему для LuCI:

opkg install luci-theme-bootstrap

або

opkg install luci-theme-openwrt

Налаштування

Можна або модифікувати стандартну конфігурацію (більше змін), або створити окремий файл конфігурації (простий варіант).

Варіант 1: Використання стандартної конфігурації

Перевірте, що в `/etc/lighttpd/conf.d/30-cgi.conf` підключено модуль mod_cgi:

server.modules += ( "mod_cgi" )

LuCI встановлює скрипти у `/cgi-bin/`. Основний — `luci`, інші — символьні посилання на `cgi-io`.

Додайте до файлу `/etc/lighttpd/conf.d/30-cgi.conf`:

cgi.assign = (
    ".pl"  => "/usr/bin/perl",
    ".cgi" => "/usr/bin/perl",
    ".rb"  => "/usr/bin/ruby",
    ".erb" => "/usr/bin/eruby",
    ".py"  => "/usr/bin/python",
    "/cgi-bin/luci" => "",
    "/cgi-bin/cgi-backup" => "",
    "/cgi-bin/cgi-download" => "",
    "/cgi-bin/cgi-exec" => "",
    "/cgi-bin/cgi-upload" => ""
)

🔍 Пояснення щодо `cgi.assign`: mod_cgi документація.

Також переконайтесь, що lighttpd має root-права, інакше LuCI не працюватиме:

У файлі `/etc/lighttpd/lighttpd.conf` закоментуйте або видаліть:

#server.username             = "http"
#server.groupname            = "www-data"

Варіант 2: Простий спосіб через окремий файл

Створіть новий файл:

`/etc/lighttpd/99-luci.conf`

і вставте:

## Конфігурація LuCI
cgi.assign += (
    "/cgi-bin/luci" => "",
    "/cgi-bin/cgi-backup" => "",
    "/cgi-bin/cgi-download" => "",
    "/cgi-bin/cgi-exec" => "",
    "/cgi-bin/cgi-upload" => ""
)

server.username := ""
server.groupname := ""

Або, щоб вказати виконання CGI для всього каталогу `/cgi-bin`:

## Конфігурація LuCI
$HTTP["url"] =~ "^/cgi-bin" {
    cgi.assign += ( "" => "" )
}

server.username := ""
server.groupname := ""

☝ Ключові відмінності в синтаксисі Lighttpd:

Докладніше: документація Lighttpd

Завершення налаштування

Якщо ви хочете бачити логи lighttpd у виводі команди logread, додайте наступне до файлу `/etc/lighttpd/lighttpd.conf`, `/etc/lighttpd/99-luci.conf` або вашого окремого конфігураційного файлу:

## Увімкнути syslog
server.errorlog-use-syslog = "enable"

Щоб сервер слухав IPv4 і IPv6, створіть наприклад файл `/etc/lighttpd/50-http.conf` з таким вмістом:

# Прослуховування на IPv4
$SERVER["socket"] == ":80" {
}

# Прослуховування на IPv6
$SERVER["socket"] == "[::]:80" {
    server.use-ipv6 = "enable"
}

Увімкніть lighttpd, щоб він запускався автоматично після перезавантаження, і запустіть його:

/etc/init.d/lighttpd enable
/etc/init.d/lighttpd start

Переадресація на HTTPS

Щоб автоматично переадресовувати трафік з HTTP на HTTPS, спершу встановіть пакет:

opkg update
opkg install lighttpd-mod-redirect

Далі створіть файл `/etc/lighttpd/conf.d/50-https.conf` із наступним вмістом:

$SERVER["socket"] == ":443" {
    ssl.engine  = "enable"
    ssl.pemfile = "/etc/lighttpd/ssl/your_private_and_public_key.pem"
} else $HTTP["scheme"] == "http" {
    $HTTP["host"] =~ ".*" {
        url.redirect = (".*" => "https://%0$0")
    }
}

Якщо у вас є сертифікат від авторитетного CA і ви хочете переадресовувати з `hostname` на `hostname.domain`, використовуйте таку конфігурацію (замінивши `hostname` і `hostname.domain` відповідно):

$SERVER["socket"] == ":443" {
    ssl.engine  = "enable"
    ssl.pemfile = "/etc/lighttpd/ssl/your_private_and_public_key.pem"
} else $HTTP["scheme"] == "http" {
    $HTTP["host"] == "hostname" {
        url.redirect = (".*" => "https://hostname.domain$0")
    } else $HTTP["host"] =~ ".*" {
        url.redirect = (".*" => "https://%0$0")
    }
}

Примітка: Переадресація з `https://hostname` на `https://hostname.domain` може не працювати коректно. Причина — SSL-з’єднання встановлюється на основі SNI (Server Name Indication) до того, як відбудеться переадресація. Тобто сертифікат буде перевірено відразу, і він має відповідати саме `hostname`, а не `hostname.domain`.

LuCI та окремий вебсайт одночасно на lighttpd (прослуховування кількох портів)

Ви можете легко додати інший вміст у `document root` lighttpd і використовувати його як ваш власний сайт. Наприклад, ви можете об'єднати вебінтерфейси інших програм OpenWrt в одному серверному інстансі.

Однак іноді доцільно запустити LuCI на окремому сокеті (порту). Це корисно, якщо:

(Альтернативно: ви можете просто видалити HTML-файл-перенаправлення в `/www/index.html`, або перенести скрипт LuCI у менш помітний шлях, наприклад не `/cgi-bin/luci`, а `/cgi-bin/adminXYZ`.)

Запуск другого порту з окремим каталогом

У lighttpd реалізація багатопортового прослуховування з власним каталогом для кожного порту — дуже проста. Розглянемо приклад, де LuCI працює на порту 80, а наш сайт — на порту 81.

1. Створіть каталог для сайту й додайте просту HTML-сторінку:

mkdir /website
echo "<P>It works!</P>" > /website/index.html

2. Додайте в конфігурацію lighttpd (наприклад, у `/etc/lighttpd/60-website.conf`) наступне правило, використовуючи механізм умовної конфігурації на основі сокета:

$SERVER["socket"] == ":81" {
    server.document-root = "/website/"
}

3. Перезапустіть lighttpd:

/etc/init.d/lighttpd restart

Після цього:

❗ Ви можете також поміняти порти місцями, якщо хочете, щоб вебсайт був доступний на порту 80, а LuCI — на порту 81.

Інші можливості

До умовної конфігурації можна також додати інші інструкції:

Додаткові джерела:

Примітка: Замість відкриття другого порту, теоретично можна активувати модуль mod_simple_vhost, щоб обслуговувати сайт через віртуальний хост паралельно з LuCI на одному порту (80). Будь ласка, задокументуйте цей спосіб, якщо він у вас спрацював.

Поради щодо "дружнього співіснування" LuCI, SSL і PHP-сайту

(без використання `mod_simple_vhost`)

Спершу — структура файлів (зверніть увагу на символьне посилання `luci → /www`):

root@OpenWrt / # tree /srv/www 
/srv/www
|-- default
|   |-- example.org -> ../example.org
|   `-- luci -> /www
`-- example.org
    |-- index.html
    |-- luci -> /www
    `-- phpinfo.php

рядки, пов’язані з luci (php), у /etc/lighttpd/lighttpd.conf

server.modules = (
        "mod_rewrite", # needed for luci
        "mod_fastcgi", # needed for php
        "mod_cgi" # needed for luci
)

# luci - no handler means invoking the file
cgi.assign = ( "cgi-bin/luci" => "" )

# php via socket-driven fastcgi.
# to get cgi-php working one needs to comment out (or update
# accordingly) doc_root and user_dir in /etc/php.ini
fastcgi.server = (
        ".php" =>
        ((
                "bin-path" => "/usr/bin/php-fcgi",
                "socket" => "/tmp/php.socket"
        ))
)

# port 80 is default, so this line can be commented out
server.port = 80

# this enables https
$SERVER["socket"] == "0.0.0.0:443" { 
        ssl.engine = "enable"
        ssl.pemfile = "/etc/lighttpd/server.pem"
}

# I prefer to keep sites here
server.document-root = "/srv/www/default/"

# rewrites to keep luci code untouched 
url.rewrite = ( "^/luci$" => "/luci/", # helper only
                "^/cgi-bin/luci.*" => "/luci$0",
                "^/luci-static/.*" => "/luci$0" )

# block to catch accessing luci via http and "kind" redirect to https
$HTTP["scheme"] == "http" {
        $HTTP["url"] =~ "^/(cgi-bin/)?luci" {
                url.redirect = (".*" => "https://%0$0" )
        }
}

# rules for lan access
$HTTP["host"] =~ "^10.0.0.1(\:[0-9]*)?$" {
        dir-listing.activate = "enable"
}

# rules for remote acces by example.org and www.example.org
$HTTP["host"] =~ "^(www.)?example.org(\:[0-9]*)?$" {
        server.document-root = "/srv/www/example.org/"
}

Мінімалістичне налаштування: власна сторінка + LuCI

Мінімалістичне налаштування для розміщення власного сайту в /srv/www/ із доступом до LuCI за адресою http://<ip>/luci виглядає так:

mkdir -p /srv/www
ln -s /www /srv/www/luci

Додайте в `/etc/lighttpd/lighttpd.conf` такі рядки:

server.document-root = "/srv/www/"
server.modules += ("mod_rewrite", "mod_cgi")

cgi.assign = ( "cgi-bin/luci" => "" )

url.rewrite = (
    "^/luci$"             => "/luci/",
    "^/cgi-bin/luci.*"    => "/luci$0",
    "^/luci-static/.*"    => "/luci$0"
)

Це дозволяє: