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

如何为Nginx Ingress配置带通配符子域名的上游虚拟主机

基于Ingress-Nginx实现通配符域名到对应上游服务的代理

方案一:通配符自动映射(动态匹配)

通过Ingress-Nginx的server-snippet注解,利用Nginx变量和正则表达式实现下游域名到上游域名的动态替换,无需为每个域名单独配置Ingress。

步骤1:创建Dummy Service

Ingress要求必须指定后端服务,因此需要创建一个占位用的ClusterIP Service:

apiVersion: v1
kind: Service
metadata:
  name: dummy-proxy-service
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80

步骤2:创建通配符Ingress

这个Ingress会匹配所有*.downstream.example.com请求,并自动将其路由到对应的*.upstream.example.com上游:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wildcard-downstream-proxy
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
      # 提取下游域名的前缀部分,映射到上游域名
      if ($host ~* ^(?<service_prefix>[a-z0-9-]+)\.downstream\.example\.com$) {
        set $upstream_host "${service_prefix}.upstream.example.com";
        set $upstream_target "http://${upstream_host}";
      }
      # 代理到动态生成的上游地址
      proxy_pass $upstream_target;
      # 设置正确的Host头传递给上游服务
      proxy_set_header Host $upstream_host;
    # 若上游使用HTTPS,替换为https://并添加以下注解
    # nginx.ingress.kubernetes.io/proxy-ssl-verify: "false"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  ingressClassName: nginx
  rules:
  - host: "*.downstream.example.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: dummy-proxy-service
            port:
              number: 80

注意事项

  • 正则表达式需匹配你的域名格式,确保能正确提取前缀(示例仅匹配小写字母、数字和连字符)
  • 若上游服务启用HTTPS,需将$upstream_target改为https://${upstream_host},并根据需求配置SSL验证
  • 确保Ingress-Nginx控制器允许使用server-snippet注解(默认开启,若有安全限制需调整控制器配置)

方案二:单个域名单独配置Ingress(兼容原有upstream-vhost用法)

如果动态配置方案不可行,可直接为每个下游域名创建独立Ingress对象,这种方式更直观,便于调试和权限管控。

示例:为httpbin.downstream.example.com创建Ingress

  1. 先创建指向上游服务的ExternalName Service:
apiVersion: v1
kind: Service
metadata:
  name: httpbin-upstream
spec:
  type: ExternalName
  externalName: httpbin.upstream.example.com
  1. 对应的Ingress配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: httpbin-downstream-proxy
  annotations:
    nginx.ingress.kubernetes.io/upstream-vhost: "httpbin.upstream.example.com"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  ingressClassName: nginx
  rules:
  - host: "httpbin.downstream.example.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: httpbin-upstream
            port:
              number: 80

重复上述步骤,为httpbin2.downstream.example.com等其他域名创建对应的Service和Ingress即可。

方案选择建议

  • 当需要频繁新增下游域名时,优先选择通配符自动映射方案,减少重复配置
  • 若域名数量较少、需要精细化控制每个路由的配置(如SSL证书、限流规则),则使用单个Ingress方案更合适

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 20:35:18