lighttpd обратный прокси

Вопрос или проблема

У меня работают два сервера 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.

По сути, шаги, которые я следовал:

  1. настроить новый Raspberry Pi с Dietpi
  2. Установить docker и docker compose из меню программного обеспечения Dietpi
  3. Создать директорию Nginx
  4. Создать папку 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
  1. Создать базу данных sqlite:
touch ./data/database.sqlite.
  1. Настроить nginx proxy manager, используя эту команду:
docker-compose up -d
  1. Перезагрузить Raspberry Pi, и вуаля – это работает из коробки!

  2. Я затем вошёл в администраторский интерфейс http://proxyserver_ip:81. Это аккуратный/современный интерфейс. Я затем добавил перенаправления портов к своим двум серверам, работающим на nextcloud и weewx. Nginx proxy manager получает SSL сертификаты через Letsencrypt. Нет необходимости устанавливать их на каждом сервере. Прокси перенаправляет трафик на порт 80, но в разделе SSL администраторского интерфейса можно принудительно использовать https.

  3. У меня возникла небольшая проблема с сервером nextcloud, как только я включил https (502 Bad Gateway). Мне нужно было добавить следующую строку в файл nextcloud config.php:

'overwriteprotocol' => 'https',
  1. Всё работает как никогда отлично!

Ответ или решение

Обзор настройки обратного прокси-сервера с использованием 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 как обратного прокси

  1. Конфигурация модуля proxy

    Убедитесь, что mod_proxy включен в вашем конфигурационном файле lighttpd.conf:

    server.modules += ("mod_proxy")
  2. Настройка обратного прокси

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

    $HTTP["host"] =~ "my.otherdomain.com" {
       proxy.server = (
           "" => (
               ( "host" => "192.168.0.261", "port" => 80 )
           )
       )
    }

    Эти настройки перенаправляют весь трафик, направленный на my.otherdomain.com, к внутреннему IP-адресу Weewx.

  3. Редактирование конфигурации HTTPS

    Поскольку Weewx не может получить SSL-сертификат, вам нужно будет добавить отдельный контейнер для обработки HTTPS запросов. Это можно сделать через Nginx Proxy Manager или через другой экземпляр lighttpd, настроенный с использованием SSL.

  4. Обновление конфигурации сертификатов

    Certbot должен запрашиваться с NextCloud по SSL, но необходимо убедиться, что запросы правильно перенаправляются. Для этого нужно убедиться, что у вас настроены соответствующие записи DNS, и ваш прокси-сервер корректно обрабатывает вызовы к /.well-known/acme-challenge/.

Альтернативное решение с Nginx Proxy Manager

Как вы уже выяснили, использование Nginx Proxy Manager является отличным обходным путем для вашей проблемы. Этот подход позволяет избежать сложного управления SSL-сертификатами для каждого отдельного сервера.

Шаги по настройке Nginx Proxy Manager:

  1. Установите новый Raspberry Pi и установите Docker и Docker Compose.

  2. Создайте файл 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
  3. Запустите Nginx Proxy Manager:

    docker-compose up -d
  4. Настройте проксирование через веб-интерфейс Nginx Proxy Manager. Вы сможете настроить SSL одновременно для обоих серверов, используя однотипные настройки.

  5. Обновите конфигурацию NextCloud, добавив параметр 'overwriteprotocol' => 'https', в файл config.php, чтобы исправить ошибки 502 Bad Gateway.

Заключение

Настройка обратного прокси-сервера с использованием lighttpd может быть затруднительной, особенно для пользователей, которые не имеют значительного опыта работы с Linux. Использование Nginx Proxy Manager предлагает более удобный способ управления прокси-серверами и сертификатами SSL. Это решение ускоряет процесс настройки и минимизирует потенциальные ошибки, делая вашу сеть более безопасной и управляемой.

Оцените материал
Добавить комментарий

Капча загружается...