Nginx 404 Not Found错误排查与解决
Nginx 作为高性能 Web 服务器和反向代理服务器,被广泛应用于网站部署、接口服务以及负载均衡场景。在实际使用过程中,404 Not Found 是最常见的问题之一。很多开发者在访问网站、调用接口或部署项目时,会遇到浏览器返回 “404 Not Found” 页面,但服务器并没有明显报错。
Nginx 返回 404 并不一定代表服务完全不可用,它通常意味着请求已经到达 Nginx,但 Nginx 没有找到对应的资源或无法将请求转发到正确的位置。造成这一问题的原因很多,包括配置错误、文件路径异常、location 匹配问题、反向代理配置错误以及权限设置等。
本文将系统分析 Nginx 404 Not Found 错误的常见原因,并提供详细排查方法和解决方案。
一、理解 Nginx 404 Not Found错误产生机制
当用户访问一个 URL 时,请求会经过以下流程:
客户端发送 HTTP 请求;
Nginx 接收请求;
根据 server 配置匹配对应站点;
根据 location 规则匹配请求路径;
查找静态文件或者转发请求到后端服务;
返回响应结果。
如果在其中某一步无法找到对应资源,Nginx 就可能返回 404。
例如:
访问:
https://example.com/index.htmlNginx 根据配置:
server {
listen 80;
server_name example.com;
root /usr/share/nginx/html;
}会尝试查找:
/usr/share/nginx/html/index.html如果文件不存在,就会返回:
404 Not Found因此,解决 Nginx 404 问题的关键是确认:
请求是否进入正确的 server;
location 是否匹配正确;
文件路径是否存在;
后端服务是否正常响应。
二、检查 Nginx 配置文件是否正确
Nginx 配置错误是导致 404 的主要原因之一。
首先检查当前生效配置:
nginx -t正常情况下会显示:
syntax is ok
test is successful如果配置存在问题,需要先修复配置错误。
查看完整配置:
nginx -T通过该命令可以确认 Nginx 当前加载的是哪个配置文件,以及实际生效的 server 和 location。
常见错误包括:
1. root路径配置错误
例如:
server {
listen 80;
server_name test.com;
root /var/www/html/project;
}但实际项目文件位于:
/var/www/project访问:
http://test.com/index.htmlNginx 会查找:
/var/www/html/project/index.html自然返回404。
解决方法:
修改 root:
root /var/www/project;然后重新加载:
nginx -s reload2. index配置缺失
如果访问:
http://example.com/Nginx 会根据 index 指令寻找默认首页。
例如:
index index.html index.htm;如果目录中不存在这些文件,也可能出现404。
检查目录:
ls -al /usr/share/nginx/html确认首页文件是否存在。
三、排查location匹配问题
Nginx 的 location 匹配规则非常容易导致404。
例如:
location /app/ {
root /data/www;
}访问:
http://example.com/app/index.htmlNginx 实际查找:
/data/www/app/index.html如果真实目录结构是:
/data/www/index.html就会失败。
这种情况下应该使用:
location /app/ {
alias /data/www/;
}区别:
root:
请求路径会拼接到root后面alias:
直接替换location匹配路径在静态资源映射场景中,alias 更容易符合预期。
四、检查反向代理配置导致的404
很多项目使用 Nginx 作为反向代理,例如:
用户
|
Nginx
|
Spring Boot / Node.js / Python服务配置:
location /api/ {
proxy_pass http://127.0.0.1:8080;
}如果访问:
/api/user但后端实际接口是:
/user可能导致后端返回404。
需要注意 proxy_pass 尾部 / 的区别。
例如:
配置:
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}请求:
/api/user转发:
http://127.0.0.1:8080/user而:
location /api/ {
proxy_pass http://127.0.0.1:8080;
}请求:
/api/user转发:
http://127.0.0.1:8080/api/user路径变化可能导致后端接口不存在,从而返回404。
五、查看Nginx访问日志和错误日志
日志是排查404最快的方法。
默认访问日志:
/var/log/nginx/access.log错误日志:
/var/log/nginx/error.log查看最近请求:
tail -f /var/log/nginx/access.log可能看到:
GET /test.html HTTP/1.1
404错误日志:
tail -f /var/log/nginx/error.log例如:
open() "/usr/share/nginx/html/test.html" failed说明 Nginx 正在寻找文件:
/usr/share/nginx/html/test.html但文件不存在。
根据日志中的真实路径检查即可快速定位问题。
六、检查静态文件是否存在
如果 Nginx 用于部署 Vue、React 等前端项目,404问题非常常见。
例如:
server {
listen 80;
root /opt/web/dist;
}检查:
ls /opt/web/dist确认是否包含:
index.html
assets/
js/
css/如果目录为空或者部署路径错误,需要重新上传前端文件。
七、解决Vue、React单页面应用刷新404问题
SPA应用使用前端路由时,经常出现:
首页正常:
example.com但是刷新:
example.com/user/profile出现404。
原因:
Nginx 默认认为:
/user/profile对应一个真实文件。
但实际上这是前端路由。
解决方式:
增加:
location / {
try_files $uri $uri/ /index.html;
}含义:
如果文件存在,直接返回;
如果目录存在,访问目录;
否则返回 index.html。
然后由前端路由处理页面。
八、检查server_name匹配错误
多个站点共用一个 Nginx 时,server_name 配置错误也会导致404。
例如:
server {
listen 80;
server_name aaa.com;