Django运行正常但curl localhost返回404错误的原因及解决方法
问题定性
该现象不能说明Nginx运行异常,恰恰能得出两个明确结论:
- Django本身安装、项目基础配置正常:本地
runserver启动无系统检查错误,服务正常监听8000端口 - Nginx处于正常运行状态:curl请求返回的响应头明确由Nginx返回,说明Nginx在默认80端口正常接收请求,仅配置逻辑存在错误,未将请求正确转发到后端Django服务
标准排查步骤
- 验证后端服务可用性:直接请求Django监听端口,执行
curl -i localhost:8000,如果返回正常响应即可完全排除Django、gunicorn侧问题 - 核查端口监听状态:执行
ss -tulnp | grep -E '(nginx|gunicorn)',确认Nginx是否正常监听80/443端口、gunicorn/Django是否正常监听配置的服务端口 - 校验Nginx配置合法性:执行
nginx -t,先排除配置语法错误 - 排查Nginx配置逻辑问题:
- 检查
/etc/nginx/nginx.conf、/etc/nginx/sites-available/下的所有站点配置,确认server块的监听端口、server_name是否和当前请求匹配 - 检查对应server块下的location规则,确认
proxy_pass配置是否指向了正确的gunicorn/Django服务地址(IP+端口或unix socket路径) - 排查是否存在重复server_name配置:相同的server_name会导致Nginx请求匹配优先级混乱,请求被转发到默认空server块,返回404
- 检查
- 查看Nginx错误日志定位具体问题:执行
tail -f /var/log/nginx/error.log,发起请求时查看实时日志输出,可快速定位配置错误点 - 所有配置修改完成后,执行
systemctl reload nginx重载配置即可生效
本次问题解决方案
最终定位为
nginx.conf中存在两条完全相同的server_name配置,删除其中一条重复配置并重载Nginx后,服务访问恢复正常。
内容的提问来源于stack exchange,提问作者Gene9y
相关产品推荐
相关产品推荐

