Docker Compose部署Django-React应用web容器未运行报502错误
排查步骤
- 优先查看web容器运行日志定位崩溃原因
运行以下命令获取website容器的启动/运行日志,直接定位容器启动失败或抛出错误的具体原因:
docker logs -f website
- 修正ALLOWED_HOSTS配置
Django的ALLOWED_HOSTS需要匹配所有请求访问时的Host头值,你需要在配置中同时加入以下内容:
- 你的DigitalOcean Droplet公网IP
- docker-compose内部的web服务名
web(nginx容器通过该服务名访问web容器) - 本地调试用的
localhost、127.0.0.1
参考settings.py配置示例:
import os # 按空格拆分环境变量传入的允许域名 ALLOWED_HOSTS = os.getenv("DJANGO_ALLOWED_HOSTS", "localhost 127.0.0.1 web").split()
对应.env文件配置示例(替换为你的实际公网IP):
DJANGO_ALLOWED_HOSTS=192.168.1.1 localhost 127.0.0.1 web
- 检查Nginx反向代理配置
你的Nginx配置中转发到Django服务的规则必须使用docker内部服务名,不能用127.0.0.1,否则Nginx会访问自身容器的8000端口导致连通失败:
location / { # 注意这里的地址是web:8000,对应docker-compose中web服务的名称和端口 proxy_pass http://web:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
- 排查500错误问题
当ALLOWED_HOSTS仅配置localhost、127.0.0.1时返回500,常见原因如下:
- Nginx转发请求时携带的Host头是公网IP,不在ALLOWED_HOSTS列表中,Django直接抛出异常
- 生产环境关闭DEBUG后未正确配置静态资源路径、跨域规则或数据库连接
- 镜像构建时缺失Python依赖包,运行时触发导入错误
可临时开启DEBUG模式(调试完成后必须关闭)查看具体报错信息,或查看Django运行日志定位问题。
- 验证容器间网络连通性
如果以上配置均正确仍返回502,可进入Nginx容器测试到web容器的连通性:
docker exec -it nginx ping web
如果无法ping通,说明docker内部网络异常,可重启docker服务后重新执行docker-compose up -d重建容器。
内容的提问来源于stack exchange,提问作者Joseph Adam
相关产品推荐
相关产品推荐

