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

Kubernetes集群Nginx代理ClusterIP服务访问/api返回404问题咨询

问题排查与修复

你的配置存在4处明确问题,会直接或间接导致访问LOAD_BALANCER_IP/api返回404:

  • Nginx反向代理的后端服务名配置错误。集群内Service通过服务名做DNS解析,你创建的后端ClusterIP Service名称为league-pool-production-server-service,但Nginx配置中proxy_pass写的是http://league-pool-server,该域名在集群内不存在,会导致Nginx无法连接后端;如果你的Nginx配置未正确加载(比如配置文件放错路径),所有请求会直接匹配静态文件规则,找不到对应文件就返回404。
  • Nginx路径转发规则错误。当前location /api规则搭配不带末尾斜杠的proxy_pass地址,会把/api前缀完整带给后端服务,比如请求/api/users会被转发为http://后端服务/api/users,如果你的后端API服务路由没有配置/api前缀,会直接返回404。
  • LoadBalancer Service配置了externalTrafficPolicy: Local,该模式下流量只会转发到当前节点上运行的Nginx Pod,如果负载均衡把流量打到没有运行Nginx Pod的节点,请求会直接被丢弃,会出现间歇性404或连接超时。
  • Nginx Deployment初始副本数与HPA配置冲突。Deployment中写死replicas: 1,但HPA配置最小副本数为2,两者同时存在会导致副本数被反复调整,可能出现部分节点无Nginx Pod的情况。

修复步骤

1. 修正Nginx站点配置

替换原有Nginx配置,修正服务名、路径转发规则,补充必要的代理头,同时兼容无斜杠的/api访问:

server {
  listen 80;
  
  root /usr/share/nginx/html;

  location / {
    try_files $uri $uri/ =404;
  }

  location /api/ {
    # 末尾加斜杠,自动剥离/api前缀后转发到后端
    proxy_pass http://league-pool-production-server-service/;
    proxy_set_header Host $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;
  }

  # 兼容访问/api不带末尾斜杠的场景,自动重定向
  location = /api {
    return 301 /api/;
  }
}

注意:重新构建Nginx镜像时,确认配置文件被放到Nginx的有效配置目录(通常为/etc/nginx/conf.d/),可以进Pod执行nginx -T查看已加载的完整配置,确认/api规则存在,避免配置不生效。

2. 修正Nginx Service配置

如果没有特殊的获取客户端真实IP需求,删除externalTrafficPolicy: Local配置,使用默认的Cluster流量转发模式,避免流量丢失:

apiVersion: v1
kind: Service
metadata:
  name: league-pool-nginx-service
spec:
  type: LoadBalancer
  selector:
    app: league-pool-nginx-production
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
    - name: https
      protocol: TCP
      port: 443
      targetPort: 443

3. 修正Nginx Deployment配置

删除Deployment中写死的replicas字段,副本数完全交给HPA管理,避免配置冲突:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: league-pool-nginx-deployment
  labels:
    app: league-pool-nginx-production
spec:
  selector:
    matchLabels:
      app: league-pool-nginx-production
  template:
    metadata:
      labels:
        app: league-pool-nginx-production
    spec:
      containers:
      - name: league-pool-nginx-production
        image: helloitsian/league-pool-nginx
        imagePullPolicy: Always
        resources:
          limits:
            cpu: 300m
          requests:
            cpu: 100m
            memory: 200Mi
        ports:
          - containerPort: 443
          - containerPort: 80

验证流程

配置更新完成后按顺序验证:

  1. 进入任意Nginx Pod,执行curl http://league-pool-production-server-service(替换为后端实际存在的测试路径),确认能正常连通后端服务,排除集群网络问题。
  2. 在Nginx Pod内执行curl localhost/api/测试路径,确认接口正常返回,排除Nginx配置问题。
  3. 通过LoadBalancer IP访问对外接口,验证服务正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:15:31