nginx反向代理https时证书路径错误或配置不当会导致502错误或连接重置;必须正确分离ssl_certificate(含完整证书链)与ssl_certificate_key(未加密私钥),确保权限可读,并配合x-forwarded-proto头及django的secure_proxy_ssl_header等设置,同时续期后需reload nginx,http端口须配置301跳转。

nginx反向代理时证书文件路径写错导致502或连接重置
Django本身不直接处理HTTPS,靠前端Web服务器(最常见是nginx)终止SSL。证书路径配错是最常触发502 Bad Gateway或浏览器显示“连接被重置”的原因。
-
ssl_certificate必须指向完整的证书链文件(含域名证书 + 中间证书),不是仅domain.crt;常见错误是只放了公钥,漏了ca-bundle.crt -
ssl_certificate_key必须是未加密的私钥;如果用openssl rsa -in key.pem -out key-decrypted.pem解密过,就用解密后的那个 - 路径必须是nginx worker进程有读权限的(常被忽略:用
sudo -u www-data cat /path/to/cert.pem验证) - 证书和私钥不能在同一个文件里——某些一键脚本会合并,但nginx要求严格分离
Django里SECURE_*配置不匹配Nginx转发头引发Mixed Content
当nginx把HTTPS请求以HTTP协议转给Django(即proxy_pass http://127.0.0.1:8000),Django默认不知道这是HTTPS来的,生成的URL仍是http://,导致浏览器拦截资源加载。
- 必须在nginx配置里加:
proxy_set_header X-Forwarded-Proto $scheme;(不能写死https) - Django中启用
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https'),且确保header名和值完全一致(大小写敏感) -
SECURE_SSL_REDIRECT = True只应在生产环境开;开发时关掉,否则本地runserver会无限跳转 - 如果用了CDN(如Cloudflare),
X-Forwarded-Proto可能被覆盖,此时要配合SECURE_TRUSTED_PROXIES限定可信IP段
Let’s Encrypt自动续期后Django服务中断的典型原因
certbot续期成功不代表服务立即生效——nginx不会自动重载配置,旧证书仍被持有,但新证书文件已更新,容易出现“证书过期”或“签名不匹配”告警。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 续期命令后必须显式重载nginx:
sudo systemctl reload nginx(不是restart,避免连接中断) - 检查certbot的
--deploy-hook是否配置正确;没配的话,续期完不会触发reload - 私钥权限变更(比如certbot默认设为600)可能导致nginx启动失败,用
ls -l /etc/letsencrypt/live/example.com/privkey.pem确认属主是root:root、权限600 - 测试续期流程:用
sudo certbot renew --dry-run验证整个链路
HTTP到HTTPS强制跳转在nginx里漏配return 301导致SEO降权
只配了HTTPS server块,但没关HTTP入口,搜索引擎会同时收录http://和https://两个版本,分散权重。
- 必须单独定义一个监听80端口的server块:
return 301 https://$host$request_uri; - 不要用
rewrite,它比return多一次URI解析,性能略差且易出错 - 如果Django跑在非标准端口(如8000),
$host能保留原始域名,避免跳转到https://example.com:8000 - 上线前用
curl -I http://example.com确认返回301且Location头正确
真正麻烦的不是第一次配通,而是证书更新、负载均衡器介入、多级代理时X-Forwarded-Proto被多次覆盖又没清干净——这些地方日志里往往只报“connection reset”,得一层层查header和socket状态。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










