caddy比nginx的不同:
- caddy自带https的前端,直接将http服务器转换为https服务器。而nginx需要用户自己安装。
- caddy可以自己申请证书,而且可以过期时自动申请。而nginx好像不能申请证书,过期也无法帮你申请。
另外,浏览器通过https连接本地/内部的https网页时,chrome会提示安全问题,此时可以设置将它加入例外,但还有个更简单的方法,在chrome网页里直接盲敲
thisisunsafe
就可以马上访问该https网页。
caddy 有两种格式的配置方法,一种叫Caddyfile格式,一种叫json格式。Caddyfile格式简洁明了,json由于有括号和缩进,比较不适合人眼。但是json才可以进行完整配置,Caddyfile不能进行完整配置,只包含大部分配置,一般情况下绝对够用了。
caddy可以将Caddyfile转换成json,供server管理者查看,方法:
caddy adapt -config Caddyfile -pretty -validate > config.json
其中Caddyfile就是配置文件名,config.json保存转换后的配置,-pretty美化打印,-validate对配置文件进行正确性验证。
caddy run
相当于 caddy start
,但是run在前台运行,不创建daemon,而start在后台运行。他们默认寻找当前目录下的Caddyfile作为配置文件,如果配置文件在别处,可以用-config path/to/config/file
来指定配置文件路径。一个典型的Caddyfile如下:
localhost {
respond "Hello, world!"
}
localhost:2016, 127.0.0.1:2016 {
respond "Goodbye, world!"
}
该配置文件创建了两个server容器,一个是localhost:443 (https), 一个是localhost:2016 (https),并将127.0.0.1:2016的所有访问(http 和 https)全部redirect到localhost:2016。另外本机的80端口(http)会被默认redirect到其中一个server容器,至于是哪一个,只有运行之后才知道,如果不接受这种随机redirect 80端口,可以自己写死。
另外,443和80端口都需要root权限,caddy第一次运行时会申请CA认证,好像是放在:/root/.local/share/caddy/
,下面是我自己的目录结构:
/root/.local/share/caddy/ ├── certificates │ └── local │ ├── 127.0.0.1 │ │ ├── 127.0.0.1.crt │ │ ├── 127.0.0.1.json │ │ └── 127.0.0.1.key │ └── localhost │ ├── localhost.crt │ ├── localhost.json │ └── localhost.key ├── locks └── pki └── authorities └── local ├── intermediate.crt ├── intermediate.key ├── root.crt └── root.key 8 directories, 10 files
这只是我运行了上面那个典型的Caddyfile而产生的CA文件。下次补上用域名后caddy自动申请CA的文件结构。
用真正的域名来运行caddy,下面是我服务器上的配置:
Caddyfile:
:my_port, my_domain.com:my_port, www.my_domain.com:my_port {
respond "I love China deep."
log {
output file /home/my_user_home/temp/caddy-log/caddy.log {
roll_size 10MiB
roll_keep 10
}
}
}
其中,my_port 和 my_domain 我做了隐藏,my_user_home 我也做了隐藏。
使用 sudo caddy_linux_amd64 start -config /path/to/Caddyfile
运行caddy 后,它立刻会自动帮你申请my_domain的证书,你什么都不用管,直接从浏览器就可以访问了。记住,它会把80端口forward到你的my_port端口,你在浏览器访问http://my_domain.com时,会forward到https://www.my_domain.com:my_port,也即会将80端口的访问forward,但是它不会forward 443端口,你访问https://my_domain.com是ERR_CONNECTION_REFUSED。