Gately v0.5.2 發布
2026 年 10 月 20 日
一個公網 IP 只有一個 443,VPN、網站、各類代理都想用它。以前的做法是在前面放 haproxy 或 nginx stream 依網域分流,再在後面放 nginx 做反向代理,三個程式各有一份設定。v0.5.2 讓 Gately 一個程式做完這些事:依網域分流、反向代理、TOTP 登入,而且效能不輸 haproxy + nginx。
SNI 分流:多個服務共用 443
連接埠轉發新增「SNI 分流」模式(來自 Telegram 群組裡的使用者需求,#3):
- 讀取 TLS 握手裡的網域,依網域把整條連線透傳到不同後端,TLS 不在這裡解密,憑證仍放在後端;
- 網域支援精確符合、
*.example.com萬用字元與*;沒有符合、沒有 SNI 或不是 TLS 的連線交給預設目標,沒有預設目標則關閉; - 每條路由單獨設定 PROXY 協定 v1 / v2,後端能取得真實用戶端位址;
- 卡片上顯示每條路由與預設目標收到的連線數。
詳見 連接埠轉發,裡面有一個取代 haproxy 的完整範例。
Web 服務可以取代 nginx
- 分路徑後端:某個路徑前綴送到另一組後端,或只給這個路徑附加請求標頭,相當於 nginx 的
location; - 轉發認證:把認證交給 Authelia 等外部服務,相當於
auth_request,可只保護/admin這樣的路徑; - HTTPS 後端依造訪網域傳送 SNI:後端依 SNI 分流時(例如 frp 的
vhost_https)需要; - 重新導向支援
{host}:https://{host}一條規則就能把所有網域的 HTTP 跳轉到 HTTPS; - 靜態站台:無副檔名網址(VitePress 等)、自訂 404 頁面、回應標頭;
- 修改站台不再重新啟動監聽:已建立的連線(含 WebSocket)不會中斷,統計資料保留,新設定無效時繼續使用舊設定。
對應關係見 Web 服務 裡的「取代 haproxy 與 nginx」。
共用使用者:TOTP 與單一登入
在「Web 服務 → 全域設定」新增共用使用者,可為每個使用者啟用 TOTP 兩步驟驗證(掃描 QR 碼綁定),再設定單一登入網域(例如 example.com),在任一站台登入後同網域站台無需再登入。站台只需勾選「使用共用使用者」。不想再單獨部署 Authelia 的人,可以直接用它。
效能
在同一台機器上、各限制 2 個 CPU 核心、依真實伺服器的設定(90 個網域、PROXY 協定 v2)比較 haproxy + nginx 與 Gately:
| 情境 | haproxy + nginx | Gately |
|---|---|---|
| HTTPS 反向代理,長連線,1 KB 回應 | 14,767 req/s | 26,434 req/s |
| 每個請求新建 TLS 連線 | 2,557 req/s | 3,448 req/s |
| 1 MB 回應 | 1,053 MB/s | 1,585 MB/s |
| SNI 透傳 TLS 資料流 | 2,927 MB/s | 4,962 MB/s |
| SNI 透傳新建連線速率 | 6,334 /s | 6,266 /s |
記憶體方面,Gately 約 110 MB,haproxy 與 nginx 合計約 42 MB。測試方法、完整資料與注意事項見 README。
升級提示
- Docker:拉取新映像檔後重建容器即可;執行檔:替換執行檔後重新啟動。
- v0.5.2 之前的版本不認得 SNI 分流規則。降級前請先停用或刪除這些規則:舊版會把它們當作一般轉發,沒有預設目標的規則在第一個連線到來時會讓程式當掉。
- 接替 haproxy 時,先停止 haproxy 再啟用 Gately 的規則,同一個連接埠只能由一個程式監聽。
有問題或建議,歡迎到 GitHub Issues 或 Telegram 群組 交流。