這是一個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??梢钥闯鯟addy主打易用性,使用配置簡單。并且得益于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樣例如下:
//Caddyfilelocalhost:2015gziplog ./2015.log
Caddy也支持配置多個站點,類似virtualhost的 配置(80端口多路復用):
//Caddyfilefoo.com:80 {log ./foo.loggzip}bar.com:80 {log ./bar.loggzip}為了實現風格上的統一,單一站點也最好配置為如下這種格式(代碼內部稱之為 Server Block):
localhost:2015 {gziplog ./2015.log}這樣Caddyfile的配置文件模板樣式類似于下面這樣:
host1:port {middleware1middleware2 {… …}… …}host2:port {middleware1middleware2 {… …}… …}… …關于middleware,在caddy文檔中有較為詳細的說明和例子。對于caddy這樣一個年輕的開源項目而言,其文檔還算是相對較全的,雖 然現在還不能和nginx、 apache比。
新聞熱點
疑難解答