Redis通过Traefik代理出现ERR unknown command `PROXY`错误求助
解决Traefik代理Redis时出现的
ERR unknown command PROXY及响应顺序异常问题 问题根源分析
- Proxy Protocol不兼容:你的Traefik IngressRouteTCP配置里开启了
proxyProtocol: version:1,但Redis默认未启用Proxy Protocol支持。Traefik会在建立连接后向Redis发送PROXY协议头,而Redis将其识别为无效的Redis命令,因此抛出ERR unknown command PROXY错误。 - 错误使用HTTP中间件处理TCP流量:
stripPrefix是HTTP专属中间件,无法用于TCP路由(IngressRouteTCP),这会导致Traefik对TCP流量的处理逻辑混乱,进而引发响应顺序异常。
修复步骤
1. 移除TCP路由中的HTTP中间件
编辑ingress-redis-service的IngressRouteTCP配置,删除middlewares部分——TCP流量不需要HTTP的路径前缀处理:
apiVersion: traefik.containo.us/v1alpha1 kind: IngressRouteTCP metadata: name: ingress-redis-service spec: entryPoints: - websecure routes: - match: HostSNI(`*`) priority: 10 # 移除不适用的HTTP中间件配置 services: - name: redis-service port: 6379 weight: 10 terminationDelay: 400 proxyProtocol: version: 1
2. 适配Proxy Protocol配置(二选一)
方案A:保留Proxy Protocol并配置Redis支持
如果需要传递客户端真实IP,修改Redis Deployment配置,添加启动参数开启Proxy Protocol,并指定允许的代理IP段(生产环境建议限定为Traefik集群IP):
apiVersion: apps/v1 kind: Deployment metadata: name: redis labels: app: redis spec: replicas: 1 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redistimeseries:1.4.10 securityContext: runAsUser: 101 ports: - containerPort: 6379 # 添加Redis启动参数开启Proxy Protocol args: - --proxy-protocol - --proxy-protocol-allowlist 0.0.0.0/0 # 生产环境替换为Traefik的IP段 resources: requests: cpu: 0.3 memory: 2000Mi limits: cpu: 0.5 memory: 3000Mi volumeMounts: - mountPath: /data name: redis volumes: - name: redis persistentVolumeClaim: claimName: pvc-gluster-redis
方案B:关闭Traefik的Proxy Protocol
如果不需要传递客户端IP,直接移除Traefik中的proxyProtocol配置即可:
# 修改IngressRouteTCP的services部分 services: - name: redis-service port: 6379 weight: 10 terminationDelay: 400 # 移除Proxy Protocol配置
3. 验证修复
应用修改后的配置:
kubectl apply -f redis-deployment.yaml kubectl apply -f ingress-redis-service.yaml
重新用redis-cli连接测试:
.\redis-cli.exe -h my-traefik-ip -p 443 my-traefik-ip :443> PING PONG
此时PROXY命令错误会消失,响应顺序也恢复正常。
内容的提问来源于stack exchange,提问作者devopsmaster
相关产品推荐
相关产品推荐

