如何用 Nginx 反向代理 SSL 的網站
在從網路上取得網頁時,如果想用 Nginx 作為反向代理器來連線一個介由 Cloudflare 保護且介面是 HTTPS 的網站,你可能會遇到一些繁複的錯誤,包括 Cloudflare Error 1001,502 Bad Gateway,或 421 Misdirected Request 等,這邊就分享一下我遇到的經驗以及如何正確設定 Nginx,反向代理一個有 SSL 保護的網站。
環境概要
- Nginx 作為前端 proxy :
shop.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 項目必須一致。
近期留言