
本文作者:HelloGitHub-Anthony
眾所周知,Web 服務器是 Web 開發中不可或缺的基礎服務,在開發中經常會用到。耳熟能詳的開源 Web 服務器有久負盛名的 Apache、性能強勁的 Nginx。而我們今天要介紹的開源項目是採用 Go 編寫的 Web 服務端「後起之秀」:Caddy 它擁有下載無需安裝就能用、零配置實現 HTTPS 等特點,從而在強者如雲的 Web 服務器中占據了一席之地。

在這個 HTTPS 必選的時代,Caddy 憑藉無需額外配置自動 HTTPS,分分鐘完成 HTTPS 站點搭建,使它成為了中小型 Web 服務的首選服務器。Caddy 深受開源愛好者們的喜愛,2014 年開源至今共收穫了 3.6 萬顆星。

項目地址:https://github.com/caddyserver/caddy
一、為什麼使用 Caddy ?Caddy 是一個強大的、可擴展的平台,可以為您的站點、服務和應用程序提供服務。
使用 Caddy 可以在 Linux、Mac、Windows 上快速部署 http(s) 站點或反向代理服務。支持:
與傳統的 Nginx 或者 Apache 相比,Caddy 整體只有一個可執行文件,安裝便捷不易出現奇怪的依賴問題,配置文件結構清晰語法簡單易於上手,依託於模塊化架構可以使用 Go 語言快速開發擴展模塊。
下面讓我們上手把玩一番吧。
二、安裝系統環境:Ubuntu 20.04 LTS
Caddy 可以作為一個系統服務安裝,命令:
sudoaptinstall-ydebian-keyringdebian-archive-keyringapt-transport-httpscurl-1sLf'https://dl.cloudsmith.io/public/caddy/stable/gpg.key'|sudotee/etc/apt/trusted.gpg.d/caddy-stable.asccurl-1sLf'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt'|sudotee/etc/apt/sources.list.d/caddy-stable.listsudoaptupdatesudoaptinstallcaddy
注意:這種方式安裝完成後會啟動服務,開機自動啟動。
還可以下載一個可執行文件使用。

命令行執行 caddy version 命令,出現版本信息:
v2.4.6h1:HGkGICFGvyrodcqOOclHKfvJC0qTU7vny/7FhYp9hNw=即為安裝成功!
三、從零完成 HTTPS 站點
下面將演示如何通過 Caddy 完成 HTTPS 站點。只需要 4 步:
Tips 例子用的域名為:caddy.hellogithub.com 修改為你的域名即可。
第一步:安裝,採用上面介紹的命令安裝
第二步:設置域名解析地址,在購買域名的網站設置。如下圖:

設置完生效需要幾分鐘,可通過下面的命令檢查是否生效:
curl"https://cloudflare-dns.com/dns-query?name=caddy.hellogithub.com&type=A"-H"accept:application/dns-json"域名設置生效,返回如下:
{"Status":0,"TC":false,"RD":true,"RA":true,"AD":false,"CD":false,"Question":[{"name":"caddy.hellogithub.com","type":1}],"Answer":[{"name":"caddy.hellogithub.com","type":1,"TTL":592,"data":"107.150.122.176"}]}第三步:創建配置文件 Caddyfile,無需額外的開啟 HTTPS 的設置:
caddy.hellogithub.comrespond"Hello HTTPS!"第四步:啟動,在同一目錄下執行命令:sudo caddy run

Caddy 默認使用執行命令目錄下的 Caddyfile 文件內的配置。
最後,訪問 caddy.hellogithub.com 檢驗效果吧!

這裡將從 Caddy 常用命令開始,再到配置講解,最後會通過一個實際案例來展示如何用 Caddy 配置網站和上線。
4.1 常用命令
Caddy 的原生配置文件使用的是 JSON 格式。但是為了用戶編寫方便它提供了 Caddyfile 作為接口讓用戶可以快速配置站點信息,運行時 Caddy 會自動將 Caddyfile 的配置信息轉為 JSON 配置文件。
Caddyfile 所能提供功能不如 JSON 配置文件強大,但是對於不需要複雜配置的用戶而言完全夠用了。
Caddyfile 的配置指令格式如下:
directive [<matcher>] <args...> { # matcher 代表匹配器,如果提供則該指令將只對 matcher 描述的資源進行響應 subdirective [<args...>] # 子指令}Caddyfile 的文件結構如圖所示:

下面將演示如何用 Caddy 搭建站點,加深理解配置格式和命令使用。
目錄結構:
.├──Caddyfile├──index.html└──public└──HG.html兩個頁面文件 index.html 和 HG.html 的內容如下:
<!--index.html--><!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>HelloWorld!</title></head><body>你好,世界!</body></html><!--HG.html--><!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>HelloGitHub</title></head><body>HelloGitHub</body></html>Caddyfile 配置內容如下:
# 如果本機沒有 wordpress 則注釋這一塊兒的站點配置#:80 { # 部署一個 wordpress 站點# root * /var/www/wordpress# php_fastcgi unix//run/php/php-version-fpm.sock # 配置一個 fastcig 服務# file_server # 配置一個文件服務#}http://localhost:3000 { basicauth /public/* { # 匹配訪問 localhost:3000/public/* 的請求,為其加上登陸保護 HG JDJhJDE0JGEySk9janFMdHlBY2Y0aVdQZklQak9HcmwzNDZhNFg0N3V5Ny9EZkZMZHB1Nkt4ZE5BNGJt # 用戶名 HG 密碼 HelloGitHub,密碼使用 caddy hash-passowrd 指令生成 } root * ./ # 設置當前站點根目錄為當前文件夾,* 表示匹配所有的 request templates file_server { # 配置當前站點為靜態文件服務器,可用於博客系統的搭建 hide .git # 隱藏所有的 .git 文件 }}:4000 { reverse_proxy /public/* http://localhost:3000 # 配置反向代理 # 只會匹配 locahost:4000/public 的請求,轉發到 localhost:3000/public/}在當前目錄輸入:
$caddyrun#啟動Caddy最後,效果如下:
訪問:http://localhost:3000 可以看到頁面展示 「你好,世界!」
訪問:http://localhost:3000/public/HG.html 提示輸入用戶名和密碼,驗證正確後才能看到頁面。
訪問:http://localhost:4000 則會自動跳轉到端口 3000 的頁面
Caddy 除了簡單易懂的配置文件方式,還提供了管理配置的接口。通過這些接口可以輕鬆實現 Web 服務器管理自動化、集成發布等高級功能。

提供的接口和功能:
由於篇幅問題這裡就不再進行演示了,如果您想深入了解可以閱讀 Caddy 的官方文檔。
五、總結看到這裡你應該對 Caddy 有了一些了解,有沒有一種相見恨晚的感覺?
雖然它的性能比不了 Nginx 但如果論上手的難易度,Caddy 甩 Nginx 幾條街!主要是默認開啟 HTTPS 功能太香了,你什麼都不用管就可以免費、快速、輕鬆開啟網站 HTTPS。
最後,如果你想搭建個靜態博客或小站,快去試試 Caddy 吧!香不香只有「吃」過才知道~
這裡是 HelloGitHub 推出的《講解開源項目》系列,為您叩開開源項目的大門。
👆 關注「HelloGitHub」第一時間收到更新👆