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

最近發現了一個 golang 開發的 HTTP server,叫作 Caddy,它配置起來十分簡便,甚至能夠 28 秒配置好一個支持 http2 的 server ,並且對各類 http 新特性都支持的比較早(好比 http二、quic都有支持)。

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

 

安裝

 

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

腳本安裝" data-anchor-id="vca7">php

腳本安裝

 

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

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

 

 

手動安裝

 

https://caddyserver.com/download 點這個連接進入到 caddy 官網的下載界面,網頁左側能夠選擇平臺和插件,若是在 Linux 服務器上使用的話,platform 選擇 Linux 64-bit 就能夠了,plugins 若是暫時不須要的話,能夠不選。而後點擊下面的 DOWNLOAD 按鈕,就下載到 caddy 了。同理,解壓以後用 cp 命令放到 /usr/local/bin/caddy 就完成了安裝。linux

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

 

 

源碼安裝

 

 
go get github.com/mholt/caddy/caddy

對於安裝了 golang 編譯器的同窗,只須要執行 go get 就能到 $GOPATH/bin 裏,是否 cp 到 /usr/local/bin 裏就看心情了。使用源碼安裝能夠安裝到最新版本的 caddy,功能上通常是最新的,並且由於是本地編譯,性能可能會稍微高一些,可是可能會存在不穩定的現象。nginx

 

 

配置

 

 

 

臨時文件服務器

 

Caddy 的配置文件叫作 Caddyfile,Caddy 不強制你把配置文件放到哪一個特定文件夾,默認狀況下,把 Caddyfile 放到當前目錄就能夠跑起來了,以下:git

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

在隨便一個目錄裏執行上面代碼,而後在瀏覽器裏打開 http://localhost:8888 發現 caddy 已經啓動了一個文件服務器。當臨時須要一個 fileserver 的時候(好比共享文件),使用 caddy 會很方便。github

 

生產環境使用

 

固然了,在生產環境使用的時候就不能這麼草率的把配置文件放到當前目錄了,通常狀況下會放到 /etc/caddy 裏。golang

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

除了配置文件,caddy 會自動生成 ssl 證書,須要一個文件夾放置 ssl 證書。vim

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 配置就這些,詳細的內容能夠去官網上看文檔學習。

相關文章
相關標籤/搜索