Django+GraphQL通过Nginx部署到AWS EC2后GraphQL接口404问题求助
第一步:定位问题层级
首先登录到你的EC2实例,执行以下命令直接测试Gunicorn服务是否能正常响应graphql请求:
curl -v --unix-socket /home/ubuntu/project/run.sock http://localhost/graphql
- 如果该请求返回200且有GraphQL相关内容,说明问题出在Nginx配置层
- 如果该请求也返回404,说明问题出在Django应用层
第二步:Django应用层问题排查(如果上述curl返回404)
- 检查APPEND_SLASH配置与URL匹配逻辑
你当前的urls.py中graphql路径没有写尾斜杠,而Django默认开启APPEND_SLASH = True,当你访问带尾斜杠的/graphql/时,本来会触发自动重定向,但你最后写的re_path(r'^.*', index)会优先匹配所有未明确匹配的路径,直接返回index页面,如果index视图没有对应处理逻辑就会返回404。
修复方案:
修改urls.py中的graphql路径,加上尾斜杠保持统一:
path('graphql/' , jwt_cookie(csrf_exempt(GraphQLView.as_view(schema=schema, graphiql=True)))),
如果需要同时兼容带/和不带/的访问,可以调整re_path的匹配规则,或者在路径中使用可选斜杠标识。
- 检查ALLOWED_HOSTS配置
确认你的Django settings.py中的ALLOWED_HOSTS已经添加了EC2的完整域名:
ALLOWED_HOSTS = ['ec2-.........compute.amazonaws.com', '127.0.0.1', 'localhost']
配置错误的话也可能导致请求被拦截返回404类错误。
- 检查视图返回逻辑
确认你的index视图没有对/graphql路径做特殊拦截处理,开启Django debug模式后访问路径可以看到具体的路由匹配过程,方便快速定位问题。
第三步:Nginx层问题排查(如果curl Gunicorn返回正常)
- 检查proxy_params配置
确认你的Nginx的proxy_params文件中包含了Host头的传递配置:
proxy_set_header Host $http_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;
如果Host头没有正确传递,Django会识别不到请求域名,导致路由匹配错误。
- 检查Nginx配置语法与重启状态
执行命令验证Nginx配置是否正确:
sudo nginx -t
确认配置无误后重启Nginx生效:
sudo systemctl restart nginx
第四步:服务状态检查
- 检查supervisor管理的Gunicorn服务状态:
sudo supervisorctl status web
如果服务状态不是RUNNING,查看gunicorn日志文件/logs/gunicorn-error.log定位启动错误。
- 检查sock文件权限:确保Nginx进程有读取
/home/ubuntu/project/run.sock的权限,权限不足也会导致请求转发失败返回404。
内容的提问来源于stack exchange,提问作者kasia
相关产品推荐
相关产品推荐

