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 на окремому сокеті (порту). Це корисно, якщо:
- ви хочете, щоб 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/"
}
Мінімалістичне налаштування: власна сторінка + 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"
)
Це дозволяє:
- Показувати власну HTML-сторінку з `/srv/www`
- Зберегти LuCI за `/luci` без зміни основного кореня `/www`
- Уникнути показу LuCI при відкритті кореня сайту