와일드카드 N 수준 하위 도메인을 캡처하기 위해 nginx 서버 블록을 작성하시나요?

와일드카드 N 수준 하위 도메인을 캡처하기 위해 nginx 서버 블록을 작성하시나요?

저는 다중 테넌트 SAAS 플랫폼 내에서 OpenResty/Lua 및 LetsEncrypt를 사용하여 SSL 인증서를 자동 생성하기 위해 Nginx 프록시 서버를 실행하고 있습니다. 인증서가 필요한 도메인이 많지만 이를 화이트리스트에 추가할 수 없기 때문에 인증서 서버가 해당 도메인을 가리키는 모든 요청을 수락합니다.

다음 도메인 구조와 일치하는 잘못된 도메인 요청이 많이 들어오기 시작했습니다.

www.randomsubdomain.anydomain.com

해당 도메인 이름 구조는 내 서비스에 유효하지 않으므로 nginx 구성에서 이 구조를 포착하고 444 응답을 반환하는 서버 블록을 생성하여 LE에서 인증서가 전혀 요청되지 않도록 하려고 합니다.

제가 테스트한 내용은 다음과 같습니다.

server {
  listen 80;
  server_name ~^www\.(.+)\.(.+)\.com$;
  return 444;
}

불행하게도 구성을 다시 로드하면 이 블록이 테스트 도메인을 포착하지 못하는 것 같습니다. 내 테스트 도메인(www.randomsubdomain.anydomain.com)이 통과하고 인증서가 발급되는데, 이는 내가 원하는 것이 아닙니다. 내 정규식인가요? 저는 PCRE/nginx 정규식 전문가와는 거리가 멀기 때문에 사용 가능한 온라인 테스터 중 하나를 사용하여 정규식을 구성했습니다.

그러나 server_name을 실제 도메인 이름인 "www.test.customdomain.com"으로 변경하면 서버 블록이 이를 포착하여 원하는 444 응답을 반환합니다.

LetsEncrypt 인증서를 발급받기 위해 내 앱에 대해 꽤 많은 server_blocks가 구성되어 있으므로 내 정규 표현식이 아닌 경우 위 블록이 상단 근처에 있더라도 다른 정규 표현식 중 하나가 우선 적용되는 것 같습니다.

참조용 전체 블록은 다음과 같습니다. 여기서 app-server.com은 내 서비스의 도메인 이름입니다. 어떤 팁/지침이라도 미리 감사드립니다.

user ec2-user www;
events {
  worker_connections 1024;
}

http {
  lua_shared_dict auto_ssl 100m; #need 1MB per 100 domains in memory
  lua_shared_dict auto_ssl_settings 64k;
  resolver 8.8.8.8 ipv6=off;

  init_by_lua_block {
    auto_ssl = (require "resty.auto-ssl").new()
    auto_ssl:set("allow_domain", function(domain)
      return true
    end)

    auto_ssl:init()
  }

  init_worker_by_lua_block {
    auto_ssl:init_worker()
  }

  # Handles SSL app-server.com subdomain requests so they aren't redirected
  server {
    listen 443 ssl;
    server_name *.app-server.com;

    location / {
      proxy_pass http://ssl-sites.app-server.com;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto https;
      proxy_set_header X-Forwarded-Ssl on;
    }
    ssl_certificate_by_lua_block {
      auto_ssl:ssl_certificate()
    }
    ssl_certificate /etc/ssl/resty-auto-ssl-fallback.crt;
    ssl_certificate_key /etc/ssl/resty-auto-ssl-fallback.key;

  }

  # Capture SSL requests that already have www and redirect to https://www
  server {
    listen 443 ssl;
    server_name www.*;

    location / {
      proxy_pass http://ssl-sites.app-server.com;
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto https;
      proxy_set_header X-Forwarded-Ssl on;
    }
    ssl_certificate_by_lua_block {
      auto_ssl:ssl_certificate()
    }
    ssl_certificate /etc/ssl/resty-auto-ssl-fallback.crt;
    ssl_certificate_key /etc/ssl/resty-auto-ssl-fallback.key;
  }

  # Capture SSL requests without www and redirect to https://www on subsequent requests once the cert is issued
  server {
    listen 443 ssl default_server;
    ssl_certificate_by_lua_block {
      auto_ssl:ssl_certificate()
    }
    ssl_certificate /etc/ssl/resty-auto-ssl-fallback.crt;
    ssl_certificate_key /etc/ssl/resty-auto-ssl-fallback.key;

    return 301 https://www.$host$request_uri;
  }

  # Capture invalid subdomains
  server {
    listen 80;
    server_name ~^www\.(.+)\.(.+)\.com$;
    return 444;
  }

  # Capture requests that already have www and redirect to https://www
  server {
    listen 80;
    server_name www.*;
    location / {
      return 301 https://$host$request_uri;
    }

    # send to challenge if looking for it
    location /.well-known/acme-challenge/ {
      content_by_lua_block {
        auto_ssl:challenge_server()
      }
    }
  }

# Captures the app-server.com subdomain requests and redirects them
  server {
    listen 80 ;
    server_name *.app-server.com;

    location / {
      return 301 https://$host$request_uri;
    }
    # send to challenge if looking for it
    location /.well-known/acme-challenge/ {
      content_by_lua_block {
        auto_ssl:challenge_server()
      }
    }
  }

  # Capture requests without www and redirect to https://www
  server {
    listen 80 default_server;
    location / {
      return 301 https://www.$host$request_uri;
    }

    # Endpoint used for Let's Encrypt domain validation
    location /.well-known/acme-challenge/ {
      content_by_lua_block {
        auto_ssl:challenge_server()
      }
    }
  }

  server {
    listen 127.0.0.1:8999;
    client_body_buffer_size 128k;
    client_max_body_size 128k;

    location / {
      content_by_lua_block {
        auto_ssl:hook_server()
      }
    }
  }
}

관련 정보