Caddy – 方便夠用的 HTTPS server 新手教程

安全劍客發表於2019-04-07
最近發現了一個 golang 開發的 HTTP server,叫做 Caddy,它配置起來十分簡便,甚至可以 28 秒配置好一個支援 http2 的 server ,而且對各種 http 新特性都支援的比較早(比如 http2、quic都有支援)。

Caddy – 方便夠用的 HTTPS server 新手教程Caddy – 方便夠用的 HTTPS server 新手教程

安裝

用過 golang 的應該都知道,golang 程式基本上不會有各種依賴,都是光禿禿一個可執行程式,cp 到  /usr/local/bin 就算安裝完成了,所以說安裝 caddy 是很簡單的,我給出三種方法。

指令碼安裝

curl -s https://getcaddy.com | bash

caddy 官方給出了一個安裝指令碼,執行上面的命令就可以一鍵安裝 caddy,等執行結束後,使用  which caddy ,可以看到 caddy 已經被安裝到了 /usr/local/bin/caddy

手動安裝

https://caddyserver.com/download  點這個連結進入到 caddy 官網的下載介面,網頁左側可以選擇平臺和外掛,如果在  Linux  伺服器上使用的話,platform 選擇 Linux 64-bit 就可以了,plugins 如果暫時不需要的話,可以不選。然後點選下面的 DOWNLOAD 按鈕,就下載到 caddy 了。同理,解壓之後用 cp 命令放到  /usr/local/bin/caddy  就完成了安裝。

Caddy – 方便夠用的 HTTPS server 新手教程Caddy – 方便夠用的 HTTPS server 新手教程

原始碼安裝

go get github.com/mholt/caddy/caddy

對於安裝了 golang 編譯器的同學,只需要執行 go get 就能到 $GOPATH/bin 裡,是否 cp 到  /usr/local/bin  裡就看心情了。使用原始碼安裝可以安裝到最新版本的 caddy,功能上一般是最新的,而且因為是本地編譯,效能可能會稍微高一些,但是可能會存在不穩定的現象。

配置

臨時檔案伺服器

Caddy 的配置檔案叫做  Caddyfile ,Caddy 不強制你把配置檔案放到哪個特定資料夾,預設情況下,把 Caddyfile 放到當前目錄就可以跑起來了,如下:

echo 'localhost:8888' >> Caddyfile
echo 'gzip' >> Caddyfile
echo 'browse' >> Caddyfile
caddy

在隨便一個目錄裡執行上面程式碼,然後在瀏覽器裡開啟  http://localhost:8888  發現 caddy 已經啟動了一個檔案伺服器。當臨時需要一個 fileserver 的時候(比如共享檔案),使用 caddy 會很方便。

生產環境使用

當然了,在生產環境使用的時候就不能這麼草率的把配置檔案放到當前目錄了,一般情況下會放到  /etc/caddy  裡。

sudo mkdir /etc/caddy
sudo touch /etc/caddy/Caddyfile
sudo chown -R root:www-data /etc/caddy

除了配置檔案,caddy 會自動生成 ssl 證照,需要一個資料夾放置 ssl 證照。

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

因為 ssl 資料夾裡會放置私鑰,所以許可權設定成 770 禁止其他使用者訪問。

最後,建立一下放置網站檔案的目錄,如果已經有了,就不需要建立了。

sudo mkdir /var/www
sudo chown www-data:www-data /var/www

建立好這些檔案和目錄了之後,我們需要把 caddy 配置成一個服務,這樣就可以開機自動執行,並且管理起來也方便。因為目前大多數發行版都使用 systemd 了,所以這裡只講一下如何配置 systemd,不過 caddy 也支援配置成原始的 sysvinit 服務,具體方法 看這裡

sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service # 從 github 下載 systemd 配置檔案
sudo systemctl daemon-reload # 重新載入 systemd 配置
sudo systemctl enable caddy.service # 設定 caddy 服務自啟動
sudo systemctl status caddy.service # 檢視 caddy 狀態

Caddyfile

基本的安裝配置搞定之後,最重要的就是如何寫 Caddyfile了。可以直接  vim /etc/caddy/Caddyfile  來修改 Caddyfile,也可以再自己電腦上改好然後 rsync 到伺服器上。如果修改了 Caddyfile 發現沒有生效,是需要執行一下  sudo systemctl restart caddy.service  來重啟 caddy 的。

Caddyfile 的格式

Caddfile的格式還是比較簡單的,首先第一行必須是網站的地址,例如:

localhost:8080或lengzzz.com

地址可以帶一個埠號,那麼 caddy 只會在這個埠上開啟 http 服務,而不會開啟 https,如果不寫埠號的話,caddy 會預設繫結 80 和 443 埠,同時啟動 http 和 https 服務。

地址後面可以再跟一大堆指令(directive)。Caddyfile 的基本格式就是這樣,由一個網站地址和指令組成,是不是很簡單。

指令

指令的作用是為網站開啟某些功能。指令的格式有三種,先說一下最簡單的不帶引數的指令比如:

railgun.moe # 沒錯,moe字尾的域名也可以哦 gzip

第二行的 gzip 就是一個指令,它表示開啟 gzip 壓縮功能,這樣網站在傳輸網頁是可以降低流量。

第二種指令的格式是帶簡單引數的指令:

railgun.moe gzip log /var/log/caddy/access.log tls lengz@lengzzz.com root /var/www/

第三行,log 指令會為網站開啟 log 功能,log 指令後的引數告訴 caddy log 檔案存放的位置。第四行的 tls 指令告訴 caddy 為網站開啟 https 並自動申請證照,後面的 email 引數是告知 CA 申請人的郵箱。(caddy 會預設使用 let's encrypt 申請證照並續約,很方便吧)

另外,簡單引數也可能不只一個,比如 redir 指令:

railgun.moe
gzip
log /var/log/caddy/access.log
tls /etc/ssl/cert.pem /etc/ssl/key.pem
root /var/www/
redir / https://lengzzz.com/archive/{uri} 301

上面的 redir 指令帶了三個引數,意思是把所有的請求使用 301 重定向到  https://lengzzz.com/archive/xxx ,這個指令在給網站換域名的時候很有用。另外 tls 指令變了,不單單傳 email一個引數, 而是分別傳了證照和私鑰的路徑,這樣的話 caddy 就不會去自動申請證照,而是使用路徑給出的證照了。

在這個例子裡還使用了  {uri}  這樣的佔位符(placeholder),詳細的列表可以在這裡查詢到: https://caddyserver.com/docs/placeholders

最後一種指令是帶複雜引數的,這種指令包含可能很多引數,所以需要用一對花括號包起來,比如 header 指令:

railgun.moe
gzip
log /var/log/caddy/access.log
tls lengz@lengzzz.com
root /var/www/
header /api { Access-Control-Allow-Origin *
Access-Control-Allow-Methods "GET, POST, OPTIONS"
-Server
}
fastcgi / 127.0.0.1:9000 php {
index index.php
}
rewrite {
to {path} {path}/ /index.php?{query}
}

6-10 行的 header 指令代表為所有的 /api/xxx 的請求加上 Access-Control-Allow-Origin 和 Access-Control-Allow-Methods 這兩個 header,從而能支援 javascript 跨域訪問 ,第 9 行代表刪除 Server header,防止別人看到伺服器型別。

11-13 行使用了 fastcgi 指令,代表把請求通過 fastcgi 傳給 php,ruby 等後端程式。

14-15 行,使用了 rewrite 指令,這個指令的作用是  伺服器內部重定向  在下面的引數  to  後面,又跟了三個引數,這個功能上有點類似 nginx 的  try_files  。告訴 caddy 需要先檢視網址根目錄 /var/www 裡有沒有 {path} 對應的檔案,如果沒有再檢視有沒有 {path} 對應的目錄,如果都沒有,則轉發給 index.php 入口檔案。這個功能一般會用在 PHP 的 MVC 框架上使用。

隨著一步步完善這個 Caddyfile,目前這個版本的 Caddyfaile 已經可以直接在網站中使用了。

多 HOST 網站

剛才說的一直都是單個域名的網址,那麼如果在同一個伺服器上部署多個域名的網站呢?很簡單,只需要在域名後面跟一個花括號擴起來就可以了,如下:

railgun.moe {
gzip
log /var/log/caddy/railgun_moe.log
tls lengz@lengzzz.com
root /var/www/
header /api {
Access-Control-Allow-Origin *
Access-Control-Allow-Methods "GET, POST, OPTIONS"
-Server
}
fastcgi / 127.0.0.1:9000 php {
index index.php
}
rewrite {
to {path} {path}/ /index.php?{query}
}
}
lengzzz.com { tls lengz@lengzzz.com
log /var/log/caddy/lengzzz_com.log
redir / https://railgun.moe/{uri} 301
}

好了,基本的 caddy 配置就這些,詳細的內容可以去官網上看文件學習。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2640536/,如需轉載,請註明出處,否則將追究法律責任。

相關文章