最近发现了一个 golang 开发的 HTTP server,叫作 Caddy,它配置起来十分简便,甚至能够 28 秒配置好一个支持 http2 的 server ,并且对各类 http 新特性都支持的比较早(好比 http二、quic都有支持)。 |
用过 golang 的应该都知道,golang 程序基本上不会有各类依赖,都是光秃秃一个可执行程序,cp 到 /usr/local/bin
就算安装完成了,因此说安装 caddy 是很简单的,我给出三种方法。javascript
脚本安装" data-anchor-id="vca7">php
curl -s https://getcaddy.com | bash
caddy 官方给出了一个安装脚本,执行上面的命令就能够一键安装 caddy,等执行结束后,使用 which caddy
,能够看到 caddy 已经被安装到了 /usr/local/bin/caddyjava
https://caddyserver.com/download 点这个连接进入到 caddy 官网的下载界面,网页左侧能够选择平台和插件,若是在 Linux 服务器上使用的话,platform 选择 Linux 64-bit 就能够了,plugins 若是暂时不须要的话,能够不选。而后点击下面的 DOWNLOAD 按钮,就下载到 caddy 了。同理,解压以后用 cp 命令放到 /usr/local/bin/caddy
就完成了安装。linux
go get github.com/mholt/caddy/caddy
对于安装了 golang 编译器的同窗,只须要执行 go get 就能到 $GOPATH/bin 里,是否 cp 到 /usr/local/bin
里就看心情了。使用源码安装能够安装到最新版本的 caddy,功能上通常是最新的,并且由于是本地编译,性能可能会稍微高一些,可是可能会存在不稳定的现象。nginx
Caddy 的配置文件叫作 Caddyfile
,Caddy 不强制你把配置文件放到哪一个特定文件夹,默认状况下,把 Caddyfile 放到当前目录就能够跑起来了,以下:git
echo 'localhost:8888' >> Caddyfile echo 'gzip' >> Caddyfile echo 'browse' >> Caddyfile caddy
在随便一个目录里执行上面代码,而后在浏览器里打开 http://localhost:8888 发现 caddy 已经启动了一个文件服务器。当临时须要一个 fileserver 的时候(好比共享文件),使用 caddy 会很方便。github
固然了,在生产环境使用的时候就不能这么草率的把配置文件放到当前目录了,通常状况下会放到 /etc/caddy
里。golang
sudo mkdir /etc/caddy sudo touch /etc/caddy/Caddyfile sudo chown -R root:www-data /etc/caddy
除了配置文件,caddy 会自动生成 ssl 证书,须要一个文件夹放置 ssl 证书。vim
sudo mkdir /etc/ssl/caddy sudo chown -R www-data:root /etc/ssl/caddy sudo chmod 0770 /etc/ssl/caddy
由于 ssl 文件夹里会放置私钥,因此权限设置成 770 禁止其余用户访问。后端
最后,建立一下放置网站文件的目录,若是已经有了,就不须要建立了。
sudo mkdir /var/www sudo chown www-data:www-data /var/www
建立好这些文件和目录了以后,咱们须要把 caddy 配置成一个服务,这样就能够开机自动运行,而且管理起来也方便。由于目前大多数发行版都使用 systemd 了,因此这里只讲一下如何配置 systemd,不过 caddy 也支持配置成原始的 sysvinit 服务,具体方法看这里。
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 状态
基本的安装配置搞定以后,最重要的就是如何写 Caddyfile了。能够直接 vim /etc/caddy/Caddyfile
来修改 Caddyfile,也能够再本身电脑上改好而后 rsync 到服务器上。若是修改了 Caddyfile 发现没有生效,是须要执行一下 sudo systemctl restart caddy.service
来重启 caddy 的。
Caddfile的格式仍是比较简单的,首先第一行必须是网站的地址,例如:
localhost:8080或lengzzz.com
地址能够带一个端口号,那么 caddy 只会在这个端口上开启 http 服务,而不会开启 https,若是不写端口号的话,caddy 会默认绑定 80 和 443 端口,同时启动 http 和 https 服务。
地址后面能够再跟一大堆指令(directive)。Caddyfile 的基本格式就是这样,由一个网站地址和指令组成,是否是很简单。
指令的做用是为网站开启某些功能。指令的格式有三种,先说一下最简单的不带参数的指令好比:
railgun.moe # 没错,moe后缀的域名也能够哦 gzip
第二行的 gzip 就是一个指令,它表示打开 gzip 压缩功能,这样网站在传输网页是能够下降流量。
第二种指令的格式是带简单参数的指令:
railgun.moe gzip log /var/log/caddy/access.log tls lengz@lengzzz.com root /var/www/
第三行,log 指令会为网站开启 log 功能,log 指令后的参数告诉 caddy log 文件存放的位置。第四行的 tls 指令告诉 caddy 为网站开启 https 并自动申请证书,后面的 email 参数是告知 CA 申请人的邮箱。(caddy 会默认使用 let's encrypt 申请证书并续约,很方便吧)
另外,简单参数也可能不仅一个,好比 redir 指令:
railgun.moe gzip log /var/log/caddy/access.log tls /etc/ssl/cert.pem /etc/ssl/key.pem root /var/www/ redir / https://lengzzz.com/archive/{uri} 301
上面的 redir 指令带了三个参数,意思是把全部的请求使用 301 重定向到 https://lengzzz.com/archive/xxx,这个指令在给网站换域名的时候颇有用。另外 tls 指令变了,不仅仅传 email一个参数, 而是分别传了证书和私钥的路径,这样的话 caddy 就不会去自动申请证书,而是使用路径给出的证书了。
在这个例子里还使用了 {uri}
这样的占位符(placeholder),详细的列表能够在这里查询到:https://caddyserver.com/docs/placeholders。
最后一种指令是带复杂参数的,这种指令包含可能不少参数,因此须要用一对花括号包起来,好比 header 指令:
railgun.moe gzip log /var/log/caddy/access.log tls lengz@lengzzz.com root /var/www/ header /api { Access-Control-Allow-Origin * Access-Control-Allow-Methods "GET, POST, OPTIONS" -Server } fastcgi / 127.0.0.1:9000 php { index index.php } rewrite { to {path} {path}/ /index.php?{query} }
6-10 行的 header 指令表明为全部的 /api/xxx 的请求加上 Access-Control-Allow-Origin 和 Access-Control-Allow-Methods 这两个 header,从而能支持 javascript 跨域访问 ,第 9 行表明删除 Server header,防止别人看到服务器类型。
11-13 行使用了 fastcgi 指令,表明把请求经过 fastcgi 传给 php,ruby 等后端程序。
14-15 行,使用了 rewrite 指令,这个指令的做用是 服务器内部重定向 在下面的参数 to
后面,又跟了三个参数,这个功能上有点相似 nginx 的 try_files
。告诉 caddy 须要先查看网址根目录 /var/www 里有没有 {path} 对应的文件,若是没有再查看有没有 {path} 对应的目录,若是都没有,则转发给 index.php 入口文件。这个功能通常会用在 PHP 的 MVC 框架上使用。
随着一步步完善这个 Caddyfile,目前这个版本的 Caddyfaile 已经能够直接在网站中使用了。
刚才说的一直都是单个域名的网址,那么若是在同一个服务器上部署多个域名的网站呢?很简单,只须要在域名后面跟一个花括号扩起来就能够了,以下:
railgun.moe { gzip log /var/log/caddy/railgun_moe.log tls lengz@lengzzz.com root /var/www/ header /api { Access-Control-Allow-Origin * Access-Control-Allow-Methods "GET, POST, OPTIONS" -Server } fastcgi / 127.0.0.1:9000 php { index index.php } rewrite { to {path} {path}/ /index.php?{query} } } lengzzz.com { tls lengz@lengzzz.com log /var/log/caddy/lengzzz_com.log redir / https://railgun.moe/{uri} 301 }
好了,基本的 caddy 配置就这些,详细的内容能够去官网上看文档学习。