Вопрос или проблема
У меня работают два сервера Raspberry Pi. Они были настроены с DietPi. Один сервер используется как сервер NextCloud. Другой (новый) сервер работает на weewx. Оба используют lighttpd в качестве веб-сервера. Каждый работает под разным доменным именем my.domain.com и my.otherdomain.com.
У моего роутера есть один IP-адрес, и я использую перенаправление портов для доступа к обоим серверам. Сервер NextCloud (my.domain.com) имеет включённый SSL с использованием dietpi-letsencrypt. Я не могу запустить certbot на my.otherdomain.com, потому что у меня только один публичный IP-адрес.
Я включил mod-proxy на своём сервере Nextcloud (my.domain.com), и он перенаправляет запросы с my.otherdomain.com на машину weewx. Я отключил перенаправление портов на роутере к машине weewx. Тем не менее, dietpi-letsencrypt не может сгенерировать SSL-сертификат для машины weewx – проверки не удались. Я попытался запустить certbot на обеих машинах. Вот попытка для моего сервера Nextcloud (используется как прокси-сервер):
Вы хотите расширить и заменить этот существующий сертификат новым
сертификатом?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(E)xpand/(C)ancel: E
Обновление существующего сертификата для my.domain.com и my.otherdomain.com
Выполнение следующих проверок:
http-01 проверка для aws.andrewterhorst.com
Используя веб-корень /var/www для всех несовпадающих доменов.
Ожидание проверки...
Проверка не удалась для домена my.otherdomain.com
http-01 проверка для my.otherdomain.com
Очистка проверок
Некоторые проверки не удались.
ВАЖНЫЕ ЗАМЕТКИ:
- Следующие ошибки были сообщены сервером:
Домен: my.otherdomain.com
Тип: неавторизовано
Подробности: Неверный ответ от
http://my.otherdomain.com/.well-known/acme-challenge/p16SmhyufIGQ75fnhWQ4zxf49TCLfnX4SoWRmBqAHBg
[129.151.176.124]: "<?xml version=\"1.0\"
encoding=\"iso-8859-1\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD
XHTML 1.0 Transitional//EN\"\n \"http://www."
Чтобы исправить эти ошибки, пожалуйста, убедитесь, что имя вашего домена было
введено правильно, а DNS A/AAAA запись(и) для этого домена
содержат правильный IP-адрес.
[НЕУДАЧА] DietPi-LetsEncrypt | Certbot не удался, пожалуйста, проверьте его вывод в терминале выше. Прерывание...
Я полагаю, что настройки моего обратного прокси неверны. Искать ответы в Интернете было трудоемко. Вот мой файл /etc/lighttpd/lighttpd.conf на машине Nextcloud:
server.modules = (
"mod_indexfile",
"mod_setenv",
"mod_access",
"mod_alias",
"mod_redirect",
"mod_proxy",
)
server.document-root = "/var/www"
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
server.errorlog = "/var/log/lighttpd/error.log"
server.pid-file = "/run/lighttpd.pid"
server.username = "www-data"
server.groupname = "www-data"
server.port = 80
# функции
#https://redmine.lighttpd.net/projects/lighttpd/wiki/Server_feature-flagsDetails
server.feature-flags += ("server.h2proto" => "enable")
server.feature-flags += ("server.h2c" => "enable")
server.feature-flags += ("server.graceful-shutdown-timeout" => 5)
#server.feature-flags += ("server.graceful-restart-bg" => "enable")
# строгий парсинг и нормализация URL для согласованности и безопасности
# https://redmine.lighttpd.net/projects/lighttpd/wiki/Server_http-parseoptsDetails
# (может потребоваться явно установить "url-path-2f-decode" = "disable"
# если конкретное приложение кодирует URL внутри url-path)
server.http-parseopts = (
"header-strict" => "enable",# по умолчанию
"host-strict" => "enable",# по умолчанию
"host-normalize" => "enable",# по умолчанию
"url-normalize-unreserved"=> "enable",# настоятельно рекомендуется
"url-normalize-required" => "enable",# рекомендуется
"url-ctrls-reject" => "enable",# рекомендуется
"url-path-2f-decode" => "enable",# настоятельно рекомендуется (если не нарушает приложение)
#"url-path-2f-reject" => "enable",
"url-path-dotseg-remove" => "enable",# настоятельно рекомендуется (если не нарушает приложение)
#"url-path-dotseg-reject" => "enable",
#"url-query-20-plus" => "enable",# согласованность в строке запроса
)
index-file.names = ( "index.php", "index.html" )
url.access-deny = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
# порт прослушивания по умолчанию для IPv6 переходит на порт IPv4
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.conf.pl"
include "/etc/lighttpd/conf-enabled/*.conf"
#server.compat-module-load = "disable"
server.modules += (
"mod_dirlisting",
"mod_staticfile",
)
# настройки прокси
$HTTP["host"]=~ "my.otherdomain.com" {
proxy.balance = "fair"
proxy.server = ("" =>
(
( "host" => "192.168.0.261", "port" => 80 ),
( "host" => "192.168.0.261", "port" => 443 )
))
}
Технически настройки прокси должны быть в 10-proxy.conf. Мне нужно запустить эту команду:
lighty-enable-mod proxy
Это создаёт символическую ссылку в /etc/lighttpd/conf-enabled на 10-proxy.conf в /etc/lighttpd/conf-available. Я читал, что я могу просто добавить настройки прокси в lighttpd.conf – не обязательно использовать 10-proxy.conf.
Текущая настройка означает, что входящий трафик на my.otherdomain.com попадает на второй сервер weewx. Тем не менее, certbot должен выходить в интернет. Я сбит с толку, где мне следует запускать certbot – с моей машины weewx или с машины NextCloud?
Я не является специалистом по Linux и нуждаюсь в руководстве о том, как настроить lighttpd для выполнения прямых и обратных прокси, чтобы моя машина weewx могла быть защищена. Большинство постов на эту тему касаются Apache, nginx или какой-либо специфической настройки веб-приложений. Синтаксис настроек lighttpd conf довольно путаный при использовании нотации, похожей на regex. Например:
$HTTP['host'] =~ '^(www.example.com)$' {
url.rewrite-once = ('^/(.*)' => '/vhost/http/%0/$1')
# В lighttpd мы изменяем путь вручную, используя правило переписывания. %0
# ссылается на имя хоста, а $1 - это путь.
proxy.server = ( '' =>
( (
'host' => '127.0.0.1',
'port' => 8080
) )
)
}
Нет пошагового руководства простым и понятным языком для таких простаков, как я.
Я решил свою проблему, обойдя её. Это включало настройку третьего Raspberry Pi в качестве специализированного прокси-сервера с работающим nginx proxy manager (https://nginxproxymanager.com/). Я использовал настройки, описанные здесь: https://www.gitmemory.com/issue/MichaIng/DietPi/4417/847424141.
По сути, шаги, которые я следовал:
- настроить новый Raspberry Pi с Dietpi
- Установить docker и docker compose из меню программного обеспечения Dietpi
- Создать директорию Nginx
- Создать папку docker-compose.yml в этой директории с этим содержимым:
version: "3"
services:
app:
image: 'jc21/nginx-proxy-manager:2'
restart: always
ports:
# Публичный HTTP порт:
- '80:80'
# Публичный HTTPS порт:
- '443:443'
# Порт администраторского веб-интерфейса:
- '81:81'
# Добавьте любой другой порт потока, который вы хотите открыть
# - '21:21' # FTP
environment:
# Если вы хотите использовать Sqlite, раскомментируйте это
# и удалите все строки DB_MYSQL_* выше
DB_SQLITE_FILE: "/data/database.sqlite"
# Раскомментируйте это, если IPv6 не включен на вашем хосте
# DISABLE_IPV6: 'true'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
- Создать базу данных sqlite:
touch ./data/database.sqlite.
- Настроить nginx proxy manager, используя эту команду:
docker-compose up -d
-
Перезагрузить Raspberry Pi, и вуаля – это работает из коробки!
-
Я затем вошёл в администраторский интерфейс http://proxyserver_ip:81. Это аккуратный/современный интерфейс. Я затем добавил перенаправления портов к своим двум серверам, работающим на nextcloud и weewx. Nginx proxy manager получает SSL сертификаты через Letsencrypt. Нет необходимости устанавливать их на каждом сервере. Прокси перенаправляет трафик на порт 80, но в разделе SSL администраторского интерфейса можно принудительно использовать https.
-
У меня возникла небольшая проблема с сервером nextcloud, как только я включил https (502 Bad Gateway). Мне нужно было добавить следующую строку в файл nextcloud config.php:
'overwriteprotocol' => 'https',
- Всё работает как никогда отлично!
Ответ или решение
Обзор настройки обратного прокси-сервера с использованием lighttpd на Raspberry Pi
В условиях использования нескольких Raspberry Pi с ограниченным доступом к IP-адресам, создание обратного прокси-сервера может показаться сложной задачей. В этой статье я объясню, как настроить lighttpd
в качестве обратного прокси-сервера для ваших приложений NextCloud и Weewx, а также предложу альтернативное решение с использованием Nginx Proxy Manager.
Проблема
У вас есть два сервера Raspberry Pi, работающих на DietPi: один для NextCloud (my.domain.com) и другой для Weewx (my.otherdomain.com). Система управления сертификатами через Let’s Encrypt не может выдать SSL-сертификат для Weewx, так как вы используете один публичный IP-адрес и настраиваете переадресацию портов на маршрутизаторе. Вы включили модуль mod-proxy
на своем сервере NextCloud, но возникли проблемы с настройками.
Настройка lighttpd как обратного прокси
-
Конфигурация модуля proxy
Убедитесь, что
mod_proxy
включен в вашем конфигурационном файлеlighttpd.conf
:server.modules += ("mod_proxy")
-
Настройка обратного прокси
Добавьте следующие настройки в ваш
lighttpd.conf
:$HTTP["host"] =~ "my.otherdomain.com" { proxy.server = ( "" => ( ( "host" => "192.168.0.261", "port" => 80 ) ) ) }
Эти настройки перенаправляют весь трафик, направленный на
my.otherdomain.com
, к внутреннему IP-адресу Weewx. -
Редактирование конфигурации HTTPS
Поскольку Weewx не может получить SSL-сертификат, вам нужно будет добавить отдельный контейнер для обработки HTTPS запросов. Это можно сделать через Nginx Proxy Manager или через другой экземпляр
lighttpd
, настроенный с использованием SSL. -
Обновление конфигурации сертификатов
Certbot должен запрашиваться с NextCloud по SSL, но необходимо убедиться, что запросы правильно перенаправляются. Для этого нужно убедиться, что у вас настроены соответствующие записи DNS, и ваш прокси-сервер корректно обрабатывает вызовы к
/.well-known/acme-challenge/
.
Альтернативное решение с Nginx Proxy Manager
Как вы уже выяснили, использование Nginx Proxy Manager является отличным обходным путем для вашей проблемы. Этот подход позволяет избежать сложного управления SSL-сертификатами для каждого отдельного сервера.
Шаги по настройке Nginx Proxy Manager:
-
Установите новый Raspberry Pi и установите Docker и Docker Compose.
-
Создайте файл
docker-compose.yml
для Nginx Proxy Manager:version: "3" services: app: image: 'jc21/nginx-proxy-manager:2' restart: always ports: - '80:80' - '443:443' - '81:81' environment: DB_SQLITE_FILE: "/data/database.sqlite" volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt
-
Запустите Nginx Proxy Manager:
docker-compose up -d
-
Настройте проксирование через веб-интерфейс Nginx Proxy Manager. Вы сможете настроить SSL одновременно для обоих серверов, используя однотипные настройки.
-
Обновите конфигурацию
NextCloud
, добавив параметр'overwriteprotocol' => 'https',
в файлconfig.php
, чтобы исправить ошибки502 Bad Gateway
.
Заключение
Настройка обратного прокси-сервера с использованием lighttpd
может быть затруднительной, особенно для пользователей, которые не имеют значительного опыта работы с Linux. Использование Nginx Proxy Manager предлагает более удобный способ управления прокси-серверами и сертификатами SSL. Это решение ускоряет процесс настройки и минимизирует потенциальные ошибки, делая вашу сеть более безопасной и управляемой.