0. 什麼是 Caddy#
Caddy 伺服器是一個開源的,使用 Golang 編寫,支持 HTTP/2 的 Web 服務端。它使用 Golang 標準庫提供 HTTP 功能。 Caddy 一個顯著的特性是默認啟用 HTTPS。它是第一個無需額外配置即可提供 HTTPS 特性的 Web 伺服器。
以下是基於 Ubuntu 18.04 的安裝說明:
1. 安裝#
你可以直接從 Download Caddy 這裡下載,選擇好的你平台和插件就可以直接下載運行了。
當然,我比較推崇第二種方式,就是使用 https://getcaddy.com/ 的腳本安裝。
官方不推進使用 root
權限來安裝運行 caddy,所以我們直接使用普通用戶權限執行以下命令即可。
$ curl https://getcaddy.com | bash -s personal
Caddy 有個人授權和商業授權,一般個人使用直接用個人授權版本就行。商業授權是需要收費的。如果你需要安裝插件的話,語法如下:
$ bash -s [personal|commercial] [plugin1,plugin2,...] [accessCode1,accessCode2...]
像我需要用到 http.filemanager / http.authz / http.login / http.minify / tls.dns.dnspod
,命令和執行結果如下:
$ curl https://getcaddy.com | bash -s personal http.filemanager,http.authz,http.login,http.minify,tls.dns.dnspod
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 7380 100 7380 0 0 12058 0 --:--:-- --:--:-- --:--:-- 12058
Downloading Caddy for linux/amd64 (personal license)...
Download verification OK
Extracting...
Backing up /usr/local/bin/caddy to /usr/local/bin/caddy_old
(Password may be required.)
Putting caddy in /usr/local/bin (may require password)
Caddy 0.11.0 (non-commercial use only)
Successfully installed
關於插件的說明請參考 Caddy User Guide
2. 運行#
直接在終端腳本中執行 caddy
命令,默認會使用腳本當前目錄作為 web root 的目錄,並且會自動監聽 2015
端口請求,如下:
$ cd ~/home
$ caddy
在瀏覽器中執行 http://localhost:2015/
,就可以用戶目錄下面的文件了。
3. 配置#
3.1 臨時伺服器#
Caddy 的配置文件叫做 Caddyfile,Caddy 不強制你把配置文件放到哪個特定文件夾,默認情況下,把 Caddyfile 放到當前目錄就可以跑起來了,如下:
$ echo 'localhost:8888' >> Caddyfile
$ echo 'gzip' >> Caddyfile
$ echo 'browse' >> Caddyfile
$ caddy
3.2 生成環境配置#
在生產環境使用的時候就不能這麼草率的把配置文件放到當前目錄了,一般情況下會放到 /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 狀態
4. Caddyfile#
基本的安裝配置搞定之後,最重要的就是如何寫 Caddyfile 了。可以直接 vim /etc/caddy/Caddyfile
來修改 Caddyfile,也可以再自己電腦上改好然後 rsync 到伺服器上。如果修改了 Caddyfile 發現沒有生效,是需要執行一下 sudo systemctl restart caddy.service
來重啟 caddy 的。
4.1 Caddyfile 的格式#
Caddyfile 的格式還是比較簡單的,首先第一行必須是網站的地址,例如:
localhost:8080
或
example.com
地址可以帶一個端口號,那麼 caddy 只會在這個端口上開啟 http 服務,而不會開啟 https,如果不寫端口號的話,caddy 會默認綁定 80 和 443 端口,同時啟動 http 和 https 服務。
地址後面可以再跟一大堆指令(directive)。Caddyfile 的基本格式就是這樣,由一個網站地址和指令組成。
4.2 指令#
指令的作用是為網站開啟某些功能。指令的格式有三種,先說一下最簡單的不帶參數的指令比如:
example.com
gzip
第二行的 gzip 就是一個指令,它表示打開 gzip 壓縮功能,這樣網站在傳輸網頁是可以降低流量。
第二種指令的格式是帶簡單參數的指令:
example.com
gzip
log /var/log/caddy/example.com.access.log
tls admin@ example.com.com
root /var/www/
第三行,log 指令會為網站開啟 log 功能,log 指令後的參數告訴 caddy log 文件存放的位置。第四行的 tls 指令告訴 caddy 為網站開啟 https 並自動申請證書,後面的 email 參數是告知 CA 申請人的郵箱。(caddy 會默認使用 let’s encrypt 申請證書並續約)
另外,簡單參數也可能不只一個,比如 redir 指令:
example.com
gzip
log /var/log/caddy/example.com.access.log
tls admin@ example.com.com
root /var/www/
redir / https://lengzzz.com/archive/{uri} 301
上面的 redir 指令帶了三個參數,意思是把所有的請求使用 301 重定向到 https://example.com/archive/xxx
,這個指令在給網站換域名的時候很有用。另外 tls 指令變了,不單單傳 email 一個參數,而是分別傳了證書和私鑰的路徑,這樣的話 caddy 就不會去自動申請證書,而是使用路徑給出的證書了。
在這個例子裡還使用了 {uri} 這樣的佔位符(placeholder),詳細的列表可以在這裡查詢到: https://caddyserver.com/docs/placeholders 。
最後一種指令是帶複雜參數的,這種指令包含可能很多參數,所以需要用一對花括號包起來,比如 header 指令:
example.com
gzip
log /var/log/caddy/example.com.access.log
tls admin@ example.com.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,目前這個版本的 Caddyfile 已經可以直接在網站中使用了。
4.3 多 HOST 網站#
剛才說的一直都是單個域名的網址,那麼如果在同一個伺服器上部署多個域名的網站呢?很簡單,只需要在域名後面跟一個花括號擴起來就可以了,如下:
example.com {
gzip
log /var/log/caddy/railgun_moe.log
tls admin@example.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}
}
}
assets.example.com {
tls lengz@example.com
log /var/log/caddy/assets.example.com.log
redir / https://example.com/{uri} 301
}
到這裡,Caddy 服務已經能跑起來了,基本的 Caddy 配置就這些,更多內容需要到官網文檔去自行學習了。
版本更新#
要升級 Caddy 的版本也很簡單,就跟安裝 Caddy 一樣。
$ curl https://getcaddy.com | bash -s personal
這樣就會自動更新到最新版本的 Caddy 了,更新完記得執行一下 sudo systemctl restart caddy.service
來重啟 caddy。
—EOF—
引用與其他資料