,

nginx를 사용했던 이유

저는 과거에 http/3와 성능 때문에 open litespeed와 litespeed를 사용했었습니다.
같은 성능의 하드웨어에서 가능한한 빠른 성능은 중요한 요소였죠.
특히나 Oracle Cloud의 E2는 1코어 1GB의 엄청난 저사양 인스턴스였기 때문에 더 중요했습니다.

하지만 oracle cloud A1 인스턴스가 출시 되어버리는 사건이 발생해버렸죠…
A1 인스턴스는 4코어 24기가바이트의 메모리를 할당 할 수 있게 되었죠.
이 정도 인스턴스에서는 웹서버에 의한 성능 차이가 크지 않았습니다.

오히려 캐시에 의한 성능 차이가 컸죠.
문제는 비용이었습니다.
open litespeed(무료)에서는 캐시기능을 사용할 수 없었으며,
litespeed(유료)에서는 램이 2기가바이트 미만에서만 무료로 사용 가능했습니다.
고작 개인 블로그 운영에 유료 웹서버는 사용하기 어려웠어요.

결국 제가 할 수 있는 결정은 셋 중 하나였습니다
캐시 기능을 활성화 한 4코어 24기가바이트 nginx
vs 캐시 활성화한 1코어 2기가바이트로 제한 litespeed
vs 캐시 기능을 제거한 4코어 24기가바이트 openlitespeed

당연히 nginx가 가장 빨랐죠.
지금까지는 비용 대비 최고 성능을 뽑을 수 있었기 때문에 nginx를 써왔습니다.

caddy 에 관심 갖기 시작한 이유: http3 서버, http2 클라이언트

nginx라는 것을 사용하던 중 nginx proxy manager(이하 npm)라는 것을 알게 되었고,
npm을 이용해서 포트를 외부에 노출하지 않고 여러가지 서비스를 하게 되었습니다.
그런데 nginx에는 가장 큰 문제가 있었어요.

litespeed에서 되던 http3? 이건 큰 문제가 아니었습니다.
바로.. nginx는 http2조차 안된다는 것이었죠.
npm은 http2 서버가 되지만, http 2클라이언트가 될수 없었습니다.

반면 caddy는 http2 클라이언트, http3 서버가 될수 있었습니다.

caddy 역프록시 설정하기

저는 독커로 실행했습니다.
저의 docker-compose.yml과 caddyfile 설정을 알려드리겠습니다.

docker-compose.yml

저는 cloudflare를 통해서 dns challenge를 할 예정입니다.

그래서 컨테이너가 시작될 때 cloudflare가 있는지 확인하고,
없으면 설치 후 실행하도록 하였습니다.

command 부분이 제가 설정한 부분입니다.

version: '3.7'

services:
  caddy:
    image: caddy:alpine
    container_name: caddy
    command: /bin/sh -c 'if ! caddy list-modules | grep -q
dns.providers.cloudflare; then caddy add-package github.com/caddy-dns/cloudflare;
fi; caddy run --config /caddyfile --adapter caddyfile'

    environment:
      - TZ=Asia/Seoul
      - UMASK=002
    volumes:
      - ./caddyfile:/caddyfile
      - ./service:/srv
      - ./data:/data
      - ./config:/config
    ports:
      - 443:443
      - 443:443/udp
    restart: always
    networks:
      default:

caddyfile

caddy file은 크게 두가지로 나눌 수 있습니다.
snippet이라는, 일종의 함수를 설정하는 단계와
도메인에 따라 처리되는 Directives를 부분입니다.

cloudflare ip가 아닌 패킷 차단 snippet

먼저 클라우드 플레어를 거쳐서 오지 않은 패킷을 차단하기 위해 ip matcher를 생성합니다.
@<matcher name> remote_ip forwarded <clientIP>
이와 같이 입력하면 forward 된 패킷이라 해도 접속한 클라이언트 ip를 이용해서 차단하게 됩니다.

그러나 저는 접속자의 ip가 아니라, 전달 해주는 프록시 서버가 클라우드 플레어인지 확인해야 합니다.
그래서 forwarded를 제외하고 matcher를 생성합니다.

# Caddyfile2
# https://caddyserver.com/docs/caddyfile/directives
# directives 이름 주의

(cf_ip) {
        @cf-ip-matcher remote_ip 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22
104.16.0.0/13 104.24.0.0/14 108.162.192.0/18 131.0.72.0/22 141.101.64.0/18
141.101.64.0/18 162.158.0.0/15 172.64.0.0/13 173.245.48.0/20 188.114.96.0/20
190.93.240.0/20 197.234.240.0/22 198.41.128.0/17 2400:cb00::/32 2606:4700::/32
2803:f800::/32 2405:b500::/32 2405:8100::/32 2a06:98c0::/29 2c0f:f248::/32
#       @ip-matcher not remote_ip forwarded 192.168.0.1

}

reverse proxy 프리셋

단순하게 입력하는 글자수를 줄이기 위한 snippet입니다.

역프록시는 3줄이 필요로 합니다.
matcher, handle, reverse_proxy 세가지가 필요하죠.
그래서 이 세가지를 한줄로 사용하기 위해 snippet을 만들어줍니다.

두개의 reverse proxy snippet을 만듭니다.
하나는 cloudflare를 통과한 패킷만 허용하는 역프록시와
cloudflare를 통과하지 않아도 허용하는 역프록시입니다.

reverse proxy – proxied

hostname이 같고, ip가 cloudflare 범위 안에 있는 경우 reverse_proxy를 수행,
그렇지 않으면 abort합니다.

# (rev-proxied) {
(rev-pro) {
    @{args.0}-host-matcher host {args.2} {args.3} {args.4} {args.5} {args.6}
    handle @{args.0}-host-matcher {
      handle @cf-ip-matcher {
        reverse_proxy {args.1}
      }

      handle {
        abort
      }
    }

    handle {
        abort
    }
}

reverse proxy – 일반

cloudflare 처럼 proxy 기능을 제공하지 않는 dns는 이 방법을 따르면 됩니다.
hostname이 일치하는 경우 reverse_proxy, 아니면 abort합니다.

(rev-dns) {
    @{args.0}-host-matcher host {args.2} {args.3} {args.4} {args.5} {args.6}
    handle @{args.0}-host-matcher {
      reverse_proxy {args.1}
    }

    handle {
        abort
    }
}

도메인에 대한 Directives를 생성

앞서 생성한 snippet을 활용하여 인증서 발급/ 역프록시를 수행합니다.

domain.com *.domain.com {
# 먼저 클라우드 플레어 ip matcher를 가져옵니다.
    import cf_ip
# wildcard 도메인에 대해서 cloudflare 인증서를 받아옵니다.
    tls {
    dns cloudflare tokken
    }

# 설정되지 않은 도메인은 abort합니다.
    # Fallback for otherwise unhandled domains
    handle {
        abort
    }

# cola16.app에 대하여 nginx 컨테이너로 reverse proxy합니다.
# 이때 cloudflare에서 넘어온 패킷이 아니면 차단합니다.
# 또한 http/2를 이용하도록 합니다.
    import rev-pro wordpress     h2c://nginx cola16.app

# dns는 속도가 생명! cloudflare에서 dns 모드로 설정해두었습니다.
# 따라서 ip 차단은 해두지 않았습니다.
# https는 http/2가 기본 값입니다.
    import rev-dns adguard        https://adg adg.cola16.app
se2cock.cola16.dev
}

caddy – docker compose up -d

이제 caddy 컨테이너를 실행하기만 하면 끝이 납니다!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다


Ads Blocker Image Powered by Code Help Pro

광고 차단 감지됨!

닫기를 누르면 이용하실 수 있지만, 광고 차단은 해제해주시면 좋겠습니다.
Powered By
100% Free SEO Tools - Tool Kits PRO