Lighttpd 리버스 프록시

Lighttpd 리버스 프록시

두 개의 Raspberry Pi 서버가 실행 중입니다. 이는 DietPi를 사용하여 설정됩니다. 한 서버는 NextCloud 서버 역할을 합니다. 다른 (새) 서버가 weewx를 실행하고 있습니다. 둘 다 lighttpd를 웹 서버로 사용합니다. 각 도메인은 서로 다른 도메인 my.domain.com 및 my.otherdomain.com에서 실행됩니다.

내 라우터에는 하나의 IP 주소가 있으며 포트 전달을 사용하여 두 서버에 모두 액세스합니다. NextCloud 서버(my.domain.com)에는 Dietpi-letsencrypt를 사용하여 SSL이 활성화되어 있습니다. 공용 IP 주소만 있기 때문에 my.otherdomain.com에서 certbot을 실행할 수 없습니다.

Nextcloud 시스템(my.domain.com)에서 mod-proxy를 활성화했으며 my.otherdomain.com에 대한 요청을 weewx 시스템으로 전달합니다. 라우터에서 weewx 시스템으로의 포트 전달을 비활성화했습니다. 그러나 Dietpi-letsencrypt는 weewx 시스템에 대한 SSL 인증서를 생성할 수 없습니다. 챌린지가 실패했습니다. 두 대의 컴퓨터에서 certbot을 실행하려고 합니다. 내 Nextcloud 시스템(내 프록시 서버로 사용됨)에 대한 시도는 다음과 같습니다.

Do you want to expand and replace this existing certificate with the new
certificate?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(E)xpand/(C)ancel: E 
Renewing an existing certificate for my.domain.com and my.otherdomain.com
Performing the following challenges:
http-01 challenge for aws.andrewterhorst.com
Using the webroot path /var/www for all unmatched domains.
Waiting for verification...
Challenge failed for domain my.otherdomain.com
http-01 challenge for my.otherdomain.com
Cleaning up challenges
Some challenges have failed.

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: my.otherdomain.com
   Type:   unauthorized
   Detail: Invalid response from
   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."

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address.
[FAILED] DietPi-LetsEncrypt | Certbot failed, please check its above terminal output. Aborting...

내 역방향 프록시 설정이 잘못된 것 같습니다. 인터넷에서 답변을 검색하는 것은 어려웠습니다. 이것은 Nextcloud 시스템의 /etc/lighttpd/lighttpd.conf 파일입니다.

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

# features
#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")

# strict parsing and normalization of URL for consistency and security
# https://redmine.lighttpd.net/projects/lighttpd/wiki/Server_http-parseoptsDetails
# (might need to explicitly set "url-path-2f-decode" = "disable"
#  if a specific application is encoding URLs inside url-path)
server.http-parseopts = (
  "header-strict"           => "enable",# default
  "host-strict"             => "enable",# default
  "host-normalize"          => "enable",# default
  "url-normalize-unreserved"=> "enable",# recommended highly
  "url-normalize-required"  => "enable",# recommended
  "url-ctrls-reject"        => "enable",# recommended
  "url-path-2f-decode"      => "enable",# recommended highly (unless breaks app)
 #"url-path-2f-reject"      => "enable",
  "url-path-dotseg-remove"  => "enable",# recommended highly (unless breaks app)
 #"url-path-dotseg-reject"  => "enable",
 #"url-query-20-plus"       => "enable",# consistency in query string
)

index-file.names            = ( "index.php", "index.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

# default listening port for IPv6 falls back to the IPv4 port
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",
)


# proxy settings
$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-available의 10-proxy.conf에 대한 /etc/lighttpd/conf-enabled의 심볼릭 링크가 생성됩니다. lighttpd.conf에 프록시 설정을 추가하면 된다는 내용을 읽었습니다. 10-proxy.conf를 사용할 필요가 없습니다.

현재 설정은 my.otherdomain.com으로 들어오는 트래픽이 결국 두 번째 weewx 컴퓨터에 도달한다는 것을 의미합니다. 그러나 certbot은 통신이 필요합니다. weewx 시스템이나 NextCloud 시스템 중 어디에서 certbot을 실행해야 하는지 혼란스럽습니다.

저는 Linux 전문가가 아니며 weewx 시스템이 안전할 수 있도록 정방향 및 역방향 프록시에 대해 lighttpd를 설정하는 방법에 대한 지침이 필요합니다. 이를 다루는 대부분의 게시물에는 Apache, nginx 또는 일부 특정 웹 애플리케이션 설정이 포함됩니다. lighttpd conf 설정의 구문은 정규식과 같은 표기법을 사용하므로 매우 혼란스럽습니다. 예를 들어:

$HTTP['host'] =~ '^(www.example.com)$' {
        url.rewrite-once = ('^/(.*)' => '/vhost/http/%0/$1')
        # In lighttpd we alter the path manually using rewrite rule. %0
        # refers to the hostname and $1 is the path.
        proxy.server = ( '' =>
                ( (
                'host' => '127.0.0.1',
                'port' => 8080
                ) )
        )
}

나 같은 바보에게는 영어로 된 쉬운 단계별 튜토리얼이 없습니다.

답변1

나는 문제를 피함으로써 문제를 해결했습니다. 여기에는 세 번째 Raspberry Pi를 nginx 프록시 관리자(https://nginxproxymanager.com/). 여기에 설명된 설정을 사용했습니다.https://www.gitmemory.com/issue/MichaIng/DietPi/4417/847424141.

기본적으로 내가 따른 단계는 다음과 같습니다.

  1. Dietpi를 실행하는 새로운 Raspberry Pi 설정
  2. Dietpi 소프트웨어 메뉴에서 docker 및 docker compose를 설치하세요.
  3. Nginx 디렉토리 생성
  4. 다음 콘텐츠로 이 디렉터리에 docker-compose.yml 폴더를 만듭니다.
version: "3"
services:
  app:
    image: 'jc21/nginx-proxy-manager:2'
    restart: always
    ports:
      # Public HTTP Port:
      - '80:80'
      # Public HTTPS Port:
      - '443:443'
      # Admin Web Port:
      - '81:81'
      # Add any other Stream port you want to expose
      # - '21:21' # FTP
    environment:
      # If you would rather use Sqlite uncomment this
      # and remove all DB_MYSQL_* lines above
      DB_SQLITE_FILE: "/data/database.sqlite"
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
  1. sqlite 데이터베이스를 생성합니다:
touch ./data/database.sqlite.
  1. 다음 명령을 사용하여 nginx 프록시 관리자를 설정합니다.
docker-compose up -d
  1. Raspberry Pi와 비올라를 다시 시작했습니다. 상자에서 꺼내자마자 바로 작동했습니다!

  2. 그런 다음 http://proxyserver_ip:81에서 관리 인터페이스에 로그인했습니다. 깨끗하고 현대적인 인터페이스입니다. 그런 다음 nextcloud와 weewx를 실행하는 두 서버에 포트 전달을 추가했습니다. nginx 프록시 관리자는 Letsencrypt를 통해 SSL 인증서를 얻습니다. 모든 서버에 이를 설치할 필요는 없습니다. 프록시 전달은 포트 80을 사용하지만 관리 인터페이스의 SSL 탭에서 https를 강제로 사용할 수 있습니다.

  3. https를 활성화한 후 nextcloud 서버에서 작은 문제(502 Bad Gateway)가 발생했습니다. nextcloud config.php 파일에 다음 줄을 추가해야 합니다.

'overwriteprotocol' => 'https',
  1. 모든 것이 언제나처럼 달콤합니다!

관련 정보