AWS RHEL实例nginx反向代理Docker容器返回502错误如何解决
排查解决步骤
1. 修正容器启动与Django监听配置
docker-compose run命令默认不会加载docker-compose.yml中配置的ports端口映射规则,该命令仅用于一次性任务场景,启动后台服务请使用docker-compose up -d mod;如果坚持用run命令,需添加--service-ports参数:docker-compose run --name mod --service-ports mod- 容器内Django监听
127.0.0.1:8000无法被宿主机访问,该地址仅允许容器内部进程访问,需修改Django启动命令监听所有地址:python manage.py runserver 0.0.0.0:8000 - 验证容器状态:执行
docker ps确认mod容器处于运行状态,再执行docker exec -it mod curl 127.0.0.1:8000,确认容器内Django服务可正常返回响应
2. 验证宿主机端口连通性
在RHEL实例本地执行curl 127.0.0.1:38000,如果该请求无法正常返回Django响应,说明端口映射或Django配置异常,问题未到nginx处理环节,优先修复上述配置。
3. 修正nginx配置(可选,解决后续404问题)
当前location /mod配置会将完整的/mod/xxx路径传递给Django,若Django路由未配置/mod前缀会返回404,可修改配置自动去除前缀:
location /mod/ { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_redirect off; proxy_pass http://127.0.0.1:38000/; }
修改配置后执行nginx -t验证语法合法性,再执行nginx -s reload重载配置生效。
4. 排查RHEL系统安全限制
- 防火墙验证:可临时关闭防火墙测试
systemctl stop firewalld,如果测试恢复正常,再配置防火墙规则开放对应端口即可 - SELinux验证:RHEL默认开启SELinux会阻止nginx反向代理到本地端口,执行
getsebool httpd_can_network_connect,如果返回值为off,执行setsebool -P httpd_can_network_connect 1开启权限,该问题是RHEL环境下nginx反向代理返回502的典型诱因。
5. 日志定位
如果以上步骤均未解决问题,查看nginx错误日志定位根因,默认日志路径为/var/log/nginx/error.log。
内容的提问来源于stack exchange,提问作者G. Morris
相关产品推荐
相关产品推荐

