caddy配置反向代理和ssl证书申请

 

下载Caddy

caddy官网下载地址https://caddyserver.com/download。也可以直接点此下载linux amd64版本。 目前最新版本为v2.9.0-beta.3

如果是需要申请泛域名证书则需要勾选对应dns提供商的插件,比如cloudflare

注意:cloudflare不再支持.cf, .ga, .gq, .ml,  .tk后缀域名使用api管理dns,也就是这些后缀的域名是不能通过cloudflare申请泛域名证书。

 

 

下载之后重命名为caddy拷贝到/usr/local/bin下即可。

 

配置文件Caddyfile

在任意目录新建一个文件Caddyfile, 推荐位置为/etc/caddy/Caddyfile

输入以下内容, 表示将www.mydomain.cf转发到localhost:16325,并且自动通过let's encrypt申请ssl证书,申请邮箱为my@qq.com.  开启tls则会默认把http重定向到https

www.mydomain.cf {
        reverse_proxy localhost:16325
        tls my@qq.com
}

如果是同时开启http和https访问则

www.mydomain.cf:80  www.mydomain.cf:443{
        reverse_proxy localhost:16325
        tls my@qq.com
}

 

反向代理一般用于后端站点,前端站点则直接可以是静态站点,如果是docker运行的也可以反向代理

以下为静态站点配置,开启https, 站点根目录为/www/vue

www.mydomain.cf {
    tls my@qq.com
    root * /www/vue
    file_server
}

启动caddy

运行以下命令即可让caddy进入后台运行。其中/etc/caddy/Caddyfile是配置文件Caddyfile所在路径,--dapter caddyfile表示指定配置文件适配器为caddyfile格式,默认是json,caddyfile也可以翻译为json.

如caddy adapt --config /etc/caddy/caddyfile > /etc/caddy/file.json就是将caddyfile翻译为json并输出,然后caddy start的config参数指定为json文件即可。

caddy start --config /etc/caddy/Caddyfile --adapter caddyfile

caddy start是后台启动,但是日志会在当前控制台输出,关闭当前控制台也会继续运行

caddy run是前台启动,当前控制台关闭进程也会关闭

二者参数一致

证书目录在$XDG_DATA_HOME/certificates/acme-v02.api.letsencrypt.org-directory,$XDG_DATA_HOME在不同系统中对应关系如下

OSData directory path
Linux, BSD $HOME/.local/share/caddy
Windows %AppData%\Caddy
macOS $HOME/Library/Application Support/Caddy
Plan 9 $HOME/lib/caddy
Android $HOME/caddy (or /sdcard/caddy)

也就是说linux下是~/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory。

修改数据存储目录[可选]

通过修改数据存储目录可以让ssl证书存储到其他路径

Caddyfile增加全局配置storage。如下所示,会把数据目录修改为/etc/ssl/caddy, 这样证书所在路径就变为了/etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory。

需要注意一下的是如果letsencrypt证书获取失败会自动改为获取zerossl的证书,则路径会变为/etc/ssl/caddy/certificates/acme.zerossl.com-v2-dv90

但是需要保证/etc/ssl/caddy存在且当前用户有权限读写和修改,比如 sudo chmod 747 /etc/ssl/caddy -R.

caddyfile内容如下

{
        storage file_system {
                root /etc/ssl/caddy
        }
}
www.mydomain.com {
        reverse_proxy localhost:16325
        tls my@qq.com
}

  

 

添加到systemd运行

新建文件/usr/lib/systemd/system/caddy.service(centos)或者/etc/systemd/system/caddy.service(ubuntu),内容如下. 记得将User=my中my修改为有权限的用户名。

[Unit]
Description=Caddy HTTP/2 web server
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service

[Service]
User=my
Restart=on-abnormal

ExecStart=/usr/local/bin/caddy run --config=/etc/caddy/Caddyfile --adapter=caddyfile
ExecReload=/bin/kill -USR1 $MAINPID
; Use graceful shutdown with a reasonable timeout
KillMode=mixed
KillSignal=SIGQUIT
TimeoutStopSec=5s
ProtectSystem=full
[Install]
WantedBy=multi-user.target

然后执行

systemctl enable caddy.service
systemctl start caddy.service
systemctl status caddy.service

 

泛域名证书申请和使用

泛域名证书只能通过dns记录来验证,所以需要配置dns提供商的信息

对于.cf, .ga, .gq, .ml,  .tk后缀的域名基本就告别自动泛域名证书了,cloudflare不允许通过api调用修改dns,而国内不允许此类域名备案。

1. 安装对应域名提供商的dns模块,常用的国内有阿里云(alidns)和腾讯云(dnspod), 国外有cloudflare 微软(azure) 谷歌(googleclouddns)

可以在下载caddy时勾选对应模块。如果没有勾选也没关系,可以通过命令行下载

cloudflare

caddy add-package github.com/caddy-dns/cloudflare

阿里云

caddy add-package github.com/caddy-dns/alidns

腾讯云

caddy add-package github.com/caddy-dns/dnspod

 

安装完毕后修改caddyfile, 不同dns提供商的模块配置略微有些区别

 

cloudflare   

将cloudflare_key替换为自己的key, 从这里创建一个dns api令牌即可

*.my.com {
    tls {
       dns cloudflare cloudflare_apikey
    }
}

阿里云

key_id和key_secret来自控制台创建的accesskey,从这里可以创建,region就是账户所属区域,可不填,默认为 zh-hangzhou

*.my.com {
    tls { 
     dns alidns {
        access_key_id        key_id
        access_key_secret    key_secret
#        region_id            region
      }
    }
}

腾讯云

dnspod需要的是api token,由 ID,Token 组合而成的,用英文的逗号分割, 这里有说明如何创建Token.  如id为3245,token为sf3fwr234,则完整的api_token为 3245,sf3fwr234

*.my.com {
    tls {
      dns dnspod api_token
}

 

 

 

泛域名证书的使用

默认目录配置, 当前用户为my, 域名为my.com

*.my.com {
    tls {
dns cloudflare cloudflare_apikey
} }

www.my.com {
proxy localhost:5000
tls
/home/my/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.crt /home/my/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.key
}

 

修改数据目录为/etc/ssl/caddy后的配置

{
        storage file_system {
                root /etc/ssl/caddy
        }
}
*.my.com {
    tls {
         dns cloudflare cloudflare_apikey
    }
}

www.my.com {
reverse_proxy localhost:8080
tls
/etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.crt /etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.key
}

api.my.com {
reverse_proxy localhost:5000
tls
/etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.crt /etc/ssl/caddy/certificates/acme-v02.api.letsencrypt.org-directory/wildcard_.my.com/wildcard_.my.com.key
}

 

posted @ 2022-01-12 16:00  turingguo  阅读(17181)  评论(0编辑  收藏  举报