自動化 HTTPS 網站伺服器 - Caddy Server
6 |
這應該是這波 Reverse Proxy 評估的最後一篇,打鐵趁熱,把本次蒐集到的情資一次檢視完。
一樣是分享 HTTPS Nginx Docker 懶人安裝法時有讀者推薦,不沾手實現 HTTPS 的方便選擇 - Caddy Server。
閒扯淡:Caddy 這個命名真的不優,Google 查「Caddy」盡是福斯休旅車,所以,啟動專案前,花點時間取個好 Google 不撞名的代號很重要,別讓菜市場名成為推廣的絆腳石啊! 繼續看,Caddy 是用 GO 寫的,連程式語言的名字也...
Caddy 使用 GO 開發,標榜功能強大達到企業商用等級,且支援自動化 HTTPS 的開源網站伺服器。依 W3Tech 統計,2022/12 在網站伺服器的市佔擠到前十,但僅 0.1% 仍屬小眾選擇:
參考網路教學,我在 Azure VM 裝了 Caddy Docker 容器小玩一下。
先準備 docker-compose.yml 如下:(教學範例還掛了另一個 portainer 容器共用名為 caddy 的網路做展示,我改成只跑 Caddy Server,範例站台則改用 ASP.NET Core 另外執行,屆時 Reverse Proxy 比照 Nginx Proxy Manager 文章走 10.3.0.4 5000 Port)
version: '3.3'
networks:
caddy:
services:
caddy:
image: caddy:latest
restart: unless-stopped
container_name: caddy
ports:
- 80:80
- 443:443
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./site:/srv
- ./caddy_data:/data
- ./caddy_config:/config
networks:
- caddy
volumes:
caddy_data:
external: true
caddy_config:
volumes 要設定一些映對路徑,site、cadd_data、caddy_config 等目錄供 Caddy 寫入設定、 Log、憑證等資料,Reverse Proxy 設定則寫在 Caddyfile,包含 Let's Encrypt 註冊用 Email,以及哪個網域名稱對映到哪個 IP 哪個 Port,超級精簡,沒半句廢話:
{
email email_for_letsencrypt@mail.com
}
my-server.location.cloudapp.azure.com {
reverse_proxy 10.3.0.4:5000
}
短短六行,範例 ASP.NET Core 網站已自動啟用 HTTPS。
不過,使用 Nginx 時要另外設定 X-Forwarded-From 等 Header。查了一下 Caddy 似乎會自動加入不需額外設定。為驗證這點,我改跑以下 Minimal API 聽 5000 Port 檢查 Caddy 帶入的 Header:
using System.Text.Json;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", async (HttpRequest req, HttpResponse resp) => {
//read all request headers and return them as a JSON object
var headers = req.Headers.ToDictionary(h => h.Key, h => h.Value.ToString());
await resp.WriteAsJsonAsync(headers, new JsonSerializerOptions { WriteIndented = true });
});
經實測,Caddy 的確已自動加上 X-Forwarded-For、X-Forwarded-Host、X-Forwarded-Proto 三個 Request Header:
【心得】
Caddy Server 設定 Reverse Proxy 的方法,簡潔到讓人驚豔,也確實能無腦啟用 HTTPS,作為 ASP.NET Core 或一般網站的 Reverse Proxy 非常省事方便。至於缺點,Caddy 在效能上小輸 Nginx,Golang 很強,但用 C 寫的 Nginx 更威,萬夫莫敵。另一方面,Caddy 較年輕,功能及套件不如 Nginx 豐富。若要用在工作上,則還要面對主管或企業主「小眾選擇 vs 主流產品」的質疑。若無前述考量,Caddy 的簡單易用真的很吸引人,能不能用該不該用,看緣份吧。
Comments
# by tommy86
漏了 Traefik
# by Jeffrey
to tommy86,Traefik 又更冷門了,等有機會玩 K8S 再研究
# by Anonymous
traefik 有 1B+ 下載 jc21/nginx-proxy-manager 有 100M+ 下載 caddy 有 100M+ 下載 嗚,坐板凳 話說,Go 語言何時才會有 Brotli 支援啊啊啊啊啊啊
# by Anonymous
在 Linux/BSD 的世界,早就已經有很多人完成前人的困擾 大部份時間,不要說開發自己的一套,窮盡時間去試別人的成品都沒有時間,也沒有意義 先找一套熱門的上線,覺得不好用再試下一套 也因此沉下去的遠比浮上來的多很多 就像 .Net 的 ORM 有了 Entity Framework / Dapper 還要去試昨日的 NHibernate 嗎?
# by achao
traefik 在即將來臨的 3.0 透過 middleware 添加 Brotli 的支援,使用的是翻譯自 google/brotli 專案的 https://github.com/andybalholm/brotli
# by Jeffrey
to Anonymous, 1B+ vs 1M+ 卻沒反映在市佔上的現象很有意思。我的解釋: 1. traefik 是 Docker 世界的原住民,但其他伺服器不一定要裝成容器 2. 有可能用在內部 API,從 Internet 看不到