You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx配置移至sites-enabled后代理失效返回404排查

问题根因

核心原因是你在server块全局配置了try_files $uri $uri/ =404;,同时所有代理规则的proxy_pass使用了变量拼接上游地址(动态上游配置),两者共同作用导致请求没有走到代理逻辑:

  • Nginx处理请求时,如果proxy_pass是写死的静态地址(无变量),会直接执行代理转发,不会继承server块级别的try_files规则
  • 如果proxy_pass携带变量(你的配置里用了$skill_matrix_app、$skill_matrix_app_port两个自定义变量),Nginx会优先继承执行server块定义的try_files规则,先检查本地root目录/usr/share/nginx/html下是否存在请求对应的文件、目录,找不到就直接返回404,根本不会触发代理转发。
    从你的错误日志看,Nginx确实在尝试读取本地/usr/share/nginx/html/app/index.html文件,完全符合这个逻辑。

另外可以顺手排查下/etc/nginx/sites-enabled/目录下是否有其他遗留配置(比如默认的default软链接、编辑产生的备份文件),Nginx加载通配符匹配的配置文件时按ASCII字典序排序,如果有更早加载的80端口default_server会优先匹配,但你的日志里明确显示server: localhost,说明请求已经匹配到了你写的server块,这个可能性基本可以排除。
至于之前把server块直接写在nginx.conf里时配置正常,和配置是否拆分到sites-enabled目录没有直接关系,大概率是当时测试环境的本地目录状态、运行配置和你当前拆分后的场景有差异。

解决方法

根据你的场景(纯反向代理到K8s服务),选下面任意一种方案即可:

  • 方案一(最简便):直接删除server块中的全局try_files $uri $uri/ =404;配置,你没有需要从Nginx本地目录提供的静态文件,不需要这个规则。
  • 方案二(如果需要保留本地静态文件访问能力):把全局的try_files规则移到匹配根路径的专属location中,不要放在server块全局,避免影响更长路径的代理规则,配置示例:
server {
    listen 80 default_server;
    server_name localhost;

    root /usr/share/nginx/html;
    charset utf-8;
    index index.html;

    # 仅根路径的本地文件匹配走try_files,不影响其他代理location
    location / {
        try_files $uri $uri/ =404;
    }

    # 以下原有代理配置保持不变即可
    location /app/ {
        resolver 10.96.0.10 valid=30s;
        set $skill_matrix_app skill-matrix-app.default.svc.cluster.local;
        set $skill_matrix_app_port 8080;
        proxy_pass http://$skill_matrix_app:$skill_matrix_app_port;
        add_header Cache-Control "max-age=0 ,no-cache, no-store, must-revalidate";
    }

    # 剩下的/api/、/admin/、静态文件匹配location和之前一致
}
  • 方案三:在每一个代理location中显式定义try_files覆盖全局规则,但这种方法需要修改所有location,维护成本高,不推荐。

改完执行nginx -t检查配置语法无误后,重载Nginx即可恢复正常。

内容的提问来源于stack exchange,提问作者bubthegreat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:39:25