−25%

Windows 年繳方案適用,至 10 月 31 日。 檢視方案

EQVPS
開始使用

如何設定帶 HTTPS 的 nginx 反向代理

在任何監聽本機埠的應用前面放上乾淨的網域和自動 HTTPS。兩種方式:nginx 搭配 Certbot,或用 Caddy 一行實作自動 TLS。分步講解,附可複製的設定。

大多數自託管應用監聽像 127.0.0.1:3000 這樣的本機埠,講的是明文 HTTP。反向代理站在前面的 80/443 埠,用一張真憑證終結 HTTPS,並把流量轉發到那個本機埠——給您一個乾淨的 https://app.yourdomain.com,並讓您在一個 IP 後面執行多個應用。下面是兩種常見方式。

前提

  • 一個網域,其 A 記錄指向您伺服器的 IP(等待 DNS 傳播)。
  • 埠 80 和 443 開放——見如何設定 UFW 防火牆。
  • 您的應用在本機執行,例如在 127.0.0.1:3000。

方式 A — Caddy(自動 HTTPS,一行)

sudo apt install -y caddy
echo 'app.yourdomain.com { reverse_proxy 127.0.0.1:3000 }' | sudo tee /etc/caddy/Caddyfile
sudo systemctl restart caddy

就這樣——Caddy 為該網域取得一張 Let's Encrypt 憑證並自動續期。

方式 B — nginx + Certbot

sudo apt install -y nginx certbot python3-certbot-nginx

建立 /etc/nginx/sites-available/app:

server {
    listen 80;
    server_name app.yourdomain.com;
    location / {
        proxy_pass http://127.0.0.1:3000;
        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;
    }
}

啟用它並加上 HTTPS:

sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d app.yourdomain.com

Certbot 會改寫設定以提供 HTTPS 並設定自動續期。

誠實的提醒

  • DNS 和埠是常見的失敗點。 A 記錄必須指向這裡並已傳播,80/443 必須可達,否則憑證籤發會失敗。修好後兩個工具都會重試。
  • 只暴露您打算暴露的東西。 讓應用綁定在 127.0.0.1,這樣它只能透過代理存取,而不能直連。
  • HTTPS 需要網域,而非裸 IP——Let's Encrypt 為名稱簽發。

下一步

反向代理正是讓一台機器提供許多服務的關鍵——見在一個 IP 後面自託管多個服務。把應用跑在容器裡?先看如何安裝 Docker。要讓應用本身在重新啟動和崩潰後依然存活,見如何建立 systemd 服務。

如何把網域解析到您的 VPS(A、AAAA 和 www) →

常見問題

什麼是反向代理,我為什麼需要它?

您的應用通常監聽像 127.0.0.1:3000 這樣的本機埠。反向代理站在前面的 80/443 埠,終結 HTTPS,並把請求轉發到那個本機埠。它給您一個乾淨的網域、一張有效的 TLS 憑證,以及在一個 IP 後面執行多個應用的能力——這些都無需應用自己去處理。

nginx 還是 Caddy——該選哪個?

Caddy 最省事:它自動取得並續期 Let's Encrypt 憑證,一個能用的 HTTPS 代理只需一行設定。nginx 更廣為人知也更靈活,但 TLS 需要您加上 Certbot。只想少折騰地拿到 HTTPS,就用 Caddy;已經熟悉 nginx 或需要它的功能,就用 nginx。

我需要網域嗎?

要拿到受信任的 HTTPS 憑證,需要——Let's Encrypt 為網域而非裸 IP 簽發憑證。把一條 A 記錄指向您伺服器的 IP,等待 DNS 傳播,代理就能為該名稱取得憑證。

需要開放哪些埠?

對內的 80 和 443。埠 80 用於最初的憑證驗證並重定向到 HTTPS;443 提供加密流量。在防火牆裡把兩者都開啟(見 UFW 指南),並確保沒有別的東西已經佔用它們。

憑證籤發為什麼會失敗?

幾乎總是 DNS 或埠。網域的 A 記錄必須指向這台伺服器並已傳播,埠 80/443 必須可達(防火牆裡開放、上游未被攔截)。修好這兩點,簽發就成功;Caddy 和 Certbot 都會重試。

評論

目前還沒有評論。歡迎成為第一位。

發表評論

評論在顯示前會經過審核。