企業級的 Web 伺服器非常多,Nginx、Tomcat、Apache、IIS、FastAPI、Flask 等。今天鬆哥再給大家介紹一個開源的 Web 伺服器,這款伺服器具備自動 HTTPS 功能和高度可配置性,它的名字是:Caddy。
Caddy 是一個 Go 編寫的 Web 伺服器,類似於 Nginx,Caddy 提供了更加強大的功能,隨著 v2 版本釋出,Caddy 已經可以作為中小型站點 Web 伺服器的另一個選擇。
相較於 Nginx 來說使用 Caddy 的優勢如下:
自動HTTPS:Caddy 的自動 TLS 功能,讓 HTTPS 變得觸手可及,無需額外配置。
配置簡便性:Caddy 提供了兩種配置方式——簡潔的 Caddyfile 和功能豐富的 JSON 格式。
配置靈活性:透過 JSON API,Caddy 允許實時更新配置,提供了極大的靈活性。
代理能力:Caddy 的 HTTP 反向代理功能強大而靈活。
靜態資源託管:作為靜態檔案伺服器,Caddy 已經證明了其在生產環境中的可靠性和擴充套件性。
全平臺支援:Caddy 支援 Linux、Windows、macOS 等多種作業系統。
高效能:Go 語言的開發背景,保證了 Caddy 的高效效能和記憶體安全。
Caddy 輕量簡單,對新手也比較友好,我們一起來看下 Caddy 的用法吧。
一 安裝
可以直接使用 Linux 裏邊的包管理工具來安裝 Caddy。
例如,在 Ubuntu 中我們可以使用如下命令安裝:
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list sudo apt update sudo apt install caddy
如果是 Redhat 或者是 CentOS 的話,則可以使用如下命令安裝:
yum install yum-plugin-copr yum copr enable @caddy/caddy yum install caddy
當然,這玩意也提供了 Docker 映象,也可以使用 Docker 安裝。
二 配置
Caddy 的配置檔案可以是 JSON 格式或 Caddyfile 格式。
Caddyfile 是一種更加簡潔的文字配置格式,適合快速配置常見的用例。
下面我將重點介紹 Caddyfile 的配置方式。
2.1 Caddyfile 基礎語法
Caddyfile 使用簡單的文字格式,每一行可以包含一個伺服器塊,其中包含域名、TLS 設定和其他指令。伺服器塊以域名開始,後面跟著一系列的指令。
伺服器塊
一個典型的 Caddyfile 伺服器塊如下所示:
javaboy.org { # 配置指令 }
常見指令
這裏有一些常用的指令:
root: 指定網站的根目錄。
tls: 用於自動獲取和管理 TLS/SSL 證書。
proxy: 用於配置反向代理。
rewrite: 用於重寫 URL。
gzip: 開啟 GZIP 壓縮。
auth: 配置基本的身份驗證。
cache: 配置快取設定。
log: 配置日誌輸出。
2.2 示例配置
下面是一個簡單的 Caddyfile 示例,該示例配置了一個網站,並自動為該網站啟用 HTTPS:
javaboy.org { root /var/www/html tls admin@javaboy.org gzip log /var/log/caddy/access.log combined # 反向代理到後端服務 proxy / localhost:8080 { websocket transparent } # 基本身份驗證 auth /admin user:password }
解釋
javaboy.org
: 域名,可以是多個域名,用空格隔開。root /var/www/html
: 指定網站內容所在的目錄。tls admin@example.com
: 為域名自動配置 TLS 證書,並指定用於接收證書通知的電子郵件地址。gzip
: 啟用 GZIP 壓縮。log /var/log/caddy/access.log combined
: 將訪問日誌記錄到指定的檔案中。proxy / localhost:8080
: 將所有請求代理到本地的 8080 埠。websocket
和transparent
分別表示支援 WebSocket 協議和透明代理。auth /admin user:password
: 對/admin
路徑下的資源啟用基本的身份驗證。
2.3 高階配置
Caddy 還支援更復雜的配置,例如使用子塊來進一步細化配置。例如,可以使用 route
子塊來根據請求路徑執行不同的操作:
javaboy.org { root /var/www/html tls admin@javaboy.org # 根據路徑路由請求 route { /static/* { gzip fileserver /var/www/static } /api/* { proxy / localhost:8000 } /* { index index.html } } }
在這個例子中,/static/*
路徑下的請求被直接傳送到 /var/www/static
資料夾,而 /api/*
路徑下的請求被代理到本地的 8000 埠。
2.4 多個伺服器配置
Caddyfile 支援在同一檔案中配置多個伺服器:
javaboy.org { # javaboy.org 的配置 } sub.javaboy.org { # sub.javaboy.org 的配置 }
2.5 動態配置
除了靜態配置檔案之外,Caddy 還支援動態配置,可以透過 HTTP API 來更改配置。這使得你可以根據執行時條件動態調整伺服器行為。
三 最佳實踐
3.1 部署靜態網頁
http://yousite.com { encode gzip # gzip壓縮 root * /var/web/wwwroot # web根目錄 file_server browse # 啟動靜態資源 }
注意,如果配置根目錄下有 index.html 檔案,則會自動部署為靜態網頁,如果沒有則為由 Caddy 提供的檔案共享的瀏覽網頁。
3.2 部署 File_server
yousite.com { root * /var/share #根目錄 file_server browse #啟動web檔案服務 }
3.3 反向代理
yousite.com { reverse_proxy localhost:8082 #反向代理 }
3.4 其他
caddy adapt ## 載入配置檔案 caddy fmt ## 格式化配置 caddy start ## 啟動服務 caddy reload ## 重新部署
四 小結
Caddy 內建了豐富的外掛,例如內建 “file_server”、內建各種負載均衡策略等,這些外掛組合在一起可以實現一些複雜的功能;Caddy 是採用 go 編寫的,官方也給出了詳細的開發文件,相較於 Nginx 來說,Caddy 的外掛開發上手要容易得多;Caddy 本身針對資料儲存、動態後端、配置檔案轉換等都內建了擴充套件介面,這為有特定需求的擴充套件開發打下了良好基礎。
綜合來看目前 Caddy2 的效能損失可接受的情況下,相較於 Nginx 絕對是個絕佳選擇,各種新功能都能夠滿足現代化 Web 站點的需求