緣由
Caddy 是一套
HTTP/2 伺服器,你可以想成跟
Nginx 是同一種角色,但是 Caddy 有一點不一樣的地方就是自動支援 HTTPS 設定,也就是 Caddy 幫網站自動申請
Letsencrypt 憑證,開發者不需要擔心憑證會過期,Caddy 會定期幫忙更換。
Drone 則是一套以
Docker 為基礎的
Continuous Integration 平台。就在上個月 Caddy 發佈了
0.9.5 版本,更新過後,發現
Drone 的 WebSocket 連線會斷線又連線,底下來看看 Caddy 更動了什麼造成 WebSocket 連線失效。
Caddy 預設將 HTTP Timeouts 啟動
在
0.9.5
版本以前,Caddy 預設是沒有將
Timeouts 模組載入,所以只要使用底下設定就可以成功串起 Drone 服務
example.com {
proxy / localhost:8000 {
websocket
transparent
}
}
Drone 預設跑 8000 Port,另外在 Agent 跑 wss 連線
export DRONE_SERVER="wss://example.com/ws/broker"
Caddy 在
0.9.5
版本啟動 Timeouts 模組,也就是沒有支援 long connection,預設值如下
- read: 10s (time spent reading request headers and body)
- header: 10s (time spent reading just headers; not used until Go 1.8 is released)
- write: 20s (starts at reading request body, ends when finished writing response body)
- idle: 2m (time to hold connection between requests; not used until Go 1.8 is released)
也就是每 10 秒就會自動斷線在連線,解決方式也不難,就是把 Timeouts 模組關閉
example.com {
# please comment the timeouts configures
# if caddy server version under 0.9.5
timeouts none
proxy / localhost:8000 {
websocket
transparent
}
}
這樣就可以解決 Drone 搭配 Caddy 0.9.5 版本的問題,請注意
timeouts
只支援
0.9.5
以上版本,非此版本就會出現底下錯誤
Parse error: unknown property ‘timeouts’
結論
大家可以盡快更新 Caddy,因為在
0.9.5
版本強化了 Proxy 效能。更多更新可以直接參考
Release Notes。