Назад | Перейти на главную страницу

lighttpd + Webmin во вложенной папке

Я использую Webmin для администрирования моего домашнего сервера.

Вместо того, чтобы запускать его на порту по умолчанию (https: // myhost: 10000), Я хотел разместить его в подпапке (https: // myhost / webmin /). Это отлично работает при использовании Apache (файлы конфигурации Apache прилагаются ниже). Однако обычно я использую lighttpd, и я хотел сделать то же самое (запустить Webmin в подпапке) с lighttpd. Однако он не работает должным образом. Всякий раз, когда я иду в https: // myhost / webmin /, Я получаю сообщение:

Error - Bad Request
This web server is running in SSL mode. Try the URL https://localhost:10000/ instead.

Так что я немного глубже изучил проблему. Вместо запуска Webmin я использовал netcat для прослушивания порта 10000. При использовании lighttpd я получаю:

myhost@myhost:~$ nc -l 10000
GET /webmin/ HTTP/1.0
Host: myhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Cookie: testing=1
Cache-Control: max-age=0
X-Forwarded-For: 192.168.159.1
X-Host: myhost
X-Forwarded-Proto: https

Тогда как при использовании Apache я получаю:

myhost@myhost:~$ nc -l 10000
ÌÈOPù¶°$óI¢ÚH,-ånú­? ÆÀ2´ûZÀÀ
98ÀÀ5
À    ÀÀ
ÀÀ      32EDÀÀ/AÀÀÀ
ÀÿD

42
#PuTTYPuTTYPuTTY^C

Как видите, вероятно, это рукопожатие SSL. Прерывание netcat на этом этапе также показывает сообщение об ошибке Apache «Причина: ошибка во время установления связи SSL с удаленным сервером», поэтому я почти уверен, что здесь действительно происходит установление связи SSL.

Это означает, что Webmin прав, полученный запрос - это не HTTPS, а HTTP-запрос.

Возникает вопрос, почему Apache правильно использует HTTPS для проксирования, тогда как lighttpd использует HTTP с некоторыми X-Forwarded-Proto для проксирования? Как я могу добиться аналогичного SSL-проксирования с помощью lighttpd?


Для записи, все изменения в файлах конфигурации, которые я сделал. Я добавил следующие строки в / etc / webmin / config:

webprefix=/webmin
webprefixnoredir=1
referer=myhost

Я добавил следующее для lighttpd в lighttpd.conf (что вызывает ошибку выше):

$HTTP["url"] =~ "^/webmin" {
   proxy.server  = ( "/webmin/" =>
     ( (
        "strip-request-uri" => "/webmin",
        "host" => "127.0.0.1",
        "port" => 10000,
        "fix-redirects" => 1
     ) ) )
}

И я использую следующий файл конфигурации для Apache (который работает правильно):

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so

ProxyPass /webmin/ https://myhost:10000/
ProxyPassReverse /webmin/ https://myhost:10000/
SSLProxyEngine On

<Proxy *>
allow from all
SSLRequireSSL
</Proxy>

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    </VirtualHost>
</IfModule>

Неважно, теперь он работает.


Ой, подождите, вы думали, это все? Нет, друзья Server Fault и пользователи поисковых систем, вот руководство по настройке lighttpd с Webmin, работающим в подпапке. Наслаждайтесь!

Предпосылки

Цель этого руководства - настроить установку lighttpd вместе с Webmin, чтобы можно было получить доступ к интерфейсу Webmin по адресу *http: // myhost / webmin.

На момент написания этого руководства текущая версия Webmin была 1.580, а используемая версия lighttpd - 1.4.28. Я предполагаю, что вы уже установили оба. Имя «myhost» всегда обозначает имя хоста машины, на которой работает lighttpd.

Шаги

1. Конфигурация Webmin

Как упоминалось в официальном руководстве для Apache, вам необходимо добавить следующие строки в / etc / webmin / config:

webprefix=/webmin
webprefixnoredir=1
referer=myhost

2. Отключите SSL в Webmin.

Да, вы не ослышались, и, как Шейн Мэдден упомянул в комментарии выше, это не небезопасно, поскольку общение выглядит так:

client <----SSL----> myhost <--Loopback--> myhost:10000

Webmin будет связываться с экземпляром lighttpd, запущенным на myhost, через устройство обратной связи, которое находится внутри машины, что обычно можно контролировать только с привилегиями суперпользователя. Связь между клиентом и lighttpd по-прежнему будет с использованием SSL.

Итак, а как отключить SSL в Webmin? Просто отредактируйте следующую строку в /etc/webmin/miniserv.conf:

ssl=0

3. Конфигурация Lighttpd

Добавьте следующие строки в ваш /etc/lighttpd/lighttpd.conf:

$HTTP["url"] =~ "^/webmin" {
  magnet.attract-physical-path-to = ( "/var/www/webmin/conf/webmin-rewrite.lua" )

  proxy.server  = ( "" =>
    ( (
        "host" => "127.0.0.1",
        "port" => 10000,
    ) ) )
}

Как видите, мы проверяем, начинается ли URL с «/ webmin», и перенаправление на экземпляр Webmin прослушивает 127.0.0.1:10000. Однако Webmin не ожидает наличия дополнительного пути «... / webmin» в URL-адресе запроса, поэтому мы должны удалить его из URL-адреса. Однако, поскольку мы находимся в условном $ HTTP ["url"] - условном, мы не можем использовать какие-либо методы перезаписи URL, представленные mod_rewrite. (В противном случае мы бы просто сказали "strip-request-uri" => "/ webmin", но это не сработает. Это известная проблема, которая не решает проблему в lighttpd 1.4. См. Также документацию по mod_rewrite.) Однако мы можем используйте mod_magnet, чтобы переписать URL-адрес в сценарии LUA.

4. Скрипт LUA для mod_magnet

Создайте /var/www/webmin/conf/webmin-rewrite.lua со следующим содержимым:

subfolder = "/webmin"
n = string.len(subfolder)

if string.sub(lighty.env["request.uri"], 1, n) == subfolder then
    lighty.env["request.uri"] = string.sub(lighty.env["request.uri"], n+1)
end

Это удаляет префикс «/ webmin» из URL-адресов запроса.

5. Изменения кода для исправления перенаправлений.

Это уже почти работает, однако в коде перенаправления Webmin все еще есть ошибка, о которой также упоминалось Вот. В /usr/share/webmin/miniserv.pl измените строку

&write_data("Location: $prot://$host$portstr$in{'page'}\r\n");

к

&write_data("Location: $prot://$host$config{'subfolder_prefix'}$in{'page'}\r\n");

И в /etc/webmin/miniserv.conf добавьте строку:

subfolder_prefix=/webmin

Это исправляет перенаправление входа в систему Webmin, и все готово!

Дальнейшие примечания

Начиная с lighttpd версии 1.5, вы, вероятно, можете заменить скрипт LUA на mod_proxy_core, поскольку он способен переписывать URL-адреса запросов. Однако я этого не пробовал.

Кроме того, поскольку нет необходимости получать доступ к порту 10000 извне, я предлагаю заблокировать его:

iptables -A INPUT -i eth0 -p tcp --dport 10000 -j REJECT --reject-with tcp-reset

Однако эта команда может отличаться в зависимости от вашей локальной конфигурации.