Wherelse Blog

Caddy2安装与托管静态博客

2021-01-17 · 8 min read
笔记 网络

Caddy2 installation and hosting of static blogs

Caddy2安装

以下操作均为ubuntu环境

源安装(推荐)

sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https 
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/cfg/gpg/gpg.155B6D79CA56EA34.key' | sudo apt-key add -
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/cfg/setup/config.deb.txt?distro=debian&version=any-version' | sudo tee -a /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

安装完成后,在命令窗口输入caddy,可以查看caddy相关的命令。

usage:
 caddy <command> [<args...>]

commands:
 adapt           Adapts a configuration to Caddy's native JSON
 build-info      Prints information about this build
 environ         Prints the environment
 file-server     Spins up a production-ready file server
 fmt             Formats a Caddyfile
 hash-password   Hashes a password and writes base64
 help            Shows help for a Caddy subcommand
 list-modules    Lists the installed Caddy modules
 reload          Changes the config of the running Caddy instance
 reverse-proxy   A quick and production-ready reverse proxy
 run             Starts the Caddy process and blocks indefinitely
 start           Starts the Caddy process in the background and then returns
 stop            Gracefully stops a started Caddy process
 trust           Installs a CA certificate into local trust stores
 untrust         Untrusts a locally-trusted CA certificate
 validate        Tests whether a configuration file is valid
 version         Prints the version

下载安装并手动注册linux service

首先到官网下载Caddy2,然后将下载的文件改名为caddy后上传至服务器。

sudo mv caddy /usr/bin/
caddy version #测试是否正常运行
sudo groupadd --system caddy
sudo useradd --system \
    --gid caddy \
    --create-home \
    --home-dir /var/lib/caddy \
    --shell /usr/sbin/nologin \
    --comment "Caddy web server" \
    caddy

下载caddy.service文件,并移动到/etc/systemd/system/caddy.service。然后可以通过以下指令配置caddy运行状态:

sudo systemctl daemon-reload #重载配置
sudo systemctl enable caddy    #启用caddy
sudo systemctl start caddy     #开启caddy
sudo systemctl reload caddy     #应用所有配置文件修改
sudo systemctl status caddy     #查看caddy状态
sudo systemctl stop caddy       #停止caddy

使用官方服务文件时,caddy输出将重定向到journalctl

journalctl -u caddy --no-pager | less

编辑配置文件

Caddy2与Caddy1不同,开始使用json作为默认的配置文件,但是仍然可以使用Caddyfile进行配置,后续内容均使用Caddyfile。默认Caddyfile路径为/etc/caddy,使用vi或nano编辑该文件,若无该文件则手动创建。

cd /etc/caddy
touch Caddyfile #若目录下无配置文件
sudo nano Caddyfile

在配置文件填写以下内容:

your domain {
        root * /root/deploy #你需要发布的文件路径
        file_server
}

这样网站就可以跑起来了,但是还没有配置 HTTPS,自动的HTTPS是个人使用Caddy的最大优势。

Auto-HTTPS

Caddy的Auto-HTTPS验证有几种方法,分为HTTP验证、TLS-ALPN验证和DNS验证。

HTTP验证与TLS-ALPN验证

这两种验证方式分别需要80端口和443端口没有被其他服务占用,可被Caddy使用。
这两种验证的配置方式较为简单,仅需要在配置文件中添加:

tls [email protected] #你的邮箱

就可以实现自动HTTPS。
配置完成后的完整配置:

your domain {
        root * /root/deploy #你需要发布的文件路径
        file_server
        tls [email protected]  #你的邮箱
}

DNS 验证

以Cloudflare为DNS托管服务商为例。首先去Cloudflare控制台,选择站点->获取您的 API 令牌->API令牌->创建令牌->编辑区域DNS->使用模板,选择相关配置后,创建令牌,复制并记录令牌。在Caddyfile的网站配置中添加一下语句。

tls {
    dns cloudflare $your_token 
}

配置完成后的完整配置:

your domain {
        root * /root/deploy #你需要发布的文件路径
        file_server
        tls {
            dns cloudflare $your_token 
        }
}

Cloudflare的DNS验证需要Caddy的验证插件,而源安装的版本是不带验证插件的,需要对caddy源文件进行替换,首先去官网下载预编译插件版本源文件,注意选择插件,运行平台后下载。

下载后上传至服务器,并移动源文件至/usr/bin/目录下。

sudo mv caddy /usr/bin/
chmod +x /usr/bin/caddy #赋可执行权限

重启Caddy,并运行caddy list-modules,查看插件是否已在已安装列表中。

这里就完成了基于DNS验证的Auto-HTTPS的配置。
关于Auto-HTTPS更详细进一步的配置参考请官方文档。

进一步配置

Caddyfile 支持类似代码中函数一样的配置片段,可以在任意位置被 import引入,且可以传递参数,下面分别配置一部分配置片段。
启用HTHS ( HTTP Strict Transport Security,HTTP严格传输安全 ), 它告诉浏览器只能通过HTTPS访问当前资源,而不是HTTP:

(HSTS) {
    # HSTS (最大时长63072000 seconds)
    header / Strict-Transport-Security "max-age=63072000"
}

错误处理
处理404错误页面,指向网站根目录的404页面:

(ERROR_HANDLE) {
        handle_errors {
                @404 {
                        expression {http.error.status_code} == 404
                }
                handle @404 {
                        rewrite * /404.html
                        file_server
                }
        }
}

开启并配置log

(LOG) {
    log {
        output file "{args.0}" {
                roll_size     500MiB #滚动存储大小最大500MiB
                roll_local_time     #使用服务器本地时间
                roll_keep     20    #保存20个版本的滚动log
                roll_keep_for 30d #滚动保存时长30天
        }
    }
}

其中{args.0}为通过参数传递的log文件名信息。

配置TLS使其更安全

(TLS_CONFIG) {
    # TLS 配置采用 https://mozilla.github.io/server-side-tls/ssl-config-generator/ 生成
    # Due to a lack of DHE support, you -must- use an ECDSA cert to support IE 11 on Windows 7
    protocols tls1.2 tls1.3
    ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
}

聚合为通用配置

(GENERAL_CONFIG) {
        # 使用HTTP验证或TLS-ALPN验证
        tls [email protected] {
            import TLS_CONFIG    
        }
        # HSTS
        import HSTS
        # 压缩支持
        encode zstd gzip
        # 错误处理
        import ERROR_HANDLE
}

配置全局设置
尝试在全局设置中开启HTTP3支持

{
        servers :443 {
                protocol {
                                experimental_http3
                } 
        }
}

完善最终配置文件

(TLS_CONFIG) {
    # TLS 配置采用 https://mozilla.github.io/server-side-tls/ssl-config-generator/ 生成
    # Due to a lack of DHE support, you -must- use an ECDSA cert to support IE 11 on Windows 7
    protocols tls1.2 tls1.3
    ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
}

(LOG) {
    log {
        output file "{args.0}" {
                roll_size     500MiB
                roll_local_time
                roll_keep     20
                roll_keep_for 30d
        }
    }
}


(HSTS) {
   # HSTS (最大时长63072000 seconds)
    header / Strict-Transport-Security "max-age=63072000"
}

(ERROR_HANDLE) {
        handle_errors {
                @404 {
                        expression {http.error.status_code} == 404
                }
                handle @404 {
                        rewrite * /404.html
                        file_server
                }
        }
}

(GENERAL_CONFIG) {
     # 使用HTTP验证或TLS-ALPN验证
        tls [email protected] {
            import TLS_CONFIG    
        }
        # HSTS
        import HSTS
        # 压缩支持
        encode zstd gzip
        # 错误处理
        import ERROR_HANDLE
}

{
        servers :443 {
                protocol {
                                experimental_http3
                } 
        }
}

example.com {
        # Set this path to your site's directory.
        root * /root/deploy #替换为你需要发布的文件路径
        file_server
        import LOG "/root/deploy/logs/example.com.log" #替换为你需要的文件路径和文件名
        import GENERAL_CONFIG
}
# 引入其他的站点配置
import /etc/caddy/*.caddy

启动与运行

首先使用caddy validate命令,验证配置文件语法有无错误。

caddy validate --config /etc/caddy/Caddyfile

停止并重新启动caddy

caddy stop
caddy start

或者

caddy reload --config /etc/caddy/Caddyfile

将静态网站内容上传至发布目录,配置防火墙端口放行后,网站应该就可以访问了。