웹사이트 검색

Rocky/AlmaLinux 9|8에 Caddy 웹 서버 설치


Caddy는 웹사이트, 애플리케이션 및 서비스를 제공하는 데 사용되는 강력하고 사용자 친화적이며 오픈 소스 웹 플랫폼입니다. Caddy는 Go 프로그래밍 언어로 작성되어 오픈 소스 시장에서 가장 빠른 웹 서버 중 하나입니다. 보안, 성능 및 사용 용이성에 중점을 두며, 단순한 정적 사이트와 같은 간단한 프로젝트나 더 복잡한 웹 애플리케이션을 호스팅하는 데 사용할 수 있습니다.

Caddy 웹 서버를 사용하는 이유

  • 자동 HTTPS: Caddy는 웹사이트를 위한 SSL/TLS 인증서의 자동 생성 및 갱신을 수행합니다.
  • 그 단순함: Caddy는 단순하게 만드는 원칙을 중심으로 설계되었습니다. Caddyfile이라는 하나의 간단하고 사람이 읽기 쉬운 설정 파일을 사용합니다.
  • 슈퍼 성능: 캐디는 빠르고 효율적이면서도 최소한의 하드웨어 자원을 사용하도록 설계되었습니다
  • 모듈형 아키텍처: 플러그인과 확장 기능을 사용하여 Caddy 웹 서버의 기능을 확장할 수 있습니다
  • 다중 플랫폼 지원: 캐디(Caddy)는 리눅스, 윈도우, macOS 또는 Docker/Podman과 같은 내부 컨테이너에서 실행될 수 있습니다
  • 큰 커뮤니티: 캐디(Caddy)는 활발하고 지원적인 커뮤니티를 갖고 있어, 시작할 때 도움을 받을 수 있습니다.

다음 섹션에서는 Rocky Linux/AlmaLinux 또는 CentOS Stream Linux 시스템에서 Caddy 웹 서버를 설치, 구성 및 사용하는 방법을 살펴보겠습니다. 이 튜토리얼을 실용적이고 동적으로 만들기 위해 MariaDB 데이터베이스와 함께 WordPress 웹사이트를 호스팅할 것입니다. 이 튜토리얼에서는 도메인 blog.cloudlabske.com.을 사용합니다.

Caddy 웹 서버 설치

Rocky/AlmaLinux/CentOS Steam Linux 머신에 Caddy 웹 서버를 설치하려면 시스템에 copr를 설치해야 합니다:

sudo dnf -y install 'dnf-command(copr)'

copr를 사용하여 캐디 저장소 활성화:

sudo dnf copr enable @caddy/caddy

프롬프트가 나타나면 키보드에서 y 키를 누르세요:

Enabling a Copr repository. Please note that this repository is not part
of the main distribution, and quality may vary.

The Fedora Project does not exercise any power over the contents of
this repository beyond the rules outlined in the Copr FAQ at
<https://docs.pagure.org/copr.copr/user_documentation.html#what-i-can-build-in-copr>,
and packages are not held to any quality or security level.

Please do not file bug reports about these packages in Fedora
Bugzilla. In case of problems, contact the owner of this repository.

Do you really want to enable copr.fedorainfracloud.org/@caddy/caddy? [y/N]: y
Repository successfully enabled.

저장소가 활성화되면 시스템에 Caddy 웹 서버를 설치하세요:

sudo dnf -y install caddy

rpm이나 dnf를 사용하여 추가 세부 정보 패키지를 얻을 수 있습니다

sudo dnf info caddy
# OR
rpm -qi caddy

기본 Caddy 서버 구성 파일은 /etc/caddy/Caddyfile에 위치해 있습니다. 내용을 확인할 수 있습니다:

cat /etc/caddy/Caddyfile

서비스를 시작하려면 systemctl 명령어를 사용하세요:

sudo systemctl start caddy

시스템 부팅 시 서비스가 시작되도록 설정합니다.

sudo systemctl enable caddy

서비스 상태 확인 중:

$ systemctl status caddy
● caddy.service - Caddy
   Loaded: loaded (/usr/lib/systemd/system/caddy.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2024-08-02 17:43:26 UTC; 39s ago
     Docs: https://caddyserver.com/docs/
 Main PID: 42001 (caddy)
    Tasks: 7 (limit: 48750)
   Memory: 20.0M
   CGroup: /system.slice/caddy.service
           └─42001 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

Aug 02 17:43:26 rocky8.computingforgeeks.com caddy[42001]: {"level":"info","ts":1722620606.719293,"msg":"adapted config to JSON","adapter":"caddyfile"}
Aug 02 17:43:26 rocky8.computingforgeeks.com caddy[42001]: {"level":"info","ts":1722620606.7204406,"logger":"admin","msg":"admin endpoint started","address":"localhost:2019","enforce_origin":false,"origins":["//localhost:2019",">
Aug 02 17:43:26 rocky8.computingforgeeks.com caddy[42001]: {"level":"warn","ts":1722620606.7205217,"logger":"http.auto_https","msg":"server is listening only on the HTTP port, so no automatic HTTPS will be applied to this server>
Aug 02 17:43:26 rocky8.computingforgeeks.com caddy[42001]: {"level":"info","ts":1722620606.7206764,"logger":"http.log","msg":"server running","name":"srv0","protocols":["h1","h2","h3"]}
Aug 02 17:43:26 rocky8.computingforgeeks.com caddy[42001]: {"level":"info","ts":1722620606.7208471,"msg":"autosaved config (load with --resume flag)","file":"/var/lib/caddy/.config/caddy/autosave.json"}
Aug 02 17:43:26 rocky8.computingforgeeks.com caddy[42001]: {"level":"info","ts":1722620606.7209103,"msg":"serving initial configuration"}
Aug 02 17:43:26 rocky8.computingforgeeks.com caddy[42001]: {"level":"info","ts":1722620606.7212656,"logger":"tls.cache.maintenance","msg":"started background certificate maintenance","cache":"0xc000488e00"}
Aug 02 17:43:26 rocky8.computingforgeeks.com systemd[1]: Started Caddy.
Aug 02 17:43:26 rocky8.computingforgeeks.com caddy[42001]: {"level":"info","ts":1722620606.7246072,"logger":"tls","msg":"cleaning storage unit","storage":"FileStorage:/var/lib/caddy/.local/share/caddy"}
Aug 02 17:43:26 rocky8.computingforgeeks.com caddy[42001]: {"level":"info","ts":1722620606.7248337,"logger":"tls","msg":"finished cleaning storage units"}

Caddy 웹 서버를 사용하여 워드프레스 호스팅하기

시스템에 PHP를 설치해 봅시다.

sudo dnf -y install @php

또한 다른 필요한 PHP 확장도 설치하세요.

sudo dnf install php-{cli,fpm,mysqlnd,zip,gd,mbstring,curl,xml,pear,bcmath,json}

FPM 소켓의 소유자를 caddy 사용자로 설정합니다.

$ sudo vim /etc/php-fpm.d/www.conf
user = caddy
group = caddy
listen = /run/php-fpm/www.sock
listen.owner = caddy
listen.group = caddy
listen.mode = 0660
listen.acl_users = apache,nginx,caddy

PHP FPM 서비스를 시작하고 활성화합니다.

sudo systemctl enable --now php-fpm

MariaDB 데이터베이스 서버를 설치합니다.

sudo dnf -y install @mariadb
sudo systemctl enable --now mariadb
sudo mysql -u root

워드프레스 웹사이트용 데이터베이스 생성:

CREATE DATABASE wp_db;
GRANT ALL PRIVILEGES ON wp_db.* to 'wp_user'@'localhost' IDENTIFIED BY 'DBStr%ngPassw0rd';
FLUSH PRIVILEGES;
EXIT

워드프레스를 다운로드하고, 압축을 풀고, wordpress 폴더를 /var/www로 이동하세요

wget wordpress.org/latest.tar.gz
tar xvf latest.tar.gz
sudo mv wordpress /var/www
sudo cp  /var/www/wordpress/wp-config-sample.php  /var/www/wordpress/wp-config.php 

워드프레스 데이터베이스 연결 설정

$ sudo vim /var/www/wordpress/wp-config.php
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wp_db' );

/** Database username */
define( 'DB_USER', 'wp_user' );

/** Database password */
define( 'DB_PASSWORD', 'DBStr%ngPassw0rd' );

/** Database hostname */
define( 'DB_HOST', 'localhost' );

디렉터리의 권한을 caddy 사용자로 설정:

sudo chown -R caddy:caddy /var/www/wordpress/

워드프레스를 위한 캐디 설정

Caddy 구성 파일을 편집을 위해 열기

sudo vim /etc/caddy/Caddyfile

아래 설정을 환경에 맞게 수정하세요. 도메인 blog.cloudlabske.com과 관리자 사용자 이름을 변경하세요

blog.cloudlabske.com {
	tls [email 
	log {
		output file /var/log/caddy/wordpress.log
		format console
	}

	root * /var/www/wordpress
	encode gzip
	file_server
	php_fastcgi unix//run/php-fpm/www.sock

	@disallowed {
		path /xmlrpc.php
		path *.sql
		path /wp-content/uploads/*.php
	}

	rewrite @disallowed '/index.php'
}

로그 디렉터리를 생성합니다.

sudo mkdir /var/log/caddy/
sudo chown -R caddy:caddy  /var/log/caddy/

구성 구문이 유효한지 확인하세요:

$ sudo caddy validate --config /etc/caddy/Caddyfile
2024/08/03 07:25:16.349	INFO	using config from file	{"file": "/etc/caddy/Caddyfile"}
2024/08/03 07:25:16.351	INFO	adapted config to JSON	{"adapter": "caddyfile"}
2024/08/03 07:25:16.351	INFO	http.auto_https	server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS	{"server_name": "srv0", "https_port": 443}
2024/08/03 07:25:16.351	INFO	http.auto_https	enabling automatic HTTP->HTTPS redirects	{"server_name": "srv0"}
2024/08/03 07:25:16.351	WARN	http.auto_https	server is listening only on the HTTP port, so no automatic HTTPS will be applied to this server	{"server_name": "srv1", "http_port": 80}
2024/08/03 07:25:16.351	INFO	tls.cache.maintenance	started background certificate maintenance	{"cache": "0xc000157680"}
2024/08/03 07:25:16.352	INFO	tls.cache.maintenance	stopped background certificate maintenance	{"cache": "0xc000157680"}

구성이 올바른지 확인한 후 Caddy 웹 서버를 다시 시작하세요.

sudo systemctl restart caddy

Caddy 서비스 상태를 확인하고 SSL 생성 관련 로그를 확인하세요. Let’s Encrypt 생성이 성공했는지 주의 깊게 살펴보세요:

$ systemctl status caddy
● caddy.service - Caddy
   Loaded: loaded (/usr/lib/systemd/system/caddy.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2024-08-03 07:23:34 UTC; 5s ago
     Docs: https://caddyserver.com/docs/
 Main PID: 45140 (caddy)
    Tasks: 7 (limit: 48750)
   Memory: 19.6M
   CGroup: /system.slice/caddy.service
           └─45140 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile

Aug 03 07:23:36 rocky8.cloudspinx.com caddy[45140]: {"level":"info","ts":1722669816.0895815,"logger":"tls.issuance.acme","msg":"served key authentication","identifier":"blog.cloudlabske.com","challenge":"http-01","remote">
Aug 03 07:23:36 rocky8.cloudspinx.com caddy[45140]: {"level":"info","ts":1722669816.2393315,"logger":"tls.issuance.acme","msg":"served key authentication","identifier":"blog.cloudlabske.com","challenge":"http-01","remote">
Aug 03 07:23:36 rocky8.cloudspinx.com caddy[45140]: {"level":"info","ts":1722669816.3801627,"logger":"tls.issuance.acme","msg":"served key authentication","identifier":"blog.cloudlabske.com","challenge":"http-01","remote">
Aug 03 07:23:36 rocky8.cloudspinx.com caddy[45140]: {"level":"info","ts":1722669816.7106369,"logger":"tls.issuance.acme.acme_client","msg":"authorization finalized","identifier":"blog.cloudlabske.com","authz_status":"vali>
Aug 03 07:23:36 rocky8.cloudspinx.com caddy[45140]: {"level":"info","ts":1722669816.7106667,"logger":"tls.issuance.acme.acme_client","msg":"validations succeeded; finalizing order","order":"https://acme-v02.api.letsencryp>
Aug 03 07:23:37 rocky8.cloudspinx.com caddy[45140]: {"level":"info","ts":1722669817.3649049,"logger":"tls.issuance.acme.acme_client","msg":"got renewal info","names":["blog.cloudlabske.com"],"window_start":1727765075,"win>
Aug 03 07:23:37 rocky8.cloudspinx.com caddy[45140]: {"level":"info","ts":1722669817.666609,"logger":"tls.issuance.acme.acme_client","msg":"got renewal info","names":["blog.cloudlabske.com"],"window_start":1727765075,"wind>
Aug 03 07:23:37 rocky8.cloudspinx.com caddy[45140]: {"level":"info","ts":1722669817.6666691,"logger":"tls.issuance.acme.acme_client","msg":"successfully downloaded available certificate chains","count":2,"first_url":"http>
Aug 03 07:23:37 rocky8.cloudspinx.com caddy[45140]: {"level":"info","ts":1722669817.6672106,"logger":"tls.obtain","msg":"certificate obtained successfully","identifier":"blog.cloudlabske.com","issuer":"acme-v02.api.letsen>
Aug 03 07:23:37 rocky8.cloudspinx.com caddy[45140]: {"level":"info","ts":1722669817.6673443,"logger":"tls.obtain","msg":"releasing lock","identifier":"blog.cloudlabske.com"}

WordPress 웹사이트에 http://yourdomain로 접속하면 자동으로 https://yourdomain로 리디렉션되어야 합니다.

시작하기 공식 가이드 페이지에서 더 알아보세요.