將 nginx 調整為 caddy,世界上的網站都與 ssl 做好朋友

nginx 調整為 caddy,免費升級為 SSL 一族

Caddy 目前看起來 bug 還不少,但是設定又十分醋咪話題上也是十分有趣的 http server。

Caddy 最大的優勢是可以自動申請 let's encrypt SSL 的加密,做到完全自動化,免去太多 certbot 申請流程,同時對於 HA 架構,可以達到簡易設定,快速的進行 load balancer 調整。

備註:

本文採用版本為 caddy --version 0.9.5 以免日後大家在看這篇文章的時候,發生許多誤會。

  • Caddy 在開源環境下,也許下個月的時候,就會看到不一樣的內容的改版,請密切注意版本號。
  • 底下有補充說明,為何 Caddy mix Cloudflare 會造成無限循環問題,以及相對解法。

Caddy

一打開首頁,就是一片讚嘆,

The HTTP/2 web server with automatic HTTPS  

支援 http2, 並且為 https 而生的網站服務器,可以很快很方便的幫使用者進行 SSL 加密更新,更特別是設定簡易,可以方便所有類型的開發者(關於這點我持保留態度 ...)

使用方式

一開始最重要的就是 Caddy 的安裝,目前為主尚未有完整的 ubuntu, debian, centOS 套裝管理。

在設定 service 上面,以及安裝上都需要透過 curl / golang 工具進行編譯。

另外一種方式就是透過 Caddy server Download 選擇自己要的客製化項目,選擇自己的 OS 平台,透過 Caddy 官方進行打包下載。

特別要說,Caddy 下載時請各位注意自己的 DNS 服務,要將 DNS Provider 選擇起來,還有將 Advance 的項目都先選擇起來。以免後續需要重新進行 compile 的窘境,下載完成後環境中會很順利的得到一包 tar 檔案。

以我這邊使用 ubuntu 環境為例。

將解開的檔案丟進去 (省略解 tar 的步驟)

/usr/local/bin/caddy

設定,

sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/caddy  

接著透過執行的方式

caddy  

就可以看到成果如下, (當然我相信一開始絕對不會這麼順利,請繼續往下看如何排解問題)

Activating privacy features... done.  

設置設定檔案

在 Caddy server 不太希望使用 root 權限進行任何設置,當然你如果執意要使用 root 我們也是沒有任何法子可以協助。

接著請部分設定,以下是我有進行了

mkdir /etc/caddy/  
touch /etc/caddy/Caddyfile  
mkdir /etc/ss/caddy/  

補充 : 這邊有找到關於 ubuntu 的設定方式, gist

啟動 Caddy server

啟動方式十分簡單,只需要

caddy -conf=/etc/caddy/Caddyfile  

如果執行正確的話,應該會看到結果應該為,(如果第一次執行,會請使用者進行設定 email 輸入,這段其實也可以跳過)

Activating privacy features... done.  
https://blog.caesarchi.com  
http://blog.caesarchi.com  

這樣就大功告成了,恭喜老爺,賀喜夫人,完工完工~

事情絕對沒有這麼簡單

Caddy server 目前還是一個很混亂的局面,在很多地方都還需要進行設定及更新。

特別是文件的部分,這邊特別要說,在 caddy v0.9.x 之後的版本,都需要採用 { } 的方式來進行設定,

例如我這邊的狀態就是,是不是十分簡單輕鬆呢?

https://blog.caesarchi.com {  
  proxy / localhost:2368
}

可是目前其實 caddy 並沒有提供太多 cache 的機制,所以前台的部分,我特別加上了 cloudflare 服務,這段就是一個痛苦的開始。

首先,

  1. 在一開始下載的時候就沒有將 DNS Provider 加入進去,之後就需要自己重新編譯。
  2. 當 dns provider 設定好之後,官方文件的格式實際上是寫這樣子的。caddy tls document
tls [cert key] {  
    protocols min max
    ciphers   ciphers...
    curves    curves...
    clients   [request|require|verify_if_given] clientcas...
    load      dir
    max_certs limit
    key_type  type
    dns       provider
    muststaple
}

聰明的各位會怎麼做?

聰明的我,就跟著這麼做

tls {  
    dns cloudflare
}

https://blog.caesarchi.com {  
  proxy / localhost:2368
}

這樣啟動之後,造成錯誤的結果,顯示 Unknown directive 'dns'

猜猜怎麼說,

It thinks tls is a site address, because you haven't put it in a site block. So it looks like dns is a directive.  

甘霖 ...,文件上這樣說,是叫你把 tls 整個放進去到 domain 裡面,現在跟以前完全不一樣囉,What the funk .

網路上找到的一些 gist 或者舊式的 example 都是雷,請各位不要亂踩。

正確方式,

這樣才是正確,在 caddy 0.9.5 之後,所有的設定都是要 ,要多巢有多巢,總之就是要給他巢起來就是了(這樣的設定跟 nginx 有很大差別嗎?好像也差不多 ...)

https://blog.caesarchi.com {  
  proxy / localhost:2533
  tls {
    dns cloudflare
  }
}

cloudflare 設定方式

如果你是跟我一樣透過 cloudflare DNS 設定 Caddy ,恭喜,你來對地方了,你得到救贖了。

當時遇到一個特別的問題,就是使用 caddy + cloudflare 會導致,ERR_TOO_MANY_REDIRECTS 的問題,找了許久,發現答案藏在一段印度經文當中,

Cara untuk menyelesaikan masalah ini agak mudah. Di dalam tetapan Cloudflare, anda cuma perlu menukar SSL daripada Flexible  kepada Full .  

不知道為什麼如果要使用 caddy & cloudflare,請將 cloudflare 的 SSL 部分,將原本設定的 Flexible 改為 Full

否則,就會跟我一樣 ERR_TOO_MANY_REDIRECTS

甘霖 ... 終於得到救贖了。

Cloudflare 會造成 loop 的原因

特別感謝 @Dennis 補充,

主要造成的原因是 Caddy 預設會很自動的轉向到 https

Dennis 解惑篇

所以問題應該就是在這裡 ... 443(cf) -> 80(caddy) -> 請你改連 443(cf) -> 80(caddy) -> loop ... 
如果是 SSL (Full),那麼 443(cf) 就是對 origin server(443) 才不會造成問題。

後記

整體說起來,經過一些慘慘的經驗之後,其實也沒有這麼難過了。個人還是覺得 caddy 其實很可愛(puik) ,可以透過 proxy 機制設定 Load balancer 機制為 round_robin / random ,而且還有許多外掛模組,例如可以快速將 markdown on the fly 轉譯為 html.

其實還蠻多好用(對我不一定實用)的功能,目前還在實驗中。

畢竟 Apache 稱霸這麼久之後,也才出一個 nginx,大家還是要給 Caddy 一個機會。

說真的, caddy 光是 ssl auto 的功能,我相信很多資訊潮男就會跟上,看到馬上就濕了(眼眶)。

Ref 參考資料

CaesarChi

Web developer, focus on website fullstack, special JavaScript, and love sharing developing experience and communicate with developers. http://about.me/clonn