用 Caddy 當伺服器,自動申請 SSL 證書

2018-08-30

Photo is captured from Neon Genesis Evangelion film: "Episode 25': Air / Love is Destructive"

Caddy 是一套用 Golang 撰寫的伺服器,開源並支援各種平台,Caddy 主打讓每個網站都有 SSL 憑證,使用 Caddy 架設網站會自動從 Let’s Encrypt 取得憑證,還會定期續約,真的是很方便,也不需要設定複雜的 SSL 了。

先來抱怨一下,最近搞了個免費的新域名,想說拿來架個站,剛好 GCP 有試用金,開了一台 f1-micro 機型,本來打算用 Oneinstack 的一鍵腳本架設 LNMP 環境,結果編譯了兩次才好不容易成功,編譯結束後還無法用 SSH 連接,還好 GCP 提供用序列埠(Console)方式連回 VM,要用 PHP 時發現該死的 Oneinstack 腳本竟然沒給我裝到 PHP,憤而不用 Oneinstack 腳本架設環境。

安裝

Caddy 的安裝方式很簡單,官方提供一鍵安裝腳本,可以輕鬆就把 Caddy 裝好。

先到 Caddy 的下載頁面選擇自己的伺服器作業系統平台,還有要安裝的擴充套件,然後下面就會產生指令,複製到 Terminal 執行就完成安裝了。

Run 一下 caddy 看有沒有安裝成功,預設會監聽 2015 Port,到瀏覽器輸入 http://localhost:2015 應該會出現 404 not found

1
caddy

設定

Caddy 的設定檔名稱預設為 Caddyfile,可以在執行 Caddy 時加入參數指定設定檔路徑,否則會使用當前目錄下的 Caddyfile 作為設定。

1
caddy -conf=/etc/caddy/Caddyfile

Caddyfile

第一行必須為網站的網址,如果是多個網址綁定在同個空間建議第二種寫法。

1
localhost:80

以下示範簡易 Caddyfile 語法,設定不會太困難,有點像是 nginx.conf 的格式,詳細語法說明請參考官方文件

1
2
3
4
5
6
example.com {
gzip # 啟用 gzip 壓縮功能
root /var/www/ # 指定網站根目錄
tls abc@example.com # 設定 SSL 申請人信箱
log /var/log/caddy/access.log # log 儲存位置
}

瀏覽 example.com 應該就會出現綠色勾勾了,非常簡單。

應用於生產環境

每次啟動 Caddy 都要下指令,但要是離開 Session 就會停止了,當然你可以用 nohup caddy & 來保持一直執行,我個人比較喜歡做成 system service 來管理。

1
2
3
sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service
sudo systemctl daemon-reload # 重新載入 service
sudo systemctl enable caddy # 開機自動啟動

根據 service 的設定,Caddy 設定檔會讀取 /etc/caddy/Caddyfile,要先建立 /etc/caddy 目錄,並將 Caddyfile 放在目錄裡。

1
2
sudo mkdir /etc/caddy
sudo touch /etc/caddy/Caddyfile

Caddy 會將 SSL 證書放在 /etc/ssl/caddy,要先建立此目錄。

1
2
3
sudo mkdir /etc/ssl/caddy
sudo chown -R www-data:root /etc/ssl/caddy
sudo chmod 0770 /etc/ssl/caddy

SSL 目錄裡面放有私鑰,把權限設定成 0770 來禁止其他使用者存取。

可以先啟動 Caddy,看 status 有沒有錯誤訊息。

1
2
sudo systemctl start caddy # 啟動 Caddy
sudo systemctl status caddy # 檢視 Caddy 狀態

若出現 active,那恭喜你,已經成功部署 Caddy 了。

1
2
3
4
5
6
7
8
● caddy.service - Caddy HTTP/2 web server
Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
Active: active (running) since Fri 2018-08-31 09:47:53 UTC; 5s ago
Docs: https://caddyserver.com/docs
Main PID: 25483 (caddy)
Tasks: 7 (limit: 4915)
CGroup: /system.slice/caddy.service
└─25483 /usr/local/bin/caddy -log stdout -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp

GCP 上無法啟動 Caddy

如果在 GCP 架設 Caddy 的話要注意,GCP 因為安全考量,必須要用 root 身分執行 Caddy 才能監聽 80 Port,所以要修改 caddy.service

1
sudo vim /etc/systemd/system/caddy.service

User 的地方改成 root,以 root 身分執行指令,一般的伺服器環境不需要做此設定。

1
2
3
; User and group the process will run as.
User=root
Group=www-data

最後開啟瀏覽器輸入網址應該就能看見你的網頁了。

Reference

分類: #教學/ #Linux

留言: