这是一个Web Server的时代,apache2与nginx共舞,在谋求极致性能的路上,没有最高,只有更高。但这又是一个谋求个性化的时代,有些Web Server并没有去挤“Performance晋升”这一独木桥,而是有着本人的定位,Caddy就是这样一个开源Web Server。

Caddy的作者Matt Holt在caddy官网以及FAQ中对caddy的指标阐释如下: 其余Web Server为Web而设计,Caddy为human设计。功能定位上,与常常充当最前端反向代理的nginx不同,caddy致力于成为一个易用的动态 文件Web Server。能够看出Caddy主打易用性,应用配置简略。并且得益于Go的跨平台个性,caddy很容易的反对了三大支流平台:Windows、 Linux、Mac。在Caddy开发者文档中,咱们能够看到caddy还能够在Android(linux arm)上运行。caddy目前版本为0.7.1,还不稳固,且后续版本可能变动较大,甚至与后期版本不兼容,因而作者目前不举荐caddy在生产环境被 重度应用。

关注caddy,是因为caddy填补了go在通用web server这块的空白(兴许有其余,但我还不晓得),同时Web server in go也“响应”了近期Golang去C化的趋势(Go 1.5中C is gone!),即使caddy作者提到caddy的指标并非如nginx那样。但将来谁晓得呢?一旦Go性能足够高时,一旦caddy足够稳固时,天然而 然的就会有人将其用在某些利用的生产环境中代替nginx或apache2了。一套全Go的零碎,在部署、运维方面也是有劣势的。

一、装置和运行caddy

和诸多go利用一样,咱们能够间接从caddy的github.com releases页中找到最新公布版(目前是0.7.1)的二进制包。这里应用的是caddy_darwin_amd64.zip。

下载解压后,进入目录,间接执行./caddy即可将caddy运行起来。

$caddy
0.0.0.0:2015

在浏览器里拜访localhost:2015,页面上没有预期显示的相似"caddy works!”之类的默认Welcome页面,而是“404 Not Found"。尽管这阐明caddy曾经work了,但没有一个default welcome page毕竟对于caddy beginer来说并不敌对。这里曾经向作者提了一个sugguestion issue。

二、caddy原理

Go的net/http规范库曾经提供了http server的实现,大多数场合这个http server都能满足你的须要,无论是性能还是性能。Caddy本质上也是一个Go web app,它也import net/http,嵌入*http.Server,并通过handler的ServeHTTP办法为每个申请提供服务。caddy应用 http.FileServer作为解决 动态文件的根底。caddy的迷人之处在于其middleware,将诸多middleware串成一个middleware chain以提供了灵便的web服务。另外caddy中的middleware还能够独立于caddy之外应用。

caddy从当前目录的Caddyfile(默认)文件中读取配置,当然你也能够通过-conf指定配置文件门路。Caddyfile的配置格局 确实十分easy,这也合乎caddy的指标。

Caddyfile总是以站点的Addr开始的。

繁多站点的Caddyfile样例如下:

//Caddyfile
localhost:2015
gzip
log ./2015.log

Caddy也反对配置多个站点,相似virtualhost的 配置(80端口多路复用):

//Caddyfile
foo.com:80 {
log ./foo.log
gzip
}

bar.com:80 {
log ./bar.log
gzip
}

为了实现格调上的对立,繁多站点也最好配置为如下这种格局(代码外部称之为 Server Block):

localhost:2015 {
gzip
log ./2015.log
}

这样Caddyfile的配置文件模板款式相似于上面这样:

host1:port {
middleware1
middleware2 {
… …
}
… …
}

host2:port {
middleware1
middleware2 {
… …
}
… …
}
… …

对于middleware,在caddy文档中有较为具体的站长博客阐明和例子。对于caddy这样一个年老的开源我的项目而言,其文档还算是绝对较全的,虽 然当初还不能和nginx、 apache比。