Django API通过HTTP访问正常HTTPS访问失败问题求助
故障原因分析及解决方案
核心根本原因
你当前部署的Django服务全程只开启了HTTP协议支持,没有任何HTTPS相关配置,自然无法响应HTTPS请求,结合你给出的配置,还有以下几个配置冲突/错误点:
- 启动命令&端口冲突:Dockerfile中默认启动命令是gunicorn监听8888端口,但docker-compose配置里的
command字段直接覆盖了默认启动命令,改成了Django开发服务器runserver监听8000端口,同时端口映射只开放了8000端口。如果你是用docker-compose启动服务,那你访问8888端口本身就不会命中docker-compose启动的容器,你测试到的8888端口HTTP可访问,说明你大概率是单独启动了Dockerfile构建的容器,没有使用docker-compose配置。 - 服务本身不支持HTTPS:
- Django自带的
runserver是开发调试用服务器,本身就不支持HTTPS协议,也不能用于生产环境。 - 你Dockerfile中默认用的gunicorn默认也只跑HTTP服务,需要额外配置SSL证书参数才能开启HTTPS支持。
- Django自带的
修复方案
方案1:gunicorn直接配置HTTPS(适合小规模部署)
- 提前申请好对应访问地址的SSL证书(pem/crt格式证书文件 + key格式私钥文件),放到项目目录下
- 修改Dockerfile中的CMD启动命令,添加SSL相关参数:
CMD gunicorn Documents_management_back.wsgi:application --bind 0.0.0.0:$PORT --certfile=你的证书文件路径 --keyfile=你的私钥文件路径
- 注意如果直接用IP访问HTTPS的话,需要证书颁发机构支持IP证书,普通域名证书访问IP时会报证书不安全错误。
方案2:增加Nginx反向代理处理HTTPS(推荐生产环境使用)
在docker-compose中新增Nginx服务,由Nginx监听443/8888端口的HTTPS请求,配置好SSL证书后,转发请求给后端的Django服务(后端保持HTTP即可),这种方式更易维护,性能也更好。
额外建议
生产环境不要使用Django自带的runserver启动服务,性能差且安全性低,直接用Dockerfile默认的gunicorn启动即可,删除docker-compose中多余的command字段,端口映射改成和Dockerfile的8888端口对齐,避免端口混淆。
内容的提问来源于stack exchange,提问作者Math
相关产品推荐
相关产品推荐

