MENU

利用Caddy2简单实现对Cloudflare反向代理

July 26, 2023 • Read: 650 • 技术杂谈

Still the only web server to use TLS automatically and by default. Deploy and scale HTTPS effortlessly with Caddy 2.

以上这句话摘抄自Caddy2官网,简单讲,Caddy 是一个和Nginx用类型的Web Server,但是他是新生代产品相比Nginx而言,比Nginx更强更快更简单;作为一款Golang开发的产品,我本身也在学习Golang,所以对Caddy有着天然的亲近感;在一些实验性质的场景中,可以使用其部署体验,但在生产场景中,Nginx有着强大且成熟的社区,大家各取轻重。

说回我的需求,我的一个WEB服务部署在海外,套用了Cloudflare的CDN,由于众所周知的原因,中国大陆经常无法使用,迫切需要解决。我的方案是,单独部署一台对大陆友好的WEB服务器,再对Cloudflare进行反向代理;可能有人问,为啥不直接对源站进行反代?我的理由是:减少技术复杂度,源站只需要对Cloudflare负责即可(其实是我懒...)。

准备环境

  • 节点服务器,debian11系统,对大陆友好
  • 加速域名,bbb.com(提前解析指节点服务器,保证已经生效)
  • 源节点域名,aaa.com

也就是说,使用bbb.comaaa.com进行加速;大陆aaa.com打不开的地方,就使用bbb.com

操作步骤

安装Caddy2

root权限下执行:

apt update
apt upgrade -y
apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install caddy

安装成功,执行caddy version出现以下截图,表示安装成功

caddy version.png

修改Systemd

默认Caddy采用的配置文件是caddyfile格式,个人不喜欢,遂改为json格式,修改文件:/lib/systemd/system/caddy.service,改为以下内容:

[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target

[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/config.json
ExecReload=/usr/bin/caddy reload --config /etc/caddy/config.json --force
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

改完执行systemcl daemon-reload,保证没有问题

配置加速

建立配置文件:/etc/caddy/config.json,修改为以下内容,里面对应域名酌情修改。

{
    "admin": {
        "disabled": true
    },
    "logging": {
        "logs": {
            "default": {
                "writer": {
                    "output": "file",
                    "filename": "/var/log/caddy/access.log"
                },
                "level": "INFO"
            }
        }
    },
    "apps": {
        "http": {
            "servers": {
                "bbb.com": {
                    "listen": [
                        ":80",
                        ":443"
                    ],
                    "routes": [
                        {
                            "match": [
                                {
                                    "host": [
                                        "bbb.com"
                                    ]
                                }
                            ],
                            "handle": [
                                {
                                    "handler": "reverse_proxy",
                                    "upstreams": [
                                        {
                                            "dial": "aaa.com:443"
                                        }
                                    ],
                                    "headers": {
                                        "request": {
                                            "set": {
                                                "Host": [
                                                    "aaa.com"
                                                ]
                                            }
                                        }
                                    },
                                    "transport": {
                                        "protocol": "http",
                                        "tls": {
                                            "insecure_skip_verify": false
                                        }
                                    }
                                }
                            ]
                        }
                    ]
                }
            }
        }
    }
}

改完之后执行systemctl restart caddy重启服务,再systemctl status caddy确保是否正常运行,随后访问bbb.com测试是否成功(会自动申请配置SSL,80会自动跳转443,Caddy特性)

参考

Last Modified: March 6, 2024