Select Page

如何用 Nginx 反向代理 SSL 的網站

在從網路上取得網頁時,如果想用 Nginx 作為反向代理器來連線一個介由 Cloudflare 保護且介面是 HTTPS 的網站,你可能會遇到一些繁複的錯誤,包括 Cloudflare Error 1001,502 Bad Gateway,或 421 Misdirected Request 等,這邊就分享一下我遇到的經驗以及如何正確設定 Nginx,反向代理一個有 SSL 保護的網站。

環境概要

  • Nginx 作為前端 proxyshop.example.com
  • Upstream 目標https://target.example.com(Cloudflare 網站)
  • Cloudflare 用於 DNS + CDN + WAF

1. Nginx 基礎設定

幾個重點

1.1 要聽 443 port

1.2 要設定 proxy_ssl_name, proxy_ssl_server_name

1.3 DNS 要設定 resolver

upstream secure_pool {
    server target.example.com:443;
    keepalive 16;
}

server {
    listen 443 ssl;
    server_name shop.example.com;

    ssl_certificate /etc/letsencrypt/live/shop.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/shop.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    resolver 1.1.1.1 8.8.8.8 valid=300s;

    location / {
        proxy_pass https://secure_pool;
        proxy_ssl_server_name on;
        proxy_ssl_name target.example.com;
        proxy_set_header Host target.example.com;
        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;
        proxy_set_header User-Agent "Mozilla/5.0 (compatible; Nginx Proxy)";
    }
}

2. 常見錯誤與解決方案

❌ Error 1001 – DNS Resolution Error (Cloudflare)

  • 原因:Cloudflare 無法解析 upstream hostname
  • 解決:確保 Nginx 加入 resolver 設定

❌ 502 Bad Gateway

  • 原因:upstream HTTPS 連線失敗
  • 解決:
    • proxy_pass 設為 https://...
    • proxy_ssl_server_name on;
    • 加入 proxy_ssl_name + Host 不要用 $host

❌ 421 Misdirected Request

  • 原因:SNI 與 Host header 不符
  • 解決:
    • proxy_ssl_name target.example.com;
    • proxy_set_header Host target.example.com;

3. Debug 技巧

看 error log 解答還原:

用 curl 測試 upstream 是否支援 HTTPS

4. 結論

要用 Nginx 來反向代理一個 SSL 網站,最重要的是使 Nginx 能「知道」你的 upstream 是 HTTPS,且 TLS SNI 與 Host 項目必須一致。