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

Nginx Ingress配置rewrite-target时如何兼容子路径下socket.io websocket请求

解决方案

核心问题

你当前配置的错误来自两点:

  1. Ingress注解nginx.ingress.kubernetes.io/rewrite-target对当前Ingress下所有路径规则全局生效,你现有全局规则会将/testing/socket.io/xxx重写为/xxx,丢失了socket.io路径前缀,无法匹配后端服务的websocket路由
  2. 缺少socket.io长连接必需的协议升级、超时配置,即使路径重写正确也会出现连接断开的问题

方案1:拆分Ingress资源(推荐,可读性高,易维护)

拆分两个独立Ingress分别处理普通HTTP请求和socket.io请求,各自配置独立的重写规则:

普通请求Ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-server-common
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
      - path: /testing(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: my-server
            port:
              number: 5000

Socket.io请求Ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-server-socketio
  annotations:
    kubernetes.io/ingress.class: nginx
    # 重写时保留socket.io前缀
    nginx.ingress.kubernetes.io/rewrite-target: /socket.io/$2
    # 长连接必需配置
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
    nginx.ingress.kubernetes.io/upgrade: "websocket"
    nginx.ingress.kubernetes.io/connection-upgrade: '$http_upgrade'
spec:
  rules:
  - http:
      paths:
      - path: /testing/socket.io(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: my-server
            port:
              number: 5000

规则说明:

  • (/|$)用于匹配路径分隔符或路径结束,避免/testingabc这类非目标路径被误匹配
  • (.*)捕获后续所有路径片段,供rewrite-target引用

方案2:单Ingress自定义重写规则

如果不想拆分资源,可通过configuration-snippet注解自定义重写逻辑,替代全局rewrite-target:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-server
  annotations:
    kubernetes.io/ingress.class: nginx
    # 长连接配置
    nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
    nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
    nginx.ingress.kubernetes.io/upgrade: "websocket"
    nginx.ingress.kubernetes.io/connection-upgrade: '$http_upgrade'
    # 自定义重写规则
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^/testing(/|$)(.*)$ /$2 break;
      rewrite ^/testing/socket.io(/|$)(.*)$ /socket.io/$2 break;
spec:
  rules:
  - http:
      paths:
      - path: /testing
        pathType: Prefix
        backend:
          service:
            name: my-server
            port:
              number: 5000

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:57:03