Flask + SQLite

Python 建立網站使用心得站

整理用 Python 建網站的經驗、踩坑與實作心得,讓安裝、環境、Flask 與部署實作更容易上手。

閱讀方向

從環境建置開始,逐步整理 Flask、虛擬環境、套件管理與實戰心得。

網站管理員 ・ 2026-03-31 15:48:43 ・ 約 6 分鐘

網站部署怎麼做:可以用 Nginx Proxy,也可以用 Cloudflared

當網站在本機已經可以正常跑起來之後,下一步通常就是部署。所謂部署,簡單說就是讓外部使用者可以透過網域或公開網址連到你的網站。對小型 Python 網站來說,我自己覺得最常見、也最實用的方式,大概可以分成兩種:一種是用 Nginx 做 reverse proxy,另一種是用 Cloudflared 把本機服務安全地對外公開。 這兩種方式都能...

當網站在本機已經可以正常跑起來之後,下一步通常就是部署。所謂部署,簡單說就是讓外部使用者可以透過網域或公開網址連到你的網站。對小型 Python 網站來說,我自己覺得最常見、也最實用的方式,大概可以分成兩種:一種是用 Nginx 做 reverse proxy,另一種是用 Cloudflared 把本機服務安全地對外公開。

這兩種方式都能讓外部使用者連到你的 Flask 網站,但它們的思路不太一樣。Nginx 比較像是傳統主機部署路線,你自己管理主機上的 Web Server、port、反向代理與憑證。Cloudflared 則比較像是把本機服務透過 Cloudflare Tunnel 對外發布,省掉很多防火牆開 port、憑證與公開 IP 的細節。

如果先講 Nginx 的做法,基本概念是這樣:你的 Python 專案通常不會直接讓外部流量打到 Gunicorn,而是先讓 Gunicorn 只監聽本機或特定 port,再由 Nginx 接收 `80` 或 `443` 的流量,然後轉送到 Gunicorn。這是很常見也很穩定的架構。

例如你的 Flask 網站跑在 `5002`,Gunicorn 啟動方式可能會是:

/root/projects/news/venv/bin/gunicorn -w 4 -b 0.0.0.0:5002 app:app

接著在 Nginx 裡可以配置一段 reverse proxy,大致概念像這樣:

nginx
server {
    listen 80;
    server_name python.tainanoutlook.com;

    location / {
        proxy_pass http://127.0.0.1:5002;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

這樣外部使用者打到 `python.tainanoutlook.com`,流量就會先進 Nginx,再由 Nginx 轉到你的 Gunicorn 服務。這種方式的優點是控制權高、結構清楚,也很適合一台主機上同時掛很多不同網站。缺點是你要自己處理憑證、Nginx 設定、重載、DNS 與防火牆規則。

如果你要上 HTTPS,傳統做法通常還會搭配 Certbot 申請 Let's Encrypt 憑證。也就是說,Nginx 路線雖然穩定,但部署細節會稍微多一些。你要懂 Nginx、懂 server block、懂憑證更新與 proxy header。對有經驗的人來說這不是問題,但如果你只是想快點把站放出去,Cloudflared 會更省事。

Cloudflared 的思路就不太一樣了。它不是把主機 port 直接暴露在公網上,而是由本機的 `cloudflared` 主動跟 Cloudflare 建立 tunnel,再把指定的 hostname 導回你的本機服務。這樣做的好處是你不一定要額外開對外 port,也不需要自己在主機上處理 HTTPS 憑證,因為 TLS 會由 Cloudflare 端處理。

如果你的網站是在 `5002`,Cloudflared 的設定概念通常像這樣:

yaml
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

設好之後,再透過 Cloudflare 把 `python.tainanoutlook.com` 這筆 DNS route 到該 tunnel,就能讓外部使用者直接透過網域連到你的本機網站。這種方式很適合你已經在用 Cloudflare、而且想簡化公開流程的情況。

如果是 quick tunnel,也可以暫時這樣測:

cloudflared tunnel --url http://127.0.0.1:5002

這會先產生一個臨時網址,讓你快速測試網站能不能對外連線。不過如果要正式上線,還是比較建議使用 named tunnel,並且綁自己的正式網域。

Cloudflared 的優點很明顯。第一,它部署很快。第二,不用自己處理 HTTPS 憑證。第三,不需要把應用程式 port 直接暴露在外網。第四,如果你已經在用 Cloudflare,整體整合會很順。缺點則是你會依賴 Cloudflare 這一層,而且如果你比較習慣完全掌控本機的 Web Server 路由規則,Cloudflared 的自由度沒有 Nginx 那麼高。

所以該選哪一種?如果你想要的是比較傳統、主機自管、可細緻調整,而且未來可能會搭更多自定義規則,那 Nginx reverse proxy 是很合理的選擇。如果你要的是快速、簡單、外網安全導出,而且你本來就有 Cloudflare 網域,那 Cloudflared 通常會更省事。

以小型 Flask 網站來說,我自己的想法是這樣:如果你只是要快速上線內容站、後台站、管理工具或 API,Cloudflared 其實很夠用,速度也快。如果你未來會在同一台主機上長期維護很多網站,並且想統一做路由、快取、Rewrite 或更細緻的轉發規則,那 Nginx 會更適合。

不管你選哪一種,核心原則都差不多:你的 Flask 專案先用 Gunicorn 或其他 WSGI 服務穩定跑起來,再決定外部流量要怎麼接進來。也就是說,應用程式本身和對外入口要分開思考。只要這一點抓住了,你之後要改成 Nginx、Cloudflared,甚至換成其他部署方式,都會容易很多。

回首頁