在 Nginx 上为 Django 配置 HTTPS 需要获取 SSL 证书,修改 Nginx 监听 443 端口并加载证书文件,同时在 Django settings.py 中开启安全重定向设置。适用于生产环境部署,风险边界在于证书路径错误会导致服务不可用,防火墙未开放 443 端口会导致连接失败。
先说结论:配置核心在于 Nginx 监听与 Django 安全设置联动,确保加密传输与协议一致性。
- 适合:生产环境正式上线,涉及用户数据提交的场景。
- 先准备:域名解析生效,获取 SSL 证书文件(.crt/.pem 和.key)。
- 验收:浏览器地址栏显示锁标志,HTTP 请求自动跳转至 HTTPS。
命令速用版
Nginx 配置文件 server 块核心片段:
server {
listen 443 ssl;
server_name www.your_domain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.key;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8001;
}
}Django settings.py 安全设置片段:
SECURE_SSL_REDIRECT = True
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")为什么会这样
HTTPS 通过 TLS/SSL 加密层保护数据传输,防止密码和订单详情被窃听或篡改。Nginx 作为反向代理处理加密解密,Django 需要知道请求是通过安全协议到达的,否则可能产生重定向循环或静态文件加载错误。
分步处理
1. 获取 SSL 证书:通过云服务商(如腾讯云、阿里云)申请免费或付费证书,或通过 Let's Encrypt 生成。下载后获得证书文件和私钥文件。
2. 上传证书文件:将证书文件上传至服务器指定目录,如/etc/nginx/cert/,确保 Nginx 进程有读取权限。
3. 修改 Nginx 配置:编辑 nginx.conf 或 sites-enabled 配置,监听 443 端口,指定 ssl_certificate 和 ssl_certificate_key 路径,配置 HTTP 到 HTTPS 重定向。
4. 修改 Django 配置:在 settings.py 末尾追加安全设置,开启 SECURE_SSL_REDIRECT 和 SECURE_PROXY_SSL_HEADER。
5. 重启服务:执行 nginx -s reload 重启 Nginx,重启 Django 应用服务(如 uWSGI 或 Gunicorn)。
怎么验证是否生效
使用浏览器访问 https://域名,检查地址栏是否有安全锁标志。使用 curl -I http://域名 检查返回状态码是否为 301 或 302 跳转至 https。检查 Django 日志确认无 SSL 相关报错。
常见坑
1. 静态文件加载错误:HTTP 和 HTTPS 混合内容会导致浏览器拦截,需确保所有静态资源链接使用相对路径或强制 HTTPS。
2. 防火墙端口:云服务器安全组未开放 443 端口会导致无法访问,需在控制台放行 TCP 443。
3. 重定向循环:若 Nginx 未正确传递 X-Forwarded-Proto 头,Django 可能误判协议导致无限重定向。
常见问题
免费 SSL 证书有效期多久?
通常免费证书有效期为 3 个月至 1 年,需在过期前续期,否则浏览器会报安全警告。
配置后 HTTP 无法自动跳转 HTTPS?
检查 Nginx 是否配置了 80 端口监听及 return 301 https://$host$request_uri 规则,或 Django 是否开启了 SECURE_SSL_REDIRECT。
自签名证书可以用吗?
自签名证书仅适合测试环境,生产环境浏览器会拦截,建议使用受信任 CA 颁发的证书。
参考来源
- 如何在 Django 云服务器配置 Nginx 站点 SSL 证书 HTTPS 协议
- Django 从 0 到 1 打造完整电商平台:HTTPS 配置与域名绑定
- nginx 配置 https
- 使用 Nginx 的 HTTPS SSL - Python 12 的 Django Web 开发
- Django 云服务器配置 Nginx 站点 SSL 证书 HTTPS 协议
- Django + Nginx https 部署实战 (第二辑)
- Django + uWSGI + Nginx + https 项目部署,并用 OpenSSL 生成 https 证书
- Django 教程:支持 HTTPS 访问及 Nginx 配置 SSL 证书
- Django Nginx+uWSGI HTTPS 部署
- 从开发到上线:Django 博客项目部署全流程 (Nginx+Gunicorn+HTTPS 实操)-CSDN 博客