2020.9.1更新

随着Caddy2的到来,目前官方已停止安装脚本的使用,并且Caddy2的的写法变动比较大,请勿再作为参考。目前推荐Nginx。

第一步,使用Caddy官方安装脚本安装

curl https://getcaddy.com | bash -s personal tls.dns.cloudflare

最后面的tls.dns.cloudflare是插件名,用来使用cloudflare的API实现自动https

多个插件以逗号隔开,例如

curl https://getcaddy.com | bash -s personal tls.dns.cloudflare,http.git,http.cache

http.git可以使用git自动检查更新,可以一直同步指定文件夹到最新的代码,对PHP程序很有用
http.cache用于缓存请求

插件如果用不到没必要安装,但建议安装cache插件

第二步,创建一些文件文件夹并修改权限

mkdir -p /etc/caddy/conf
echo 'import ./conf/*' >> /etc/caddy/Caddyfile
mkdir /etc/ssl/caddy
chown -R www-data:www-data /etc/caddy
chown -R www-data:www-data /etc/ssl/caddy
chmod 0770 /etc/ssl/caddy

第三步,配置systemd脚本

curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service

修改一下/etc/systemd/system/caddy.service

service块内加入两行

Environment=CLOUDFLARE_EMAIL=example@mail.com
Environment=CLOUDFLARE_API_KEY=123456789

可以用一条命令搞定 (多谢@aRNoLD 指点)

curl https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service | sed 's/\[Service\]/\[Service\]\nEnvironment=CLOUDFLARE_EMAIL=example\@mail.com\nEnvironment=CLOUDFLARE_API_KEY=123456789/g' > /etc/systemd/system/caddy.service

更改前

[Unit]
Description=Caddy HTTP/2 web server
Documentation=https://caddyserver.com/docs
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service

[Service]
Restart=on-abnormal

; Do not allow the process to be restarted in a tight loop. If the
; process fails to start, something critical needs to be fixed.
StartLimitIntervalSec=14400
StartLimitBurst=10
......

更改后

[Unit]
Description=Caddy HTTP/2 web server
Documentation=https://caddyserver.com/docs
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service

[Service]
Restart=on-abnormal

Environment=CLOUDFLARE_EMAIL=example@mail.com
Environment=CLOUDFLARE_API_KEY=123456789

; Do not allow the process to be restarted in a tight loop. If the
; process fails to start, something critical needs to be fixed.
StartLimitIntervalSec=14400
StartLimitBurst=10

API KEY可以从cloudflare官网的My Profile-API Tokens-Global API Key找到

PS:如果使用其他DNS提供商,请前往官方文档查看具体用法

其实如果不使用Cloudflare CDN的话,也没必要配置DNS插件和API,因为如果域名直接指向本机IP的话,caddy会全部自动配置,但使用CDN的话, Let’s Encrypt 无法通过IP验证域名所有权,所以需要使用DNS的API

如果需要配置QUIC(HTTP3),在ExecStart=/usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp这一行加入-quic

ExecStart=/usr/local/bin/caddy -quic -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp

查看是否配置成功

systemctl daemon-reload
systemctl enable caddy
systemctl start caddy
systemctl status caddy

这时应该已经成功运行

第四步,添加站点配置

所有的站点配置文件都放在/etc/caddy/conf文件夹下面

给出两个示例

反代:

example.com {
    gzip
    proxy / http://localhost:8080 {
        transparent
    }
    tls {
        dns cloudflare
    }
}

需要修改端口号。当然如果应用提供了更快速稳定的Unix Socket,也可以指定Unix Socket

PHP:

example.com {
     root /srv/www/example
     gzip
     # PHP-FPM Configuration for Caddy
     fastcgi / /run/php/php7.2-fpm.sock php {
         ext .php
         split .php
         index index.php
     }
}

需要修改root网站根目录和fastcgiPHP版本号(如果是包管理器安装的php-fpm的话,面板/脚本安装的php请查看面板/脚本文档以确定Unix Socket文件路径

刚刚提到的cache插件,可以直接加一行cache启用

例如

example.com {
    gzip
    cache
    proxy / http://localhost:8080 {
        transparent
    }
    tls {
        dns cloudflare
    }
}

git插件的用法

example.com {
     root /srv/www/example
     gzip
     git https://tt-rss.org/git/tt-rss.git
     # PHP-FPM Configuration for Caddy
     fastcgi / /run/php/php7.2-fpm.sock php {
         ext .php
         split .php
         index index.php
     }
}

指定git地址,root目录会自动同步到最新代码

更多插件和详细用法请参考官方文档

第五步,自动部署证书

重启,并稍等片刻

systemctl restart caddy

查看状态

systemctl status caddy

此时HTTPS和QUIC应该已经自动部署,并且caddy会自动把http请求跳转到https,无需手动配置

(请打开80端口和443端口,并且443端口同时打开TCP和UDP以便QUIC使用)

话很多其实复制粘贴两三分钟就搞完了,后续的证书续期等问题也不用自己管了,非常省心

调试

如果出了问题,请使用journalctl查看详细信息

journalctl -u caddy

还可以指定时间,例如5分钟

journalctl -u caddy --since "5 min ago"

或者实时信息

journalctl -u caddy -f