无域名时如何在本地NGINX上通过HTTPS运行Django应用
无域名(本地IP)下启用HTTPS的实现方案
一、生成自签名SSL证书
没有域名的情况下,只能用自签名证书(浏览器会提示不安全,但完全满足本地开发测试需求),用openssl工具生成:
- 生成证书和私钥:
执行命令后会提示填写信息,Common Name(通用名称)必须填你的本地IP(比如openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt192.168.3.10),其他信息可以随便填。 - 生成Diffie-Hellman组增强安全性:
这个命令会跑一会儿,耐心等待即可。openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
二、修改Nginx配置启用SSL
找到你的Django项目对应的Nginx配置文件(一般在/etc/nginx/sites-available/目录下,比如my_django_app),替换成下面的配置:
server { listen 443 ssl; server_name 192.168.3.10; # 替换成你的本地IP # 指定证书路径 ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; ssl_dhparam /etc/ssl/certs/dhparam.pem; # 基础SSL安全配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 静态文件和图标处理 location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /home/your_user/your_django_project; # 替换成你的Django项目根目录 } # 转发请求给Gunicorn location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; # 如果Gunicorn用端口监听,就改成http://127.0.0.1:8000 } } # 可选:把HTTP请求自动跳转到HTTPS server { listen 80; server_name 192.168.3.10; return 301 https://$server_name$request_uri; }
- 测试配置是否合法:
sudo nginx -t,输出test is successful就没问题 - 重启Nginx生效:
sudo systemctl restart nginx
三、调整Django配置适配HTTPS
打开项目的settings.py,修改以下几项:
# 强制所有请求跳转到HTTPS SECURE_SSL_REDIRECT = True # 确保Cookie仅通过HTTPS传输 SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True # 允许本地IP访问 ALLOWED_HOSTS = ['192.168.3.10', 'localhost']
- 重启Gunicorn:
sudo systemctl restart gunicorn
四、验证效果
打开浏览器输入https://你的本地IP,会弹出“证书不安全”的提示(这是自签名证书的正常现象),选择「高级」→「继续访问」,就能看到你的Django应用通过HTTPS加载了。
内容的提问来源于stack exchange,提问作者Sacco Giacomo
相关产品推荐
相关产品推荐

