关于web:Caddy-一个用Go实现的Web-Server

38次阅读

共计 1894 个字符,预计需要花费 5 分钟才能阅读完成。

这是一个 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 比。

正文完
 0