Featured image of post 冰布子的Caddy入门笔记

冰布子的Caddy入门笔记

Caddy1真的是非常方便易用,不论是配置难度还是扩展性,真正的一键,做一个简单的反向代理、Webdav或者就作为普通的Http服务器都是非常简单易用。(Caddy2已发布,和Caddy1完全不一样,所以我已经用回Nginx了,Nginx真香)

我现在主力VPS有两台,分别是新加坡和香港的阿里云,其中香港那台装的是LNMP环境,跑着自己的这堆老字号网站(比如这个博客),而新加坡那台主要安装的Docker和NodeJS环境,如果还用Nginx反代的话就太麻烦了,所以我想到了Caddy。

上手两天后,发现它真的非常简单方便,如果仅仅只需要反代或者静态文件托管更是简单的要命,比起Nginx的配置来讲可以说精简了大部分。

在这里我做一个自己的简单总结,方便参考。

安装

安装很简单,Caddy官方有自己的一键安装包,可以直接在 [官网] 定制自己需要的插件。 我自己的安装如下:

1
curl https://getcaddy.com | bash -s personal docker,http.cache,http.cgi,http.filemanager,http.forwardproxy,http.git,http.jwt,http.login,http.minify,http.nobots

安装完成后,定义一下配置文件目录、网站目录和证书生成目录。

配置文件目录

1
2
3
sudo mkdir /etc/caddy
sudo touch /etc/caddy/Caddyfile
sudo chown -R root:www-data /etc/caddy

SSL证书目录

定义为 /etc/ssl/caddy 并做好权限设置(770)

1
2
3
sudo mkdir /etc/ssl/caddy
sudo chown -R www-data:root /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy

网站目录

定义到 /var/www,用户为www-data

1
2
sudo mkdir /var/www
sudo chown www-data:www-data /var/www

创建服务

最后,创建一个服务,这样就可以很方便地管理并实现开机启动。(使用systemd)

1
2
3
4
sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service   # 从 github 下载 systemd 配置文件
sudo systemctl daemon-reload        # 重新加载 systemd 配置
sudo systemctl enable caddy.service # 设置 caddy 服务自启动
sudo systemctl status caddy.service # 查看 caddy 状态

安装PHP

为了方便,当然是直接用apt安装了(我用的Ubuntu 18.04 LTS)。

1
sudo apt-get -y install php-fpm php-cli php-json php-curl php-imap php-gd php-xml php-zip php-intl php-imagick php-mbstring libsodium-dev

再修改一下配置文件 /etc/php/7.2/fpm/php.ini

1
2
3
memory_limit => memory_limit = 512M
;cgi.fix_pathinfo=1 => cgi.fix_pathinfo=1 upload_max_filesize => upload_max_filesize = 2000M
post_max_size => post_max_size = 2000M

以及 /etc/php/7.2/fpm/pool.d/www.conf (由于我9000端口被占用,所以用的9009)

1
listen = /run/php/php7.2-fpm.sock => listen = 127.0.0.1:9009

编写配置

Caddy的配置文件为 Caddyfile,详细的配置可以看 [官网文档]

我这里一个Caddyfile里面记录了我这个VPS的所有网站,多个host只需要用花括号 “{ }” 括起来即可。

不过总体来讲,Caddy的逻辑大概都是一个套路:第一行是域名,不填端口或者http(s)协议的话默认开启80和443端口并自动签发证书。接下来就可以定义gzip、网站根目录和rewrite规则等等。下面详细说明。

普通反代

我在机器上有跑Docker和NodeJS,为了让这些Web应用绑定上域名,就会涉及到反向代理。

使用Caddy完成普通反代的语句非常简单,可以参考下面的例子,比Nginx不知道简单到哪里去了。

1
2
3
4
5
example.com {    #域名
gzip             #开启GZIP
tls your@email.com    #SSL证书签发邮箱
proxy / localhost:端口号    #反代地址
}

静态文件

静态HTML文件托管也很简单,只要定义网站根目录和域名。

1
2
3
4
5
example.com {    #域名
gzip    #开启GZIP
tls your@email.com    #SSL签发邮箱
root /var/www/YOUR_WEBROOT    #网站根目录
}

使用PHP(以OneIndex为例)

如果要使用PHP,那就要加上fastcgi了。Rewrite部分就是伪静态规则,这里写的是OneIndex的规则。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#OD
a.b.com {
gzip
tls a@a.com
root /var/www/WEBROOT
fastcgi / 127.0.0.1:9009 php {    #刚刚安装的时候监听的是9009端口
        env PATH /bin
    }
rewrite {    #OneIndex的伪静态规则
to {path} {path}/ /index.php?{query}
    }
}

使用JWT做简单的登陆验证

除了basic_auth之外,Caddy还可以使用JWT进行简单的加密和登陆验证,自带登陆界面,比较好用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
b.com {
tls a@abc.com
gzip
root /var/www/WEBROOT
jwt {
  path /example    #加密目录
  redirect /login    #跳转到login界面
  allow sub user    #允许的用户名
  }
login {
  success_url /welcome    #验证成功后跳转的位置
  simple user=pass    #格式:用户名=密码
  }
}
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus