Docker部署Django项目wsgi.url_scheme为http及Nginx与Gunicorn通信疑问
问题1:Django中wsgi.url_scheme值为http的解决方法
核心原因是Django默认不会信任代理传递的X-Forwarded-Proto头,需要手动配置信任规则:
- 打开Django项目的settings.py文件,添加以下配置:
# 信任前端代理传递的https标识头 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 启用代理传递的Host头 USE_X_FORWARDED_HOST = True # 关闭Django自带的SSL跳转,SSL逻辑已经由Apache处理 SECURE_SSL_REDIRECT = False
- 可选修正nginx配置的语法错误:你原有nginx配置里的
proxy_set_header X-Forwarded-Ssl=on;写法错误,等号要换成空格,改为proxy_set_header X-Forwarded-Ssl on;,不过只要配置了上面的Django参数,仅靠X-Forwarded-Proto头就可以正常识别https协议。 - 重启Django服务即可看到wsgi.url_scheme变为https。
问题2:简化nginx配置后依然能正常运行的原因
你看到的简化后配置生效是假象,本质原因是你修改的本地nginx配置没有同步到容器内:
- 查看你的docker-compose.yml配置,project-nginx服务没有挂载本地nginx配置文件到容器内的对应目录,你在本地修改app.conf之后,既没有重新构建nginx镜像,也没有把本地配置挂载进容器,容器内运行的还是最初构建镜像时打包进去的、带
upstream project { server project-python:5000; }块的完整配置,所以服务可以正常运行。 - 如果你想让本地修改的nginx配置实时生效,需要给project-nginx服务添加volumes配置,把本地存放nginx配置的目录挂载到容器的
/etc/nginx/conf.d/路径下,之后修改本地配置后重启nginx容器即可生效。如果此时你再删除upstream块,nginx就会找不到project对应的上游服务,直接报错。
内容的提问来源于stack exchange,提问作者Diego Armando Maradona
相关产品推荐
相关产品推荐

