웹사이트 검색

Ubuntu 22.04에서 Caddy로 웹사이트를 호스팅하는 방법


저자는 Write for DOnations 프로그램을 선택했습니다.

소개

HTTPS를 활성화하고 HTTP/2에 대한 지원을 포함하도록 암호화합시다. HTTPS는 사용자와 서버 간의 트래픽을 보호하기 위한 시스템이며 프로덕션 환경에서 실행되는 모든 웹사이트의 기본 기대치가 빠르게 되고 있습니다. HTTPS가 없으면 Chrome과 Firefox는 사용자가 제출하려고 하면 웹사이트가 \안전하지 않음\이라고 경고합니다. 로그인 정보.

이 자습서에서는 사용자 지정 Caddy 빌더 도구인 xcaddy를 사용하여 소스에서 Caddy를 빌드하고 이를 사용하여 HTTPS로 보호되는 웹 사이트를 호스팅합니다. 여기에는 컴파일, Caddyfile을 사용하여 구성 및 플러그인 설치가 수반됩니다. 결국 귀하의 도메인은 Let’s Encrypt의 무료 TLS 인증서로 보안을 유지하면서 정적 페이지를 제공하게 됩니다.

전제 조건

  • 루트 권한이 있고 최소 2GB RAM과 루트가 아닌 보조 계정이 있는 Ubuntu 22.04 서버. Ubuntu 22.04용 초기 서버 설정 가이드에 따라 이를 설정할 수 있습니다. 이 자습서에서 루트가 아닌 사용자는 sammy입니다.
  • 최신 Go 버전을 설정하기 위해 Ubuntu 20.04에 Go를 설치하는 방법(Caddy에는 Go 버전 17 이상이 필요함).
  • 완전히 등록된 도메인 이름. 이 자습서에서는 전체적으로 your_domain을 사용합니다. Freenom에서 도메인 이름을 구입하거나 선택한 도메인 등록 기관을 사용할 수 있습니다.
  • 서버의 공개 IP 주소를 가리키는 your_domain이 있는 A DNS 레코드와 www.your_domain이 있는 CNAME DNS 레코드@를 가리킵니다. 추가 방법에 대한 자세한 내용은 이 DigitalOcean DNS 소개를 참조하세요.
  • DigitalOcean 계정에 대한 읽기 및 쓰기 권한이 있는 개인 액세스 토큰(API 키). 개인 액세스 토큰을 생성하는 방법을 방문하여 생성하십시오.

1단계 - 캐디 만들기

이 단계에서는 Caddy의 소스 코드를 변경하지 않고 나중에 플러그인을 추가할 수 있는 기능을 사용하여 소스에서 Caddy를 빌드합니다. xcaddy를 사용하여 필요에 따라 Caddy와 해당 플러그인을 다운로드하고 빌드합니다.

xcaddy 릴리스 페이지를 방문하여 linux_amd64 플랫폼용 최신 릴리스 링크를 복사하십시오. 다운로드하기 전에 다음 명령을 실행하여 /tmp로 이동합니다.

  1. cd /tmp

그런 다음 wget을 사용하여 최신 릴리스를 다운로드합니다.

  1. wget https://github.com/caddyserver/xcaddy/releases/download/v0.3.1/xcaddy_0.3.1_linux_amd64.tar.gz

다운로드가 완료되면 바이너리만 추출합니다.

  1. tar xvf xcaddy_0.3.1_linux_amd64.tar.gz xcaddy

마지막으로 xcaddy 실행 파일을 /usr/bin으로 이동하여 시스템 전체에서 액세스할 수 있도록 합니다.

  1. sudo mv xcaddy /usr/bin

이제 xcaddy가 설치되었으므로 Caddy를 빌드합니다. 이를 위해 별도의 디렉토리를 만들어 저장합니다.

  1. mkdir ~/caddy

다음 명령을 실행하여 탐색합니다.

  1. cd ~/caddy

타사 플러그인 없이 최신 버전의 Caddy를 빌드하려면 다음 명령을 실행하십시오.

  1. xcaddy build

이 명령은 완료하는 데 약간의 시간이 걸리지만 다음과 유사한 출력이 인쇄됩니다.

Output
2022/08/10 15:55:18 [INFO] Temporary folder: /tmp/buildenv_2022-08-10-1555.834895411 2022/08/10 15:55:18 [INFO] Writing main module: /tmp/buildenv_2022-08-10-1555.834895411/main.go package main import ( caddycmd "github.com/caddyserver/caddy/v2/cmd" // plug in Caddy modules here _ "github.com/caddyserver/caddy/v2/modules/standard" ) func main() { caddycmd.Main() } 2022/08/10 15:55:18 [INFO] Initializing Go module 2022/08/10 15:55:18 [INFO] exec (timeout=10s): /usr/local/go/bin/go mod init caddy go: creating new go.mod: module caddy go: to add module requirements and sums: go mod tidy 2022/08/10 15:55:18 [INFO] Pinning versions 2022/08/10 15:55:18 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddyserver/caddy/v2 go: downloading github.com/caddyserver/caddy v1.0.5 ... 2022/08/10 15:55:49 [INFO] Build environment ready 2022/08/10 15:55:49 [INFO] Building Caddy 2022/08/10 15:55:49 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy ... 2022/08/10 15:55:57 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath 2022/08/10 15:58:48 [INFO] Build complete: ./caddy 2022/08/10 15:58:48 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-08-10-1555.834895411

완료되면 현재 폴더에서 caddy 실행 파일을 사용할 수 있습니다. /usr/bin으로 이동하여 설치하십시오.

  1. sudo mv caddy /usr/bin

caddy를 실행하여 올바르게 설치되었는지 확인할 수 있습니다.

  1. caddy version

출력에는 방금 컴파일한 캐디 버전이 포함됩니다.

Output
v2.6.1 h1:EDqo59TyYWhXQnfde93Mmv4FJfYe00dO60zMiEt+pzo=

이제 캐디를 빌드하고 실행했습니다. 다음 단계에서는 Caddy를 서비스로 설치하여 부팅 시 자동으로 시작되도록 한 다음 소유권 및 권한 설정을 조정하여 서버의 보안을 보장합니다.

2단계 - 캐디 설치

이제 Caddy를 빌드하고 실행할 수 있음을 확인했으므로 시스템 시작 시 Caddy가 자동으로 시작되도록 systemd 서비스를 구성할 수 있습니다. systemd에 대해 자세히 알아보려면 Systemd Essentials 튜토리얼을 방문하세요.

캐디는 systemd 서비스로 실행하기 위해 자체 사용자 및 그룹이 필요합니다. 다음 명령을 사용하여 그룹을 만듭니다.

  1. sudo groupadd --system caddy

그런 다음 caddy 그룹에 속하는 caddy라는 새 사용자를 만듭니다.

  1. sudo useradd --system \
  2. --gid caddy \
  3. --create-home \
  4. --home-dir /var/lib/caddy \
  5. --shell /usr/sbin/nologin \
  6. --comment "Caddy web server" \
  7. caddy

caddy 사용자는 자체 홈 디렉토리를 생성합니다. 셸이 nologin으로 설정되어 있으므로 caddy로 로그인할 수 없습니다.

Caddy 바이너리의 소유권을 root 사용자로 변경합니다.

  1. sudo chown root:root /usr/bin/caddy

이 변경은 다른 계정이 실행 파일을 수정하는 것을 방지합니다. 그러나 루트 사용자가 캐디를 소유하는 동안 systemd 서비스. 루트가 아닌 계정에서 명령을 실행하면 캐디(또는 다른 프로그램)가 손상된 경우 공격자가 바이너리를 수정하거나 루트로 명령을 실행할 수 없습니다.

다음으로 바이너리 파일의 권한을 755로 설정하면 루트에 파일에 대한 전체 읽기/쓰기/실행 권한이 부여되고 다른 사용자는 읽기 및 실행만 가능합니다. 그것:

  1. sudo chmod 755 /usr/bin/caddy

이제 Caddy 바이너리 설정을 완료했으며 Caddy 구성을 시작할 준비가 되었습니다.

Caddy의 구성 파일을 저장할 디렉토리를 만듭니다.

  1. sudo mkdir /etc/caddy

그런 다음 사용자 및 그룹 권한을 설정합니다.

  1. sudo chown -R root:caddy /etc/caddy

사용자를 root로 설정하고 그룹을 caddy로 설정하면 Caddy가 caddy 그룹을 통해 폴더에 대한 읽기 및 쓰기 권한을 갖게 됩니다. 수퍼유저 계정만이 읽고 수정할 수 있는 동일한 권한을 갖습니다.

이후 단계에서 Let’s Encrypt에서 자동 TLS 인증서 프로비저닝을 활성화합니다. 이에 대비하여 Caddy가 얻을 TLS 인증서를 저장할 디렉터리를 만들고 /etc/caddy 디렉터리와 동일한 소유권 규칙을 부여합니다.

  1. sudo mkdir /etc/ssl/caddy
  2. sudo chown -R root:caddy /etc/ssl/caddy

캐디는 요청을 암호화하기 위해 이 디렉토리에 인증서를 쓰고 읽을 수 있어야 합니다. 이러한 이유로 rootcaddy에서만 액세스할 수 있도록 /etc/ssl/caddy 디렉토리에 대한 권한을 수정합니다.

  1. sudo chmod 0770 /etc/ssl/caddy

다음으로 Caddy가 호스팅할 파일을 저장할 디렉토리를 만듭니다.

  1. sudo mkdir /var/www

그런 다음 디렉토리의 소유자와 그룹을 caddy로 설정합니다.

  1. sudo chown caddy:caddy /var/www

Caddy 서비스를 설치하려면 다음을 실행하여 Caddy GitHub 리포지토리에서 /etc/systemd/system으로 systemd 단위 파일을 다운로드합니다.

  1. sudo sh -c 'curl https://raw.githubusercontent.com/caddyserver/dist/master/init/caddy.service > /etc/systemd/system/caddy.service'

다음과 같은 응답을 받게 됩니다.

Output
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1030 100 1030 0 0 4698 0 --:--:-- --:--:-- --:--:-- 4703 ``` Modify the service file's permissions so it can only be modified by its owner, `root`: ```command sudo chmod 644 /etc/systemd/system/caddy.service

그런 다음 systemd를 다시 로드하여 Caddy 서비스를 감지합니다.

  1. sudo systemctl daemon-reload

systemdsystemctl status를 실행하여 캐디 서비스를 감지했는지 확인하십시오.

  1. sudo systemctl status caddy

다음과 유사한 출력이 표시됩니다.

Output
● caddy.service - Caddy Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: https://caddyserver.com/docs/

출력이 같으면 systemd에서 새 서비스를 감지한 것입니다.

초기 서버 설정의 일부로 ufw를 활성화하고 SSH 연결을 허용했습니다. Caddy가 서버에서 HTTP 및 HTTPS 트래픽을 제공하려면 다음 명령을 실행하여 ufw에서 허용해야 합니다.

  1. sudo ufw allow proto tcp from any to any port 80,443

출력은 다음과 같습니다.

Output
Rule added Rule added (v6)

ufw status를 사용하여 변경 사항을 확인합니다.

  1. sudo ufw status

다음과 같은 결과가 표시됩니다.

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80,443/tcp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80,443/tcp (v6) ALLOW Anywhere (v6)

Caddy 설치가 완료되었지만 아무 것도 제공하도록 구성되지 않았습니다. 다음 단계에서는 /var/www 디렉토리에서 파일을 제공하도록 Caddy를 구성합니다.

3단계 - 캐디 구성

이 섹션에서는 서버에서 정적 파일을 제공하기 위한 기본 캐디 구성을 작성합니다.

/var/wwwindex.html이라는 기본 HTML 파일을 만듭니다.

  1. sudo nano /var/www/index.html

다음 줄을 추가합니다.

<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1 style="font-family: sans-serif">This page is being served via Caddy</h1>
</body>
</html>

웹 브라우저에 표시될 때 이 파일은 이 페이지는 캐디를 통해 제공되고 있습니다.라는 제목의 제목을 표시합니다. 파일을 저장하고 닫습니다.

캐디는 /etc/caddy에 저장된 Caddyfile이라는 파일에서 구성을 읽습니다. 편집할 파일을 만들고 엽니다.

  1. sudo nano /etc/caddy/Caddyfile

다음 줄을 추가합니다.

  1. http:// {
  2. root * /var/www
  3. encode gzip
  4. file_server
  5. }

이 기본 캐디 구성은 서버에 대한 모든 HTTP 트래픽이 /var/www(root로 표시됨)의 파일(file_server)과 함께 제공되어야 함을 선언합니다.) 및 gzip을 사용하여 압축하여 클라이언트 측에서 페이지 로딩 시간을 줄입니다.

캐디는 많은 사용 사례에 대해 다른 지침을 가지고 있습니다. 예를 들어 지시어에 대한 공식 문서 페이지입니다.

완료되면 파일을 저장하고 닫습니다.

모든 것이 올바르게 작동하는지 테스트하려면 캐디 서비스를 시작하십시오.

  1. sudo systemctl start caddy

다음으로 systemctl status를 실행하여 캐디 서비스의 상태에 대한 정보를 찾습니다.

  1. sudo systemctl status caddy

다음을 받게 됩니다.

Output
● caddy.service - Caddy Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2022-08-10 15:02:41 UTC; 2s ago Docs: https://caddyserver.com/docs/ Main PID: 5443 (caddy) Tasks: 7 (limit: 1119) Memory: 7.5M CPU: 30ms CGroup: /system.slice/caddy.service └─5443 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

이제 웹 브라우저에서 서버의 IP를 방문할 수 있습니다. 샘플 웹 페이지에 다음이 표시됩니다.

이제 서버에서 정적 파일을 제공하도록 캐디를 구성했습니다. 다음 단계에서는 플러그인을 통해 Caddy의 기능을 확장합니다.

4단계 - Let's Encrypt로 자동 TLS 활성화

플러그인은 캐디의 동작을 변경하고 확장할 수 있습니다. 일반적으로 사용 사례에 따라 더 많은 구성 지시문을 제공합니다. 이 단계에서는 확인을 위해 TXT DNS 레코드를 사용하여 자동 Let's Encrypt 인증서 프로비저닝 및 갱신을 활성화합니다. TXT DNS 레코드를 사용하여 확인하려면 DigitalOcean DNS API와 인터페이스하는 공식 플러그인을 설치합니다.

플러그인을 추가하려면 xcaddy를 사용하여 캐디를 다시 컴파일하고 사용할 수 있는 플러그인의 리포지토리를 지정해야 합니다. 다음 명령을 실행하여 DigitalOcean DNS를 지원하는 Caddy를 컴파일합니다.

  1. xcaddy build --with github.com/caddy-dns/digitalocean@master

출력은 다음과 유사합니다.

Output
... 2022/08/10 15:03:24 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v github.com/caddy-dns/digitalocean@master github.com/caddyserver/caddy/v2 go: downloading github.com/caddy-dns/digitalocean v0.0.0-20220527005842-9c71e343246b go: downloading github.com/libdns/digitalocean v0.0.0-20220518195853-a541bc8aa80f go: downloading github.com/digitalocean/godo v1.41.0 go: downloading github.com/google/go-querystring v1.0.0 go: downloading golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c go: downloading google.golang.org/appengine v1.6.6 go: added github.com/caddy-dns/digitalocean v0.0.0-20220527005842-9c71e343246b go: added github.com/digitalocean/godo v1.41.0 go: added github.com/libdns/digitalocean v0.0.0-20220518195853-a541bc8aa80f 2022/08/10 15:03:33 [INFO] exec (timeout=0s): /usr/local/go/bin/go get -d -v go: downloading github.com/antlr/antlr4 v0.0.0-20200503195918-621b933c7a7f go: downloading github.com/Masterminds/semver v1.4.2 go: downloading github.com/cenkalti/backoff v2.2.1+incompatible go: downloading github.com/cpuguy83/go-md2man v1.0.10 go: downloading github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220804214150-8b0cc382067f go: downloading github.com/antlr/antlr4 v4.10.1+incompatible go: upgraded github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed => v0.0.0-20220804214150-8b0cc382067f go: upgraded golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c => v0.0.0-20211104180415-d3ed0bb246c8 go: upgraded google.golang.org/appengine v1.6.6 => v1.6.7 2022/08/10 15:03:39 [INFO] Build environment ready 2022/08/10 15:03:39 [INFO] Building Caddy 2022/08/10 15:03:39 [INFO] exec (timeout=0s): /usr/local/go/bin/go mod tidy 2022/08/10 15:03:40 [INFO] exec (timeout=0s): /usr/local/go/bin/go build -o /home/sammy/caddy/caddy -ldflags -w -s -trimpath 2022/08/10 15:03:56 [INFO] Build complete: ./caddy 2022/08/10 15:03:56 [INFO] Cleaning up temporary folder: /tmp/buildenv_2022-08-10-1503.1377463227

컴파일이 완료되면 다음을 실행하여 결과 바이너리를 /usr/bin로 이동합니다.

  1. sudo mv caddy /usr/bin

그런 다음 적절한 권한을 설정합니다.

  1. sudo chown root:root /usr/bin/caddy
  2. sudo chmod 755 /usr/bin/caddy

다음으로 DigitalOcean의 API와 함께 작동하도록 Caddy를 구성하여 DNS 레코드를 설정합니다. Caddy는 DigitalOcean의 DNS를 구성하기 위해 API 토큰을 환경 변수로 읽어야 하므로 systemd 단위 파일을 편집해야 합니다. 편집할 파일을 엽니다.

  1. sudo nano /etc/systemd/system/caddy.service

[Service] 섹션에 강조 표시된 줄을 추가하고 your_token_here를 API 토큰으로 바꿉니다.

...
[Service]
Type=notify
User=caddy
Group=caddy
Environment=DO_AUTH_TOKEN=your_token_here
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
...

이 파일을 저장하고 닫은 다음 systemd 데몬을 다시 로드하여 구성이 업데이트되었는지 확인합니다.

  1. sudo systemctl daemon-reload

systemctl restart를 실행하여 구성 변경 사항을 확인하십시오.

  1. sudo systemctl restart caddy

그런 다음 systemctl status를 실행하여 제대로 실행되었는지 확인합니다.

  1. sudo systemctl status caddy

다음 출력을 받게 됩니다.

Output
● caddy.service - Caddy Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2022-08-10 15:06:01 UTC; 2s ago Docs: https://caddyserver.com/docs/ Main PID: 5620 (caddy) Tasks: 7 (limit: 1119) Memory: 7.5M CPU: 37ms CGroup: /system.slice/caddy.service └─5620 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

다음으로 Caddyfile을 약간 변경해야 하므로 편집을 위해 엽니다.

  1. sudo nano /etc/caddy/Caddyfile

강조 표시된 줄을 Caddyfile에 추가하고 your_domain을 도메인(http:// 대신)으로 바꿉니다. DigitalOcean DNS가 지정된 tls 블록 추가:

your_domain {
    root * /var/www
    encode gzip
    file_server
    
    tls {
        dns digitalocean {env.DO_AUTH_TOKEN}
    }
}

호스트 이름에 대한 프로토콜 지정자가 아닌 도메인을 사용하면 Caddy가 HTTPS를 통해 요청을 처리하게 됩니다. tls 지시문은 TLS를 사용할 때 Caddy의 동작을 구성하고 DNS 레코드를 설정하고 인증서를 요청하기 위해 digitalocean 플러그인을 사용하도록 명령합니다. dns 하위 지시문은 Caddy가 HTTP 대신 DigitalOcean DNS 시스템을 사용해야 함을 지정합니다.

파일을 저장하고 닫습니다.

이것으로 웹 사이트를 배포할 준비가 되었습니다. systemctl로 캐디를 다시 시작한 다음 활성화하여 부팅 시 실행되도록 합니다.

  1. sudo systemctl restart caddy
  2. sudo systemctl enable caddy

도메인을 방문하면 동일한 이 페이지는 Caddy 메시지를 통해 자동으로 HTTPS로 리디렉션됩니다.

이제 Caddy 설치가 완료되고 보안이 유지되었으며 사용 사례에 따라 추가로 사용자 지정할 수 있습니다.

결론

이제 Caddy가 서버에 설치 및 구성되어 원하는 도메인에서 정적 페이지를 제공하고 무료 Let's Encrypt TLS 인증서로 보호됩니다.

좋은 다음 단계는 캐디의 새 버전이 출시될 때 알림을 설정하는 것입니다. 예를 들어 Caddy 구성에 대한 자세한 내용은 Caddy 설명서를 사용할 수 있습니다.

Go에서 코딩하는 방법 시리즈에서 Go 언어 사용에 대해 자세히 알아볼 수도 있습니다.