
據(jù)Netcraft今年5月份放出了一篇統(tǒng)計(jì)文章中,Apache、Nginx和微軟的IIS分別以45.61%、20.22%和7.83%市場(chǎng)占有率依然排在“活躍網(wǎng)站所使用Web服務(wù)器市場(chǎng)份額”的前三甲。

但是在走勢(shì)圖中,我們儼然也感覺到其他Web服務(wù)器正在悄悄集結(jié),通過自己不斷的創(chuàng)新和優(yōu)化來威脅著霸主們的地位。這其中,一個(gè)已經(jīng)剛滿2歲的家族小成員非常起眼,他就是有著“云計(jì)算時(shí)代的C語言”之稱的Go語言所編寫的Caddy。

Caddy是什么?在Caddy的官網(wǎng)上給出一個(gè)最簡(jiǎn)單的介紹:“Caddy是一個(gè)能自動(dòng)創(chuàng)建HTTPS功能的HTTP/2網(wǎng)站服務(wù)器”。簡(jiǎn)單的一句話,突出了兩大賣點(diǎn),“自動(dòng)創(chuàng)建HTTPS”和“HTTP/2”。申請(qǐng)過HTTPS數(shù)字證書的人應(yīng)該都知道,要部署一個(gè)HTTPS站點(diǎn),需要走多少流程和提交多少資料,而且數(shù)字證書的年費(fèi)價(jià)格不菲(屌絲想法),但是我要告訴你,這些,對(duì)于Caddy來說,都是自動(dòng)操作的,而且重點(diǎn)是,上面這句話里沒有體現(xiàn)出來,就是數(shù)字證書是免費(fèi)的!免費(fèi)的!免費(fèi)的!重要的事情說三遍,具體怎么個(gè)實(shí)現(xiàn),在下面介紹特性時(shí)會(huì)詳細(xì)講解給大家。
Caddy的作者是來自美國的Matthew Holt,因?yàn)槭怯肎o語言開發(fā)的,所以Caddy天生里就帶著高并發(fā)的基因。據(jù)國內(nèi)技術(shù)人士測(cè)試,其同時(shí)并發(fā)數(shù)優(yōu)于Apache,略低于Nginx?!?b>幾乎所有的功能在Caddy里的都是插件”,這是Matthew Holt對(duì)他的孩子的另一種詮釋,“HTTP服務(wù)器是插件,高級(jí)的TLS特性也是插件,每一行命令實(shí)現(xiàn)的功能都是一個(gè)插件”。自始至終,Caddy就是一個(gè)內(nèi)心強(qiáng)大,勇于挑戰(zhàn)新事物的探險(xiǎn)家,這完全得益于他的作者對(duì)互聯(lián)網(wǎng)產(chǎn)品的深刻認(rèn)知與理解。
一、運(yùn)行
1.1 默認(rèn)運(yùn)行
廢話不多說,我們先看看Caddy是怎樣運(yùn)行的。命令行里輸入:
caddy
就是這么簡(jiǎn)單,在沒有任何配置信息的情況下,Caddy會(huì)為你默認(rèn)打開2015端口,呈現(xiàn)出一個(gè)404不存在的頁面。
1.2 Caddyfile配置運(yùn)行
如果需要配置更多信息,而也只需要一個(gè)Caddyfile配置文件。配置文件格式如下:
stozen.net ? # Your site's address
ext .html ? # Clean URLs
errors error.log { ? ? ? # Error log
404 error-404.html ? # Custom error page
}
# PHP backend
fastcgi /blog localhost:9000 php
# API load balancer
proxy /api localhost:5001 localhost:5002
配置說明:
- stozen.net:網(wǎng)站綁定的域名
- ext:文件擴(kuò)展名隱藏功能。此處如果訪問/user地址,實(shí)質(zhì)訪問的是/user.html
- errors:記錄錯(cuò)誤日志的地址,并配置不同錯(cuò)誤狀態(tài)返回到客戶端的錯(cuò)誤頁面
- fastcgi:支持fastcgi代理方式訪問PHP站點(diǎn)
- proxy:支持反向代理和負(fù)載均衡
在Caddyfile所在路徑里執(zhí)行caddy命令,站點(diǎn)便輕松運(yùn)行。是不是比Apache和Nginx配置方便多了?
1.3 更快速的運(yùn)行
在我們測(cè)試階段,可以直接使用命令行參數(shù)的方式運(yùn)行,無需`Caddyfile`,直接綁定域名。
caddy -host stozen.net
夠簡(jiǎn)單吧?如果你覺得還不夠,我再舉些Caddy的特性功能。
二、特性
2.1 通用功能
Caddy通過Caddyfile來配置你的站點(diǎn),簡(jiǎn)單直觀,剛才我們已經(jīng)見識(shí)到了。默認(rèn)情況下,Caddy支持純靜態(tài)站點(diǎn),當(dāng)然,你如果使用了它自帶的模板插件,反向代理功能或FastCgi等其他插件,還可是運(yùn)行動(dòng)態(tài)網(wǎng)站。Caddy有自己的命令行(Command Cli),可以快速配置站點(diǎn)運(yùn)行。Caddy支持多核處理,Go語言里的goroutine技術(shù)讓Caddy能處理更多的并發(fā)請(qǐng)求。在Caddy啟動(dòng)和關(guān)閉的時(shí)候,你還可以設(shè)置相應(yīng)的系統(tǒng)命令去運(yùn)行,這對(duì)于系統(tǒng)運(yùn)維工程師來說絕對(duì)是非常友好的。Caddy的日志功能也相當(dāng)強(qiáng)大,可以自定義日志格式,可以將日志輸出到文件、stdout/stderr里,或者本地和遠(yuǎn)程的系統(tǒng)日志里。更方便的是,當(dāng)Caddy的日志文件非常大時(shí),Caddy會(huì)自動(dòng)分割日志文件并移動(dòng)它,這對(duì)于合理分配磁盤資源非常有用。最特別的就是Caddy完全依賴于插件,所有的服務(wù)器類型、指令、DNS providers都是插件,插件可以通過Go語言方便實(shí)現(xiàn)。
2.2 部署特性
Caddy就是一個(gè)單獨(dú)二進(jìn)制文件,沒有任何依賴,甚至連libc都不需要。天生的跨平臺(tái)支持,支持各大Linux、windows發(fā)行版本,甚至連Android也能穩(wěn)定運(yùn)行。當(dāng)然,你也可以在Docker鏡像里安裝Caddy,讓站點(diǎn)開發(fā)更DevOps化。
2.3 安全特性
支持TLS傳輸協(xié)議,考慮客戶端覽器兼容性的情況下,讓用戶的信息傳輸更安全。采用了TLS的擴(kuò)展技術(shù)SNI,解決了一個(gè)服務(wù)器使用多個(gè)域名和證書的問題。對(duì)于網(wǎng)絡(luò)切換后的用戶Session認(rèn)證更加智能,使用了TLS session ticket的方式,當(dāng)用戶網(wǎng)絡(luò)或服務(wù)器后臺(tái)地址變化的情況下,連接請(qǐng)求依然有效。
Caddy能夠自動(dòng)獲取Let's Encrypt的證書,此證書是免費(fèi)獲取的,但是有效期只有一個(gè)月。Caddy能自動(dòng)對(duì)證書進(jìn)行續(xù)訂,達(dá)到了證書永久有效的效果。官方自豪的說,Caddy是第一個(gè)實(shí)現(xiàn)此技術(shù)的Web服務(wù)器。
2.4 HTTP服務(wù)器特性
支持網(wǎng)站文件目錄瀏覽功能,支持Gzip文件壓縮功能,支持網(wǎng)站響應(yīng)超時(shí)功能,支持單服務(wù)器下多虛擬站點(diǎn)功能。對(duì)Markdown靜態(tài)文件天然支持,能將Markdown頁面自動(dòng)轉(zhuǎn)換成HTML頁面返回給瀏覽器。后端支持模板技術(shù),動(dòng)態(tài)生成網(wǎng)站內(nèi)容。Caddy支持HTTP/2服務(wù)端推送技術(shù),支持HTTP網(wǎng)站基礎(chǔ)認(rèn)證功能,重定向功能,修改Header頭部信息功能。像Nginx一樣,Caddy也支持反向代理和負(fù)載均衡技術(shù),對(duì)Websocket的代理技術(shù),也一樣支持很好。其他的,包含隱藏路由擴(kuò)展名,路徑重寫,自定義MIME類型等,都是非常好用的一些特性。
三、iPhone vs Caddy
像喬布斯創(chuàng)造的iPhone一樣,Caddy屬于外表設(shè)計(jì)時(shí)尚簡(jiǎn)單,用戶操作簡(jiǎn)單,但是內(nèi)部功能十分強(qiáng)大的產(chǎn)品。插件功能類似iPhone里的一個(gè)個(gè)應(yīng)用,能給用戶帶來不同的體驗(yàn)和便捷。一句話,簡(jiǎn)約而不簡(jiǎn)單,值得用戶研究并應(yīng)用在自己的站點(diǎn)中。
說到最后,文章中只是簡(jiǎn)單的闡述了Caddy的一些特性功能,如果你想更多的了解它并應(yīng)用在站點(diǎn)中,可以研究下Caddy的官網(wǎng)源碼(https://github.com/caddyserver/website),官網(wǎng)使用了Caddy+Hugo等技術(shù)搭建,歡迎你也加入使用Caddy的隊(duì)列!