Nginx Ingress配置rewrite-target时如何兼容子路径下socket.io websocket请求
解决方案
核心问题
你当前配置的错误来自两点:
- Ingress注解
nginx.ingress.kubernetes.io/rewrite-target对当前Ingress下所有路径规则全局生效,你现有全局规则会将/testing/socket.io/xxx重写为/xxx,丢失了socket.io路径前缀,无法匹配后端服务的websocket路由 - 缺少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
相关产品推荐
相关产品推荐

