網站部署怎麼做:可以用 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,大致概念像這樣:
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 的設定概念通常像這樣:
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,甚至換成其他部署方式,都會容易很多。