Cloudflared 綁定正式網域的實際步驟
如果你已經有一個 Flask 網站跑在本機 port,例如 5002,而且網域是放在 Cloudflare 上,那用 Cloudflared 來綁正式網域其實是很方便的做法。它的好處是不用直接把主機的應用程式 port 暴露到公網,也不用自己在主機上處理 HTTPS 憑證,很多細節都能交給 Cloudflare。 整體流程可以拆成幾個步驟...
如果你已經有一個 Flask 網站跑在本機 port,例如 `5002`,而且網域是放在 Cloudflare 上,那用 Cloudflared 來綁正式網域其實是很方便的做法。它的好處是不用直接把主機的應用程式 port 暴露到公網,也不用自己在主機上處理 HTTPS 憑證,很多細節都能交給 Cloudflare。
整體流程可以拆成幾個步驟:先確認網站本機能跑,再建立或使用既有的 tunnel,接著寫好 ingress 設定,最後把正式網域 route 到該 tunnel。
第一步,先確認你的 Flask 或 Gunicorn 服務在本機是正常的。假設網站跑在 `5002`,你至少要先確定這條測試可以通:
curl -I http://127.0.0.1:5002/如果這一步都還沒通,那就不要急著碰 Cloudflared,因為 tunnel 只是在幫你把本機服務對外公開,本機服務本身還是要先正常。
第二步,確認主機上有 `cloudflared`,以及你已經登入或有可用的 tunnel 憑證:
cloudflared --version
ls -la ~/.cloudflared如果你還沒有登入 Cloudflare,可以先做一次:
cloudflared tunnel login登入後 Cloudflared 會幫你取得憑證,後面才能建立 named tunnel 或管理 DNS route。
第三步,如果你還沒有 tunnel,可以先建立一條 named tunnel:
cloudflared tunnel create mygo-tunnel建立完成後,通常會拿到一個 tunnel ID,並且在 `~/.cloudflared/` 裡看到對應的 json 憑證檔。
第四步,設定 `config.yml`。假設你的正式網域要用 `python.tainanoutlook.com` 對到本機 `5002`,設定概念會像這樣:
tunnel: your-tunnel-id
credentials-file: /root/.cloudflared/your-tunnel-id.json
ingress:
- hostname: python.tainanoutlook.com
service: http://127.0.0.1:5002
- service: http_status:404這裡最重要的是 `hostname` 對應正式網域,而 `service` 指向你的本機服務。最後那行 `http_status:404` 是預設 fallback,避免沒有匹配到的流量亂跑。
第五步,把 DNS 記錄 route 到 tunnel。這一步很重要,因為光有 `config.yml` 還不夠,你還需要讓 Cloudflare 知道 `python.tainanoutlook.com` 這個 hostname 應該進哪一條 tunnel:
cloudflared tunnel route dns mygo-tunnel python.tainanoutlook.com執行成功後,Cloudflare 會幫你建立對應的 DNS route。這樣網域流量才會真的進到這條 tunnel。
第六步,啟動 tunnel。你可以先手動測試:
cloudflared tunnel run mygo-tunnel如果你是用 `config.yml`,也常見直接這樣跑:
cloudflared --config /etc/cloudflared/config.yml tunnel run正式環境通常會把它做成 systemd 服務,讓它開機自啟。這樣 Cloudflared 會一直常駐,不需要手動重跑。
第七步,檢查網域是否真的通了。你可以在本機或外部機器直接測:
curl -I https://python.tainanoutlook.com/如果一切正常,應該會看到 `HTTP 200` 或對應的站台回應。若出現 `ERR_NAME_NOT_RESOLVED`,通常是 DNS 還沒同步,或 route 沒設好。若出現 `502`,通常表示 tunnel 通了,但本機應用服務當下沒有正常回應。
另外,有時候你也會看到 HTTP 自動導向 HTTPS,這通常是正常的,因為 Cloudflare 端會幫你處理 TLS。也就是說,使用者最後實際存取的網址多半會是:
https://python.tainanoutlook.com/如果你只是想快速測試,不想先綁正式網域,也可以先用 quick tunnel:
cloudflared tunnel --url http://127.0.0.1:5002這會給你一個 `trycloudflare.com` 的臨時網址,很適合先驗證網站能不能對外打通。不過正式上線時,還是比較建議回到 named tunnel 加正式網域這條路,因為可控性跟穩定性都更好。
實務上,用 Cloudflared 綁正式網域時,最重要的原則有三個。第一,本機網站要先正常。第二,ingress 設定要明確。第三,DNS route 要真的綁到那條 tunnel。只要這三件事都正確,Cloudflared 會是一個非常省事的正式部署方式。尤其對小型 Flask 網站來說,它常常比自己手動搞憑證、開防火牆與做 port 暴露來得輕鬆很多。