自己的问题,捣鼓了半天
- 访问:http://ip:端口/nacos
- 我之前这里没有加nacos 导致404,真的是醉了,希望后面的人少踩些坑
其他可能的原因
一、路径与前缀类问题
1. 反向代理把 /nacos
前缀“丢”了
-
症状:
http://域名/nacos
返回 404;直接打容器http://宿主IP:8848/nacos
正常。 -
定位
# 检查是否少了尾斜杠 location /nacos { # 容易丢前缀 proxy_pass http://127.0.0.1:8848; # 与上面组合会拼成 /,静态资源404 }
-
修复(两种都行)
# 保留前缀(推荐) location /nacos/ { proxy_pass http://127.0.0.1:8848; } # 或去前缀 location / { proxy_pass http://127.0.0.1:8848; sub_filter '/nacos/' '/'; # 如确需移除,注意静态资源路径 sub_filter_once off; }
2. 缺少尾斜杠导致静态资源 404
-
症状:
/nacos
能打开 HTML,但app.js
、index.css
等 404,页面空白。 -
修复:访问统一用
/nacos/
;Nginx 里加 301:location = /nacos { return 301 /nacos/; }
3.大小写/路径拼写不一致
- 症状:
/Nacos
、/NACOS
404(路径区分大小写)。 - 修复:统一使用小写
/nacos/
。
4.K8s Ingress 未做重写
-
症状:
http://域名/nacos
404;NodePort:8848/nacos
正常。 -
修复示例(NGINX Ingress)
metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - http: paths: - path: /nacos(/|$)(.*) pathType: Prefix backend: service: name: nacos port: number: 8848
上面把前缀
/nacos
去掉后转发到 8848,保持资源路径正确。
二、端口与映射类问题
1. 端口映射错位/被占用
-
症状:你以为连到 Nacos,其实命中了别的服务返回 404。
-
自检
docker ps --format 'table {{.Names}}\t{{.Ports}}' sudo lsof -i :8848 curl -I http://127.0.0.1:8848/nacos/
-
修复:确认是
-p 8848:8848
,避免与其他容器或宿主服务冲突。
2. 搞混 2.x 的 gRPC 端口
- 提示:2.x 常见
9848
为 RPC 端口,不是控制台端口。控制台仍在8848
。
三、服务启动与上下文配置
1. 应用尚未启动完成
-
症状:刚启动访问 404,过一会儿正常。
-
自检
docker logs -f nacos | egrep -i 'Started|Tomcat|port|context' # 看到类似:Tomcat started on port(s): 8848 (http) with context path '/nacos'
2. 上下文路径被改掉了
-
症状:
/nacos
404,但日志显示context path '/'
或者/console
等。 -
原因:设置了
SERVER_SERVLET_CONTEXT_PATH
或配置文件里改了server.servlet.context-path
。 -
修复:统一期望
# 默认(控制台在 /nacos) -e SERVER_SERVLET_CONTEXT_PATH=/nacos # 若你要放根路径(/),反向代理与静态资源路径都要跟着调 -e SERVER_SERVLET_CONTEXT_PATH=/
3. 静态资源路径被自定义覆盖
- 症状:HTML 打开但静态资源全 404。
- 排查:是否设置了
SPRING_WEB_RESOURCES_STATIC_LOCATIONS
、自改了资源目录或挂载覆盖了/home/nacos/.../static
。 - 修复:去掉该环境变量/挂载;或把静态资源放回默认路径。
四、代理/安全相关
1. 鉴权/登录跳转被代理“吃掉”
-
症状:控制台首页 404 或白屏;网络面板有 302/401。
-
原因:Nginx/网关拦截或剥离了
Set-Cookie
/Location
。 -
修复
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_cookie_path / /; # 保留 Cookie 路径
2. HTTPS/HTTP 混用导致资源加载失败
- 症状:页面加载一半、控制台报 Mixed Content,或静态资源“看起来像 404”。
- 修复:前后端协议统一;HTTPS 反代时补齐
X-Forwarded-Proto https
。
3. 跨域预检被 404(走了错误的 location)
-
症状:接口 OPTIONS 404,页面功能不可用。
-
修复(反代层放行 OPTIONS)
if ($request_method = OPTIONS) { return 204; }
五、容器镜像与挂载
1. 挂载把应用目录盖没了
-
症状:容器里
/home/nacos/.../static
空了,导致 404。 -
自检
docker exec -it nacos sh -lc 'ls -l /home/nacos'
-
修复:避免对应用安装目录做“目录级”挂载;需要持久化请挂数据目录或外部数据库。
2. 镜像/版本不一致
- 症状:升级后 404;回滚正常。
- 修复:对齐镜像与配置;查看 Release Note 是否有路径/端口变更;优先使用官方镜像。
六、网关/路由命中错误实例
Nginx:保留前缀正确写法
location /nacos/ {
proxy_pass http://127.0.0.1:8848; # 注意:有斜杠
proxy_set_header Host $host;
}
location = /nacos { return 301 /nacos/; } # 统一加尾斜杠
Nginx:去前缀的写法(谨慎)
location /nacos/ {
proxy_pass http://127.0.0.1:8848/; # 末尾也要斜杠,表示“丢前缀”
}
K8s NGINX Ingress:带重写
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
paths:
- path: /nacos(/|$)(.*)
pathType: Prefix
如果这篇文章对你有帮助,麻烦点个赞哦!