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

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

Перевірте, що в `/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"

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

`/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

Щоб автоматично переадресовувати трафік з 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`.

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

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

  • ви хочете, щоб LuCI і ваш сайт працювали на різних портах
  • потрібно запустити HTTP і HTTPS сайти паралельно
  • ви хочете уникнути ситуації, коли випадковий відвідувач сайту бачить екран входу 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

Після цього:

  • Ваш сайт доступний на http:<ваш-IP>:81/ * LuCI і далі доступний на http:<ваш-IP>:80/cgi-bin/luci

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

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

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

  • запуск додаткових CGI-пакетів
  • налаштування PHP лише для одного з портів
  • окрема SSL-конфігурація тощо

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

Примітка: Замість відкриття другого порту, теоретично можна активувати модуль 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/"
}

Мінімалістичне налаштування для розміщення власного сайту в /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"
)

Це дозволяє:

  • Показувати власну HTML-сторінку з `/srv/www`
  • Зберегти LuCI за `/luci` без зміни основного кореня `/www`
  • Уникнути показу LuCI при відкритті кореня сайту
This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
  • Last modified: 2025/05/31 07:55
  • by vazaz