메뉴 건너뛰기

IT지혜

최근에는 APM(Apache+PHP+Mysql) 의 Apache 와 Nginx, litespeed 등 많은 종류의 웹서버들이 있는데 그중에 Caddy 라는 것을 소개하고자 합니다.

간단히 Caddy 는 Golang 기반의 HTTP/2 를 지원하는 Web Server 입니다. 최근에 들어서는 HTTP/3 까지 실험적으로 지원을 하고 있습니다. Caddy 는 Reverse  Proxy 기능을 내장하고 있는 웹서버로 개인 정보를 취급하는 사이트에 있어서 필수인 SSL 인증서 또한 자동으로 등록하여 주기 때문에 관리에 있어서 좀더 수월할 것으로 생각됩니다. 그리고 80포트(HTTP_로 접근하는 주소를 자동으로 443포트(HTTPS)로 자동으로 전환해주기도 합니다.

 

Caddy 서버에 더 자세한 정보를 알고 싶다면 아래의 웹페이지에서 확인하여 보세요.

https://caddyserver.com/

 

시스템 환경 : Ubuntu 20.04.1 server (focal)

 

1. MariaDB 10.5.8 설치

- 먼저 데이터베이스로 MariaDB 10.5.8 을 설치합니다. 아래의 명령어를 사용하여 repo 를 추가합니다. (한국 미러서버)

sudo apt-get install software-properties-common dirmngr apt-transport-https
sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] https://mirror.yongbok.net/mariadb/repo/10.5/ubuntu focal main'

 

- repo 를 추가한 이후에 아래의 명령어를 실행하여 실제 mariadb-server 패키지를 설치합니다. 설치되고 데몬이 자동적으로 기동됩니다.

sudo apt update
sudo apt install mariadb-server

 

- mysql_secure_installation 명령어를 실행하여 기본적인 설정 및 root 패스워드를 변경합니다. 초기 패스워드는 그냥 엔터를 입력하시면 됩니다.

mysql_secure_installation
root@caddy:/etc/apt# mysql_secure_installation 

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):   <== 현재의 패스워드 (그냥 엔터)
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] Y  (Unix 소켓 인증 Y)
Enabled successfully!
Reloading privilege tables..
 ... Success!


You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n] Y (root 패스워드 변경)
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y (익명 유저 삭제 : Y)
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y (원격으로 root 계정 로그인 제한 설정 : Y)
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y (불필요한 test 데이터베이스 삭제 : Y)
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y (권한 관련 설정 테이블 새로 불러들여 변경된 권한 적용하기 : Y)
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
root@caddy:/etc/apt# 

mysql_secure_installation.PNG

 

2. PHP 8.0.2 설치

- PHP 8.0.2(최신)를 설치하기 위해 아래 명령어를 사용하여 PPA를 추가합니다.

sudo apt install software-properties-common
sudo LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php

 

- 그리고 PHP 를 실제로 설치합니다.

sudo apt install php8.0-fpm php8.0-gd php8.0-mysql php8.0-xml php8.0-imagick php8.0-zip php8.0-mbstring php8.0-intl php8.0-curl php8.0-bz2

 

3. Caddy 2.3.0 설치

- 먼저 저장소 추가전에 아래의 패키지들을 설치합니다.

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https

 

- 그리고 이제 저장소를 추가하고 실제 caddy 패키지를 설치합니다.

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo apt-key add -
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee -a /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

 

- 브라우져를 통해 서버의 IP로 접속하면 아래와 같은 화면을 확인하실 수 있습니다.

caddy-index.png

 

- 이제 실제로 사용할 웹페이지 2개(caddy.zzori.com, caddydb.zzori.com)를 셋팅하여 보겠습니다. caddy 의 셋팅파일은 /etc/caddy/Caddyfile 입니다.

준비사항으로 아래처럼 /home/zzori (자신의 홈경로) 아래에 도메인별로 디렉토리를 생성하고 caddydb.zzori.com 에는 phpmyadmin 최신버젼 파일을 준비하고 그리고 caddy.zzori.com 에는 phpinfo 가 나오게하는 index.php 파일을 준비해놓았습니다. 그리고 네임서버 설정에서 해당 IP로 A레코드를 설정하여 주시기 바랍니다.

caddy-pre.PNG

 

- 이제 아래와 같이 /etc/caddy/Caddyfile 을 변경합니다. HTTP/3 도 지원하게끔 설정 하였습니다. 자신의 도메인으로 변경하여 설정하시면 됩니다.

{
        servers {
                protocol {
                        experimental_http3
                }
        }
}

caddydb.zzori.com {
        header {
                Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"
                X-Content-Type-Options "nosniff"
                X-Frame-Options "DENY"
                Referrer-Policy "no-referrer-when-downgrade"
        }

        root * /home/zzori/caddydb.zzori.com
        file_server
        encode zstd gzip
        php_fastcgi unix//run/php/php8.0-fpm.sock

        log {
                format single_field common_log
                output file /var/log/caddy/caddydb.zzori.com.log {
                        roll_size 50mb
                        roll_keep 8
                        roll_keep_for 720h
                }
        }
}

caddy.zzori.com {
        header {
                Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"
                X-Content-Type-Options "nosniff"
                X-Frame-Options "DENY"
                Referrer-Policy "no-referrer-when-downgrade"
        }

        root * /home/zzori/caddy.zzori.com
        file_server
        encode zstd gzip
        php_fastcgi unix//run/php/php8.0-fpm.sock

        log {
                format single_field common_log
                output file /var/log/caddy/caddy.zzori.com.log {
                        roll_size 50mb
                        roll_keep 8
                        roll_keep_for 720h
                }
        }
}

 

- 그리고 이제 로그파일이 저장되는 경로로 /var/log/caddy 로 해놓았기 때문에 해당 경로를 생성하고 caddy 데몬을 재시작합니다.

mkdir /var/log/caddy
chown caddy.caddy /var/log/caddy

service caddy restart